2012-07-08 1 views
6

私はiPhone用のOpenGLアプリケーションを開発しています。私の頂点シェーダでは、多数の(しかしすべてではない)頂点の色を一度に変更する方法が必要なので、私はカラーインデックスを作成しました。これにより、VBOを静的にしておき、各頂点をループして各フレーム間の色情報を変更するのではなく、単一の一様な変数を変更することができます。OpenGL ES 2.0で配列インデックスの整数を指定しますか?

私の計画では、カラー配列を使用してユニフォームを作成し、属性にインデックスを含む整数を追加します。ここに私の頂点シェーダは、次のとおりです。

uniform mat4 u_mvp_matrix; 
uniform vec4 u_color_array[]; 

attribute vec4 a_position; 
attribute int a_colorIndex; 

varying lowp vec4 v_color; 

void main() 
{ 
    v_color = u_color_array[a_colorIndex]; 

    gl_Position = u_mvp_matrix * a_position; 
} 

これは、エラーが発生します。

int can't be an in in the vertex shader

私はいくつかの研究をしました。 iPhoneは遅くともOpenGL ES 2.0をサポートしています。つまり、遅くともGLSL 1.2をサポートしています。明らかに整数はGLSL 1.3以降でのみサポートされています。私はa_colorIndexをfloatに変更しようとしました。私はそれがうまくいくとは思っていませんでした。

どのようにして各頂点にカラーインデックスを指定できますか?

+0

インデックスが配列ルックアップではなく、uv floatであるテクスチャルックアップを考えてみてください。または、floatをintにキャスト/ラウンドできますか? – Tim

+1

"と表示されています。これは、最新で「GLSL 1.2」をサポートしていることを意味しています。 GL ES 2.0は、デスクトップGLSL言語とは異なる* GLSL *** ES ***シェーディング言語をサポートすることを意味します。 GLSL ESはGLSL 1.2をベースにしていますが、同じことではありません。* –

答えて

4

属性をフロートとして指定します。 floatを配列のインデックスとして使用できます。

+0

「インデックス式には「float型」がありますが、あなたが言ったことがあれば整数型にする必要があります。配列[int(fIndex)]を実行しても安全ですか、それとも精度の高いエラーが発生しますか? – weezor

+0

私はweezorと同じ問題に遭遇しました(少なくとも...)。明確にするといいですね。 –

+0

ES2言語仕様では、「配列要素は、型が整数である式を使用してアクセスされます。だから、intにキャストする(寛大なプラットフォームは暗黙的なキャストを行うので、答えは返答者のマシン上で動作するでしょう)。 – kiwibonga

関連する問題