1

私はAndroidアプリケーションを開発しています。

次の頂点シェーダーがあります。

"attribute vec4 vertexPosition; 
attribute vec4 vertexNormal; 
attribute vec2 vertexTexCoord; 

varying vec2 texCoord; 
varying vec4 normal; 

uniform mat4 modelViewProjectionMatrix; 

void main() 
{ 
   gl_Position = modelViewProjectionMatrix * vertexPosition; 
   normal = vertexNormal; 
   texCoord = vertexTexCoord; 
} 
";

これがフラグメント シェーダーです。

precision mediump float; 

varying vec2 texCoord; 
varying vec4 normal; 

uniform sampler2D texSampler2D;

void main()
{ 
   gl_FragColor = texture2D(texSampler2D, texCoord); 
} 
";

vertexTexCoord をバインドしないままにしておくと問題はありますか? モデルにテクスチャがない場合は、別の頂点シェーダーとフラグメント シェーダーを使用する必要があると思いませんか?

ありがとう。

4

1 に答える 1

1

はい、テクスチャのないモデルには別のシェーダーが必要です。そうしないと、実装依存の動作が発生すると思います。

それに関連して、OpenGLのドキュメントには次のように書かれています:

明示的にバインドされていないアクティブな属性は、glLinkProgram が呼び出されたときにリンカーによってバインドされます。割り当てられた場所は、glGetAttribLocation を呼び出すことで照会できます。

そのため、頂点属性が有効になっている場合、属性の 1 つから vertexTexCoord を取得しようとします。テクスチャのないモデルに必要な数のアトリビュートしか有効にされていない場合にどうなるかはわかりませんが、そのようなことに依存するべきではありません。別のシェーダーを使用してください。

于 2010-12-01T19:22:47.507 に答える