我正在制作一个简单的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);
}
答案 0 :(得分:8)
这是因为我认为你的GLSL编译器很聪明。在片段着色器中,为最后一行中的gl_FragColor
指定一个常量颜色。因此,所有精彩的计算以及所有变化都会被优化掉。因此,transformedNormal
已被优化掉,您也无需在顶点着色器中计算其值。因此,您的v_normal
属性也被优化了(GLSL编译器的智能程度如何,将两个着色器减少到一行)。这就是它被称为ACTIVE_ATTRIBUTES
而不仅仅是ATTRIBUTES
或DECLARED_ATTRIBUTES
的原因(这些常量不存在,我制作了它们。)
尝试将out_color
分配给gl_FragColor
,不应该对任何内容进行优化。