2010-12-11 4 views
4

アトリビュートを持つ頂点シェーダがあり、指定されたフレームに設定されている場合と設定されていない場合があります。これらの属性が設定されているかどうかを確認する方法はありますか?私がやりたいのは何GLSL - セットアトリビュートのチェック

attribute vec3 position; 
attribute vec3 normal; 
attribute vec4 color; 
attribute vec2 textureCoord; 


uniform mat4 perspective; 
uniform mat4 modelview; 
uniform mat4 camera; 
uniform sampler2D textureSampler; 

varying lowp vec4 vColor; 

void main() { 
    gl_Position = perspective * camera * modelview * vec4(position, 1.0); 
if ((bool)textureCoord) { // syntax error 
    vColor = texture2D(textureSampler, textureCoord); 
} else { 
    vColor = (bool)color ? color : vec4((normal.xyz + 1.0)/2.0 , 1.0); 
} 
} 
+1

私たちはGL ES 2について話しています。 – Kos

答えて

9

は私がまたは任意のフレームに設定してもしなくてもよい属性を持つ頂点シェーダーを持っています。

いいえ、ありません。 :)

属性では、属性が「設定」されないことは不可能です。すべての頂点シェーダインスタンスは、宣言されたすべての属性から有効な値を受け取ります。

アトリビュート配列がglEnableVertexArrayで有効になっていない場合は、デフォルト属性(glVertexAttribおよびそのデフォルトで指定されている)が渡されます。あなたのケースでは


、次のいずれかを実行します

  • は(条件付きコンパイルはあなたの友達です。UberShaderのためのgoogle)とのまたはテクスチャなしの異なるバージョンでシェーダをコンパイル均一な変数を使用
  • 、シェーダースイッチに保存するために "useTexturing"のように。

を選択してください。

+0

それは私が恐れていたことです - ありがとう! – schellsan

+0

Oh btw、シェイダー内のどこでも使用されていなければ、属性はコンパイラ/リンカー(つまり、シェーダコードから削除され、 'getVertexAttribLocation'に応答して-1で答える)によって最適化される可能性が高いコード。しかし、そうではありません。 – Kos

+0

@Kos OpenGLがこの時点で自分自身を管理していることを知っておくとよいでしょう。何も定義されていない場合に使用されるデフォルト値がわかりますか? –