purebasic.info

PureBasic forum
Текущее время: Вт июл 17, 2018 12:58 pm

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 5 ] 
Автор Сообщение
 Заголовок сообщения: GLSL fragment/vertex shader
СообщениеДобавлено: Вс май 27, 2012 10:21 am 
Не в сети
профессор

Зарегистрирован: Сб апр 16, 2011 8:59 am
Сообщений: 224
Благодарил (а): 4 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
много лишнего в коде, пока в стадии изучения, пока неясно, как обращаться.


Вложения:
Комментарий к файлу: пример кода
shader2.rar [13.56 KiB]
Скачиваний: 251

_________________
Захотелось мартышки любви со слоном, тут она и лопнула
Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Пн май 28, 2012 2:28 pm 
Не в сети
профессор

Зарегистрирован: Сб апр 16, 2011 8:59 am
Сообщений: 224
Благодарил (а): 4 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
привет, дневничок, теперь пришлось повозиться с доступом к uniform, почему-то CallFunctionFast не работал

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
 
Global rquad.f ;Angle For The Quad ( NEW )
;;Global Dim texture.l(3)
 
Structure v3d
  x.f
  y.f
  z.f
 EndStructure
 
IncludeFile "OpenGL.pbi"
 
Import "opengl32.lib"
  glClearDepth(depth.d) ;specifies the clear value for the depth buffer
EndImport
Import "glu32.lib"
 gluPerspective(fovy.d,aspect.d,zNear.d,zFar.d) ;sets up a perspective projection matrix
EndImport
;---------------------------------
Global pfd.PIXELFORMATDESCRIPTOR
pfd\cColorBits  = 32
pfd\cDepthBits  = 32
pfd\dwFlags     = #PFD_SUPPORT_OPENGL | #PFD_DOUBLEBUFFER
 
#width         = 800
#height        = 600
 
