% vertex shader
fid = fopen('DomeVertexShader.txt', 'r');
vertexShaderSource = fread(fid);
fclose(fid);
vertexShader = glCreateShader(GL.VERTEX_SHADER);
glShaderSource(vertexShader, vertexShaderSource);
glCompileShader(vertexShader);
% fragment shader
fid = fopen('DomeFragmentShader.txt', 'r');
fragmentShaderSource = fread(fid);
fclose(fid);
fragmentShader = glCreateShader(GL.FRAGMENT_SHADER);
glShaderSource(fragmentShader, fragmentShaderSource);
glCompileShader(fragmentShader);
% create shader program
shaderProgram = glCreateProgram;
glAttachShader(shaderProgram, vertexShader);
glAttachShader(shaderProgram, fragmentShader);
glLinkProgram(shaderProgram);
params = glGetProgramiv(shaderProgram, GL.LINK_STATUS);
[infoLength, infoLog] = glGetProgramInfoLog(shaderProgram, 512);
glUseProgram(shaderProgram);
Here is the loop where I draw triangles:
Screen('BeginOpenGL', window);
glClear;
glPushMatrix;
gluLookAt(cameraPosition(1)+(ee-0.5)*pupilaryDistance, cameraPosition(2), cameraPosition(3), fixationPosition(1), fixationPosition(2), fixationPosition(3), cameraUp(1), cameraUp(2), cameraUp(3));
% Draw floor triangles
glBindBuffer(GL.ARRAY_BUFFER, bufferFloorID);
glEnableClientState(GL.VERTEX_ARRAY);
glBufferSubData(GL.ARRAY_BUFFER, 0, bufferSize, floorVertLine);
glNormalPointer(dataType, 0, bufferSize);
glVertexPointer(3, dataType, 0, 0);
glMaterialfv(GL.FRONT_AND_BACK, GL.DIFFUSE, trianglesColor);
glMaterialfv(GL.FRONT_AND_BACK, GL.AMBIENT, trianglesColor);
glDrawElements(GL.TRIANGLES, numFaces*3, GL.UNSIGNED_INT, int32(floorFacesLine-1));
glDisableClientState(GL.VERTEX_ARRAY);
glBindBuffer(GL.ARRAY_BUFFER, 0);
glPopMatrix;
Screen('EndOpenGL', window);
Here is when I try to apply the shader:
domedisplay = Screen('SetOpenGLTexture', window, [], 0, GL.TEXTURE_RECTANGLE_EXT, windowRect(3), windowRect(4), 1, shaderProgram);
Screen('DrawTexture',window,domedisplay,[-0.5*windowRect(3),-0.5*windowRect(4),windowRect(3),windowRect(4)],[]);
Here are the fragment and vertex shaders:
#version 120
void main()
{
gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
}
#version 120
varying vec4 Vertex_UV;
uniform mat4 gxl3d_ModelViewMatrix;
uniform mat4 gxl3d_ProjectionMatrix;
uniform int do_distorsion;
const float PI = 3.1415926535;
void main()
{
vec4 P = gxl3d_ModelViewMatrix * gl_Vertex;
if (do_distorsion == 1)
{
float rxy = length(P.xy);
if (rxy > 0)
{
float phi = atan(rxy, -P.z);
float lens_radius = phi * 180.0 / PI * 2.0;
P.xy *= (lens_radius / rxy);
}
}
gl_Position = gxl3d_ProjectionMatrix * P;
Vertex_UV = gl_MultiTexCoord0 * 10.0;
}
Here is the stimulus if I don't load the shaders: