1

テクスチャ マッピング用の GLSL プログラムを作成しています。私は奇妙な問題を抱えています。頂点シェーダーから、テクスチャ座標 vec2 をさまざまなフラグ シェーダーとして渡そうとしています。同じプログラムの差分シェーダーで同じことをしたところ、うまくいきました。しかし、このテクスチャでは機能しません。その行にコメントすると、すべてが機能します。なぜこれが起こっているのかわかりません。

これは頂点シェーダーです。

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     
}
4

1 に答える 1

7
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 のみをサポートします)。おそらく、その行のコメントを外すと「機能しない」のはそのためです。頂点シェーダーは、実際に書き込んでいない変数を無視するためです。

これらの行列をまったく渡すべきではありません。彼らは制服です。定義上、それらは頂点から頂点へと変化しません。また、フラグメント シェーダーは、同じユニフォームにも完全にアクセスできます。したがって、それらを使用する必要がある場合は、フラグメント シェーダーで宣言するだけです。

于 2012-11-02T05:42:02.037 に答える