Global hDC = GetDC_ ( CreateWindow_("edit", 0, #WS_POPUP | #WS_VISIBLE | #WS_MAXIMIZE, 0, 0 ,#width ,#height , 0 ,0 ,0, 0 ) )
;;hDC = GetDC_ (hwnd)
rquad.f=-1.15
SetPixelFormat_ ( hDC, wglChoosePixelFormat_( hDC, @pfd), @pfd )
wglMakeCurrent_ ( hDC, wglCreateContext_(hDC) )
ShowCursor_(#False);
 
 glViewport_(0,0,#width,#height) ;Reset The Current Viewport
 glMatrixMode_(#GL_PROJECTION) ;Select The Projection Matrix
 glLoadIdentity_() ;Reset The Projection Matrix
 
 gluPerspective(45.0,Abs(#width/#height),0.1,100.0) ;Calculate The Aspect Ratio Of The Window
 
 glMatrixMode_(#GL_MODELVIEW) ;Select The Modelview Matrix
 glLoadIdentity_() ;Reset The Modelview Matrix
 
 glShadeModel_(#GL_FLAT);#GL_SMOOTH)
 glClearColor_(0.0,0.0,0.0,0.5) ;Black Background
 glClearDepth(1.0) ;Depth Buffer Setup
 glEnable_(#GL_DEPTH_TEST) ;Enables Depth Testing
 glDepthFunc_(#GL_LESS);#GL_LEQUAL) ;The Type Of Depth Testing To Do
 glHint_(#GL_PERSPECTIVE_CORRECTION_HINT,#GL_NICEST) ;Really Nice Perspective Calculations  
 
 ;wglGetProcAddress
#GL_FRAGMENT_SHADER=$8B30
#GL_VERTEX_SHADER=$8B31
 
#seol$=Chr(10)+Chr(13)
 
vertexShader.s=""
ReadFile(0, "vert.vert")
    While Eof(0) = 0
      vertexShader=vertexShader+ReadString(0)+#seol$
    Wend
CloseFile(0)
 
fragmentShader.s=""
ReadFile(0, "frag.frag")
    While Eof(0) = 0
      fragmentShader=fragmentShader+ReadString(0)+#seol$
    Wend
CloseFile(0)
 
        oglCreateProgram.l=wglGetProcAddress_("glCreateProgram");int pid = oglCreateProgram();
        Global pid.i=CallFunctionFast(oglCreateProgram)
       
        oglCreateShader.l=wglGetProcAddress_("glCreateShader")
        vsId.i = pid.i=CallFunctionFast(oglCreateShader,#GL_VERTEX_SHADER);int vsId = oglCreateShader(#GL_VERTEX_SHADER );
        fsId.i = pid.i=CallFunctionFast(oglCreateShader,#GL_FRAGMENT_SHADER);int fsId = oglCreateShader(#GL_FRAGMENT_SHADER);
       
        oglShaderSource.l=wglGetProcAddress_("glShaderSource")
        pbuff=@vertexShader
        CallFunctionFast(oglShaderSource, vsId,1,@pbuff,0);oglShaderSource( vsId, 1, &vertexShader, 0 )
        pbuff=@fragmentShader
        CallFunctionFast(oglShaderSource, fsId,1,@pbuff,0);oglShaderSource( fsId, 1, &fragmentShader, 0 );
       
        oglCompileShader.l=wglGetProcAddress_("glCompileShader")
        CallFunctionFast(oglCompileShader,vsId);oglCompileShader( vsId );
        CallFunctionFast(oglCompileShader,fsId);oglCompileShader( fsId );
       
        oglAttachShader.l=wglGetProcAddress_("glAttachShader")
        CallFunctionFast(oglAttachShader,pid,fsId);oglAttachShader( pid, fsId );
        CallFunctionFast(oglAttachShader,pid,vsId);oglAttachShader( pid, vsId );
       
        oglLinkProgram.l=wglGetProcAddress_("glLinkProgram")
        CallFunctionFast(oglLinkProgram,pid);oglLinkProgram( pid );
       
  oglUseProgram.l=wglGetProcAddress_("glUseProgram")
 ;---------------------------
  glGetUniformLocation.l=wglGetProcAddress_("glGetUniformLocation")
Repeat
  glClear_(#GL_DEPTH_BUFFER_BIT | #GL_COLOR_BUFFER_BIT);
  glLoadIdentity_() ;Reset The Current Modelview Matrix
  glTranslatef_(0,0,-6.0) ;Move Right 1.5 Units And Into The Screen 7.0
  glRotatef_(rquad,3.0,-3.0,0.0) ;Rotate The Cube On X, Y & Z
  glColor3f_(1.0,0,0)
  ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  ;CallFunctionFast(oglUseProgram,pid);oglUseProgram( pid );
  ;
  ;oglUniform4fv( oglGetUniformLocation( pid, "fpar"),  4, fparams );
  ;void glUniform4f(    GLint   location, GLfloat       v0, GLfloat     v1, GLfloat     v2, GLfloat     v3);
  ;oglGetUniformLocation( pid, "fpar") - program,name->Points to a null terminated string containing the name of the uniform variable whose location is to be queried.
 
  ;in vec4 vertex_attribute_value;
  ;
  ;glBindAttribLocation(shader_prog,0,"myVertexPos")
  ;glBindAttribLocation(shader_prog,1,"myNormal")
  ;void glBindAttribLocation(   GLuint          program, GLuint         index, const GLchar *   name);
;program  Specifies the handle of the program object in which the association is To be made.
;index  Specifies the index of the generic vertex attribute To be bound.
;name Specifies a null terminated string containing the name of the vertex shader attribute variable To which index is To be bound.
 
  glUniform1f.l=wglGetProcAddress_("glUniform1f")
  parname.s="viewport_sx";0:  viewport_sx @ 22675456,  GL_FLOAT/;1:  viewport_sy @ 22740992,  GL_FLOAT
  val1.f=1.0;640
  loc1.l=CallFunctionFast(glGetUniformLocation, pid, @parname)
 
  parname.s="viewport_sy";0:  viewport_sx @ 22675456,  GL_FLOAT/;1:  viewport_sy @ 22740992,  GL_FLOAT
  val2.f=1.0;640
  loc2.l=CallFunctionFast(glGetUniformLocation, pid, @parname)
 
  ;;;;res.l=CallFunctionFast(glUniform1f,loc1,val_)
  EnableASM
   fldz
   fstp dword [esp];val
   mov eax,[esp]
   push eax
   mov eax,loc1
   push eax;[loc1]
   mov eax, glUniform1f
   call eax
   
   fld1
   fstp dword [esp];val
   mov eax,[esp]
   push eax
   mov eax,loc2
   push eax;[loc1]
   mov eax, glUniform1f
   call eax
 
  DisableASM
;;  res.i=CallFunctionFast(wglGetProcAddress_("glUniform1f"),CallFunctionFast(wglGetProcAddress_("glGetUniformLocation"), pid, @parname),val_)
 
  #NUM_ATTRACTORS = 8
  k.i = 0;
  For i=0 To 16;#NUM_ATTRACTORS*2
         parname.s="attractors["+Str(k)+"]"
         loc_.i = CallFunctionFast(glGetUniformLocation, pid, @parname);glGetUniformLocation(program,@parname);
         vall.f=Random(100)/100
  ;;;       CallFunctionFast(glUniform1f,loc_,vall);glUniform1f(uni_attractors[k], attractors[k]);
         k=k+1
      Next i
  ;
  glRects_( -1, -1, 1, 1 );
      ;zglInitOrtho(-1,1);
  ;    glBegin_(#GL_QUADS);
   ;   glTexCoord2f_(0, 0);
    ;  glVertex2f_(-1,-1);
     ; glTexCoord2f_(1, 0);
  ;    glVertex2f_( 1,-1);
   ;   glTexCoord2f_(1, 1);
    ;  glVertex2f_( 1, 1);
     ; glTexCoord2f_(0, 1);
;      glVertex2f_(-1, 1);
 ;     glEnd_();
     CallFunctionFast(oglUseProgram,pid);oglUseProgram( pid );
  rquad=rquad-0.15
  SwapBuffers_ ( hDC );
Until ( GetAsyncKeyState_ (#VK_ESCAPE) )
 
 



в шейдере для поверки поменял:

Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#version 130
#extension GL_EXT_gpu_shader4 : enable
////// (note) need gpu_shader4 because of integer bitwise &. also see <http://developer.download.nvidia.com/opengl/specs/GL_EXT_gpu_shader4.txt>
 
const int NUM_ATTRACTORS = 8;
 
uniform float viewport_sx;
uniform float viewport_sy;
uniform float attractors[2 * NUM_ATTRACTORS];
 
out vec4 fragColor;
 
float mathSmoothStepf(float _a, float _b, float _s) {
   // this one works different from the GLSL smoothstep() function since it does not clip
   float t = _s * _s * (3.0 - 2.0 * _s);
   return (_a * (1.0 - t)) + (_b * t);
}
 
void main()
{
   float cx = (1.0 - gl_FragCoord.x/viewport_sx);
   float cy = (1.0 - gl_FragCoord.y/viewport_sy);
 
   int i = 0;
   float daccum = 0.0;
   while(i < (2*NUM_ATTRACTORS))
   {
      float dx = (cx - attractors[i]);
      float dy = (cy - attractors[i+1]);
      float d = 1.41 * sqrt(dx*dx + dy*dy);
      d = mathSmoothStepf(0.0, 1.0, d);
      daccum = (d+daccum);
      i = i + 2;
   }
   int di = (int(daccum * 155.0) & 31) < 15 ? 255 : 0;
   float df = float(di) * (1.0 / 255.0);
 
   fragColor = vec4(viewport_sx, viewport_sy, viewport_sx, 1.0);//(df, df, df, 1.0);
}
 



осталось домучать массив и доступ к элементам...

_________________
Захотелось мартышки любви со слоном, тут она и лопнула


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт май 29, 2012 7:10 am 
Не в сети
профессор

Зарегистрирован: Сб апр 16, 2011 8:59 am
Сообщений: 224
Благодарил (а): 4 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
теперь готово, хотя и изображение не то, что хотелось бы.


Вложения:
shader3.rar [16.97 KiB]
Скачиваний: 224

_________________
Захотелось мартышки любви со слоном, тут она и лопнула
Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт май 29, 2012 9:39 am 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11204
Благодарил (а): 4 раз.
Поблагодарили: 421 раз.
Падает в строке 76
Код:
1
Global pid.i=CallFunctionFast(oglCreateProgram)

Адрес функции несуществует!

_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения:
СообщениеДобавлено: Вт май 29, 2012 9:51 am 
Не в сети
профессор

Зарегистрирован: Сб апр 16, 2011 8:59 am
Сообщений: 224
Благодарил (а): 4 раз.
Поблагодарили: 0 раз.
Пункты репутации: 0
Пётр писал(а):
Падает в строке 76
Код:
1
Global pid.i=CallFunctionFast(oglCreateProgram)

Адрес функции несуществует!

проверку не включил :oops:
надо читать OpenGL® Shading Language, Second Edition
или искать способы выявления. в других исходниках после поиска функций интро просто вываливается напрочь.

_________________
Захотелось мартышки любви со слоном, тут она и лопнула


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB