Странная ошибка в GLSL при назначении атрибута варьирующемуся вершинному шейдеру

Я пишу программу GLSL для наложения текстур. У меня странная проблема. Из моего вершинного шейдера я пытаюсь передать текстурную координату vec2 как шейдер от вариации до фрагмента. В diff шейдере в той же проге я сделал то же самое, и это сработало. Но для этой текстуры не работает. Если я прокомментирую эту строку, то все работает. Я понятия не имею, почему это происходит.

Это вершинный шейдер:

attribute vec4 position; 
attribute vec4 color1; 
attribute vec4 normal; 
attribute vec2 texCoord;

uniform mat4 model; //passed to shader 
uniform mat4 projection; //passed to shader
uniform mat4 view; // passed to shader
uniform mat4 normalMatrix; //passed to shader
uniform mat4 worldNormalMatrix;
uniform vec3 eyePos;

varying vec4 pcolor; 
varying vec3 fNormal;
varying vec3 v;
varying mat4 modelMat;
varying mat4 viewMat;
varying mat4 projectionMat;
varying vec2 texCoordinate;
varying vec3 reflector;

void main()
{     
      //texCoordinate = texCoord;  // If I uncomment this, then I get wrong output. but the same thing works in a diff shader!! 
      mat4 projectionModelView;
      vec4 N;
      vec3 WorldCameraPosition = vec3(model*vec4(eyePos,1.0));
      vec3 worldPos = vec3(model*position);
      vec3 worldNorm = normalize(vec3(worldNormalMatrix*normal));
      vec3 worldView = normalize(vec3(WorldCameraPosition-worldPos));
      reflector = reflect(-worldView, worldNorm);      
      projectionMat = projection;
      modelMat=model;
      viewMat=view;
      N=normalMatrix*normal;      
      fNormal = vec3(N); //need to multiply this with normal matrix
      projectionModelView=projection*view*model;
      v=vec3(view*model*position); // v is the position at eye space for each vertex passed to frag shader
      gl_Position =  projectionModelView * position; // calculate clip space position     
}

1 ответ

Решение
varying vec4 pcolor; 
varying vec3 fNormal;
varying vec3 v;
varying mat4 modelMat;
varying mat4 viewMat;
varying mat4 projectionMat;
varying vec2 texCoordinate;
varying vec3 reflector;

Это всего 17 различных векторов. Это слишком много для большинства аппаратных средств класса 2.1 (они обычно поддерживают только 16). Вероятно, поэтому он "не работает", когда вы раскомментируете эту строку, потому что ваш вершинный шейдер будет игнорировать любые изменения, в которые вы фактически не пишете.

Вы не должны проходить эти матрицы вообще. Они униформы; по определению они не меняются от вершины к вершине. И фрагментные шейдеры также могут получить доступ к той же форме. Так что просто объявите их в своем фрагментном шейдере, если вам нужно их использовать.

Другие вопросы по тегам