WebGL: проблема с атрибутами glsl, getProgramParameter возвращает неверное количество атрибутов - PullRequest
3 голосов
/ 06 сентября 2011

Я делаю простую демоверсию 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);

}

1 Ответ

8 голосов
/ 06 сентября 2011

Думаю, это связано с умностью вашего GLSL-компилятора.В вашем фрагментном шейдере вы присваиваете постоянный цвет gl_FragColor в последней строке.Поэтому все ваши приятные вычисления и все изменения оптимизируются.Так как transformedNormal был оптимизирован, вам также не нужно вычислять его значение в вершинном шейдере.Таким образом, ваш атрибут v_normal также оптимизирован (не правда ли, насколько умен ваш GLSL-компилятор, чтобы свести оба шейдера в одну строку).Вот почему он называется ACTIVE_ATTRIBUTES, а не просто ATTRIBUTES или DECLARED_ATTRIBUTES (эти константы не существуют, я их придумал).

Попробуйте присвоить out_color gl_FragColor и ничегодолжен быть оптимизирован.

...