Я делаю простую демоверсию 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);
, я получаю счет 1, когда должен получить 2;
Я не уверен, что здесь не так.Если вам это нужно, вот фрагментный шейдер, который идет с ним:
#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);
}