WebGL:glsl属性问题,getProgramParameter返回错误的属性数

时间:2011-09-06 19:23:25

标签: glsl webgl

我正在制作一个简单的WebGL演示。我有一个简单的顶点着色器,它有两个属性和一些制服。这是代码:

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);
}

出于某种原因我打电话

gl.getProgramParameter(shaderProgram, gl.ACTIVE_ATTRIBUTES);

当我得到2时,我得到1的计数;

我不确定这里有什么问题。如果你需要它,那么它就是片段着色器:

#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);

}

1 个答案:

答案 0 :(得分:8)

这是因为我认为你的GLSL编译器很聪明。在片段着色器中,为最后一行中的gl_FragColor指定一个常量颜色。因此,所有精彩的计算以及所有变化都会被优化掉。因此,transformedNormal已被优化掉,您也无需在顶点着色器中计算其值。因此,您的v_normal属性也被优化了(GLSL编译器的智能程度如何,将两个着色器减少到一行)。这就是它被称为ACTIVE_ATTRIBUTES而不仅仅是ATTRIBUTESDECLARED_ATTRIBUTES的原因(这些常量不存在,我制作了它们。)

尝试将out_color分配给gl_FragColor,不应该对任何内容进行优化。