私は OpenGl とシェーダー全般に非常に慣れていません。フラグメント シェーダーで Java コードの静的な int 配列を使用して、カメラの色を操作したいと考えています。int 配列をシェーダーに渡す方法はありますか、またはシェーダーが何らかの方法で配列にアクセスできるようにする方法はありますか?
ありがとう、マイク
シェーダー コード内でいわゆる静的配列を使用する正しい方法は、それを Uniform として渡すことです。
http://www.opengl.org/wiki/GLAPI/glユニフォーム
シェーダー コード内で、外部配列が必要であることを指定します。
uniform int colors[3]; // Specify an array of 3 integers
Javaコード内でこれを使用します:
int array[3] = {0, 1, 2};
int location = GLES20.glGetUniformLocation(program_id, "colors");
GLES20.glUniform1iv(location,
3,
array,
0);
カメラの色を操作しようとしているので、小さな配列をフラグメントシェーダー(おそらく3つまたは4つの整数)に渡そうとしていると思います。
すべてのフラグメントに対して同じ色のカメラはおそらく1つしかないため、データを渡す最も簡単な方法は、ユニフォームを使用することです。フラグメントでユニフォームを宣言します。
uniform vec4 cameraColor;
次に、Javaコードで、ユニフォームの場所を取得し、それにデータを渡します(これは、C ++コードであり、Javaコードは少し異なる場合があります)。
GLint uniColorLocation = glGetUniformLocation( shaderProgram, "cameraColor" );
glUniform4i( uniColorLocation, array[0], array[1], array[2], array[3] );
フラグメントシェーダーに多くの色を渡したい場合は、フラグメント属性(ins)を使用してデータを渡します。Javaコードでは、などの呼び出しを使用しglVertexAttribPointer
てglBufferData
これを実現します。もう1つのオプションは、テクスチャデータを使用してシェーダーに情報を渡すことです。ここで、単一のテクセルは1つのオブジェクトのカメラの色に対応する可能性があります。