开发者

WebGL: glsl attributes issue, getProgramParameter returns wrong number of attributes

I'm making a simple WebGL demo. I have a simple vertex shader that takes two attributes and some uniforms. Here is the code:

attribute vec3 v_position;
attribute vec3 v_normal;

uniform mat4   mvMatrix;
uniform mat4   pMatrix;
uniform mat3   normalMatrix;
uniform vec3   lightPosition;



// Color to fragment program
varying vec3 transformedNormal;
varying vec3 lightDir;

void main(void) 
{ 
  // Get surface normal in eye coordinates
  transformedNormal = normalMatrix * v_normal;

  // Get vertex position in eye coordinates
  vec4 position4 = mvMatrix * vec4(v_position.xyz,1.0);
  vec3 position3 = position4.xyz / position4.w;

      // Get vector to light source
  lightDir = normalize(lightPosition - position3);


  // Don't forget to transform the geometry!
  gl_Position = pMatrix * mvMatrix * vec4(v_position.xyz,1.0);
}

For some reason when I call

gl.getProgramParameter(shaderPro开发者_StackOverflowgram, gl.ACTIVE_ATTRIBUTES);

I get a count of 1 when I should be getting 2;

I'm not sure what is wrong here. If you need it this is the fragment shader that goes with it:

#ifdef GL_ES
precision highp float;
#endif 

uniform vec4    ambientColor;
uniform vec4    diffuseColor;   
uniform vec4    specularColor;

varying  vec3 transformedNormal;
varying  vec3 lightDir;


void main(void)
{ 
  // Dot product gives us diffuse intensity
  float diff = max(0.0, dot(normalize(transformedNormal), normalize(lightDir)));

  // Multiply intensity by diffuse color, force alpha to 1.0
  vec4 out_color = diff * diffuseColor;

  // Add in ambient light
  out_color += ambientColor;


      // Specular Light
  vec3 vReflection = normalize(reflect(-normalize(lightDir), normalize(transformedNormal)));
  float spec = max(0.0, dot(normalize(transformedNormal), vReflection));
  if(diff != 0.0) {
    float fSpec = pow(spec, 128.0);
    out_color.rgb += vec3(fSpec, fSpec, fSpec);
  }


  gl_FragColor = vec4(1.0,0.0,0.0, 1.0);

}


This is due to the smartness of your GLSL compiler, I think. In your fragment shader you assign a constant color to gl_FragColor in the last line. Therefore all your nice computations, and all the varyings get optimized away. So as transformedNormal has been optimized away, you also don't need to compute its value in the vertex shader. So your v_normal attribute is also optimized away (isn't it nice how smart your GLSL compiler is, to reduce both shaders to a single line). That's the reason it's called ACTIVE_ATTRIBUTES and not just ATTRIBUTES or DECLARED_ATTRIBUTES (those constants don't exist, I made them up).

Try to assign out_color to gl_FragColor and nothing should get optimized away.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