2012-02-22 17 views
4

頂点シェーダ内で頂点属性が有効になっているかどうかを知る方法があるのだろうかと思っていましたか?私は頂点属性が無効になっている場合、すべての値が0.0として扱われることを知っているので、私は次のようなテストを行うことができます:頂点シェーダ内から頂点属性が有効になっているかどうか確認できますか?

if (attribute == 0) 
{ 
    // Do something different to normal. 
} 
else 
{ 
    // Use the attribute. 
} 

しかし、これは属性が有効になっている場合のための明白な問題があり、値は0に設定されます(無効の場合と同様に扱われます)。

もう1つの解決策は、属性を使用するかどうかを明記する統一変数を​​使用することですが、GLSLに組み込まれているものがあれば疑問に思っていましたか?

答えて

5

いいえありません。

エミュレートするには、ブール値を自分自身に渡します。 FYI

+0

ありがとうございました!それは私が行ったことです。これが将来GLSL機能になることができればうれしいでしょう! –

13

私は頂点属性が無効になっている場合、すべての値が0.0として扱われることを知っているので、私は次のようなテストを行うことができます:真実ではありません

。属性が無効な場合、その値は通常のOpenGL状態から得られます。すなわち、glVertexAttribによって設定された状態が機能する。この種の「一定の属性」をシェーダに送ることは完全に合法です。

そのため、APIには、属性が無効になっているかどうかをシェーダが通知する方法はありません。 「無効にされた」属性は依然として意味のあるデータを有することができる。

+0

@OP特定の "有効化されていない"値をチェックするソリューションは、glVertexAttribを設定するだけで、0以外の値を使用するように適合させることができます。この値までしたがって、追加のブール値は必要ありません。 –

+0

ああ! 'glVertexAttrib'関数はすべての頂点に使用される値を設定しますか?たとえば、 'glVertexAttrib1f(3、-1.0f)'を呼び出すと、位置3のすべての頂点属性は-1.0fに設定されますか? –

+0

@JamesBedford:はい。その属性の配列が有効でない限り。 –

関連する問題