Is this GLSL program correct? My cubes are solid black

244 views Asked by At

My phong fragment shader is not shading anything, just making everything black. This is my fragment shader

precision  mediump float;
varying    vec3    vposition;
varying    vec3    vnormal;
varying    vec4    vcolor;
varying    vec3    veyePos;

void main() {
  vec3 lightPos = vec3(0,0,0);
  vec4 s = normalize(vec4(lightPos,1) - vec4(veyePos,1));
  vec4 r = reflect(-s,vec4(vnormal, 1));
  vec4 v = normalize(-vec4(veyePos, 1));
  float spec = max( dot(v,r),0.0 );
  float diff = max(dot(vec4(vnormal,1),s),0.0);
  vec3 diffColor = diff * vec3(1,0,0);
  vec3 specColor = pow(spec,3.0) * vec3(1,1,1);
  vec3 ambientColor = vec3(0.1,0.1,0.1);
  gl_FragColor = vec4(diffColor + 0.5 * specColor + ambientColor, 1);
}

This is my vertex shader

uniform    mat4     uMVPMatrix;
uniform    mat4     uMVMatrix;
uniform    vec3     eyePos;
attribute  vec4     aPosition;
attribute  vec4     aColor;
attribute  vec4     aNormal;
varying    vec4     vcolor;
varying    vec3     vposition;
varying    vec3     vnormal;
varying    vec3     veyePos;

void main() {
  mat4 normalMat = transpose(inverse(uMVMatrix));
  vec4 vertPos4 = uMVMatrix * vec4(vec3(aPosition), 1.0);
  vposition = vec3(vertPos4) / vertPos4.w;
  vcolor = aColor;
  veyePos = eyePos;
  vnormal = vec3(uMVMatrix * vec4(vec3(aNormal),0.0));
  gl_Position = uMVPMatrix * aPosition;
}

MVMatrix is model-view matrix MVPMatrix is model-view-projection matrix

1

There are 1 answers

0
Gal Kamar On

first of all your lighting equations are incorrect: vector s that you use to calculate the diffuse color should be a unit vector that originates at your vertex (vposition) towards your light. so it would be s = normalize(lightPos - vposition)

also lightPos should be given in camera space and not in world space (so you should multiply it by your MV matrix)

vector r is the reflection of s around the normal so i dont understand why you take -s also the normal there should be in non-homegenous coordinates so it would be: r = reflect(s,vnormal)

and finally v is the viewing ray (multiplied by -1) so it should be the vector that originates at vposition and goes towards eyepos. v = normalize(veyepos - vposition)

also in your vertex shader veyepos (assuming it is the position of your camera) should not be varying (should be flat variable) because you dont want to interpolate it.

in your vertex shader you calculate normalMat but you forgot to use it when calculating your normals in camera space. also normalMat should be mat3 because it is the inverse transpose of the 3by3 block of your MV matrix originating at (0,0)

** in order to be efficient you should calculate your normalMat on the cpu and pass it as a uniform to your vertex shader

hope this helps