2012-01-14 13 views
8

初めて頂点シェーダにブール値を渡そうとしています。私は今まで浮動小数点を使用してきただけです。OpenGL ES(2.0)シェーディング言語:ブール値を頂点シェーダに入力してフラグメントシェーダに渡す方法は?

問題のブール値はプリミティブ固有であるため、ユニフォームとして渡すことはできません。ただし、任意のプリミティブのすべての頂点について同じ値を持ちます。

Khronosの仕様からは、 'varying'はデータをフラグメントシェーダーに渡す唯一の方法ですが、 'varying bool my_bool;私の頂点シェーダで定義されたときにパーサーエラーが発生します。

として、私は私の頂点シェーダにブール値を渡している:私は、フラグメントシェーダに渡すための試みで変化を定義

attribute bool a_my_bool; 

varying bool v_my_bool; 
void main() { 
    // ... 
    v_my_bool = a_my_bool; 
} 

誰かがどのように私に教えてもらえます私は私の意図を達成することができますか?

答えて

12

The OpenGL® ES Shading Language version 1.0.17 (PDF)の§4.3.5から:

変化修飾子は、データ型フロート、VEC2、vec3、vec4、MAT2、MAT3、及びMAT4、又はこれらの配列と共に使用することができます。

そして§4.3.3から:

属性修飾子は、データ型はfloat型、VEC2、 vec3、vec4、MAT2、MAT3、MAT4と一緒に使用することができます。属性変数は配列または構造体として として宣言することはできません。

だから、attribute boolを持って、おろかvarying bool、仕様に応じてすることはできません。

本当に頂点ごとにブール値が必要な場合は、falseには0.0を、trueには1.0を使用できます。テスト時にx > 0.5を確認してください。例:

// vertex shader 
attribute float a_my_bool; 
varying float v_my_bool; 
void main() { 
    // ... 
    v_my_bool = a_my_bool; 
} 

// fragment shader 
varying float v_my_bool; 
void main() { 
    if (v_my_bool > 0.5) { 
     // my_bool is true 
     // ... 
    } else { 
     // my_bool is false 
     // ... 
    } 
} 

各三角形内のすべての頂点が同じ値を持つ限り、これは機能するはずです。それらが一貫していない場合、同じ三角形が異なる振る舞いをするために異なる断片になります。 (0.0と1.0に固執すると、「奇数」コーナーに最も近い三角形の四分の一は、残りの部分とは異なる動作をします)

3

属性を使用せず、ブール値が特定のプリミティブに関連付けられていても、それをユニフォームに切り替えることを強くお勧めします。 Uniformでは、一度だけ設定して何度も使用しますが、アトリビュートを使用すると、各描画で必要なメモリ帯域幅が大幅に増加します。私が見ている唯一の意味は、プリミティブの極端なバッチ処理を実行する場合ですが、その場合でも、このソリューションの実際の利点は、そのリスクが逆の効果を達成することであるため、慎重に評価する必要があります。様々な変数について

、一つの共通の間違いは、これはリンクエラーを引き上げると、コンパイルをチェックして、とにかくそれに気づくでしょう、両方の頂点とフラグメントシェーダに変化を宣言し、2

のいずれかをお見逃しなくすることですリンク結果。

私があなたの場所でチェックする別の側面は、コンパイラが未使用の内容(デッドコードの最適化)を取り除くために変数が割り当てられ、使用されていることを確認することです。

関連する問題