0

renderscript 用の GLSL でカスタム シェーダーを作成するとき、プログラム ビルダーは、指定された型に関係なく、一様定数としてバインドする構造体のすべてのメンバーを float または vec に変換しているようです。また、コンパイル時に次のエラーを報告している制服があります:「プログラムをリンクできませんでした、L0010、制服「ここの制服名」は精度が異なります。」. 頂点シェーダーとフラグメント シェーダーに別々にバインドする 2 つの異なる構造に、同じ名前の uniform があります。

[編集] 2番目の部分への回答をありがとう。最初の部分に関しては、より明確にしようとします。Java 側でシェーダー プログラムをビルドするとき、renderscript 構造にバインドされた Java 変数を入力として、定数をプログラム ビルダー (頂点とフラグメントの両方) にバインドします。すべてがうまく機能し、すべての float 変数は、シェーダー プログラムでユニフォームとして完全にアクセスできます。ただし、構造体に bool 型や int 型などのメンバーが含まれていて、if (i == UNI_memberInt) (i はシェーダーで宣言された整数カウンター) などを試みた場合、または if (UNI_memberBool) の行に沿ってエラーが発生します。 「int と float を比較できません」または「if() 条件はブール型である必要があります」これは、データが GLSL プログラムに完全に到達していないことを示唆しています。GLSL では 0 の float 値が常に正確である必要があるため、それらを float 値にして 0.0 などを使用することでこれを回避できますが、私には粗雑に思えます。for ループで UNI_memberInt を停止条件として使用しようとすると、同様のことが起こります。

4

1 に答える 1

1

開発者ハングアウトで質問していただきありがとうございます。残念ながら、Renderscript チームのエンジニアは、あなたの質問の最初の部分をよく理解していません。あなたがそれを明確にすることができれば、それは素晴らしいことです。2 番目の部分については、既知のバグです。

基本的に、頂点シェーダーとフラグメントシェーダーの両方に均一な「foo」がある場合、頂点シェーダーは高精度、フラグメントシェーダーは中程度であり、GLSL コンパイラでは処理できません。残念ながら、解決策は 2 つの名前の衝突を避けることです。

于 2012-03-15T00:25:45.027 に答える