次のシェーダーがあります。
protected final static String vertexShaderCode =
"attribute vec4 vPosition;" +
"attribute vec2 texCoord;" +
"attribute mat4 uMVPMatrix; \n" +
"varying vec2 vTexCoord;" +
"void main() {" +
" gl_Position = uMVPMatrix * vPosition;" +
" vTexCoord = texCoord;" +
"}";
mvp マトリックスを属性として渡したいのですが、正しくバインドされていないようです。自動割り当てバインディングを使用しています。次のようにプログラムをリンクした後、属性の場所を照会すると:
// program linked previously
GLES20.glUseProgram(program);
GLES20.glEnable(GLES20.GL_TEXTURE_2D);
GLES20.glEnable(GLES20.GL_BLEND);
mPositionHandle = GLES20.glGetAttribLocation(program, "vPosition");
mTextureHandle = GLES20.glGetAttribLocation(program, "texCoord");
mtextureSampHandle = GLES20.glGetAttribLocation(program, "textureSamp");
mMVPMatrixHandle = GLES20.glGetAttribLocation(program, "uMVPMatrix");
返されるハンドルは次のとおりです。
mTextureHandle: 0
mMVPMatrixHandle: 1
mPositionHandle: 2
ただし、ここのドキュメントから: http://www.khronos.org/opengles/sdk/docs/man/xhtml/glBindAttribLocation.xml、mVMVPMatrixHandle には、マトリックスの各列に 1 つずつ、4 つの連続したハンドルを割り当てる必要があります (つまり、mVMVPMatrix はハンドル 1,2,3,4 を持っています)。これは事実ではなく、私には理由がわかりません...
その結果、画面に何も描画できません。完全を期すために、次のようにマトリックスをロードしようとしています。
GLES20.glVertexAttribPointer(mMVPMatrixHandle2, 4, GLES20.GL_FLOAT, false, 0, t1);
GLES20.glVertexAttribPointer(mMVPMatrixHandle2 + 1, 4, GLES20.GL_FLOAT, false, 0, t2);
GLES20.glVertexAttribPointer(mMVPMatrixHandle2 + 2, 4, GLES20.GL_FLOAT, false, 0, t3);
GLES20.glVertexAttribPointer(mMVPMatrixHandle2 + 3, 4, GLES20.GL_FLOAT, false, 0, t4);
ここで、t1 ~ t4 は、mvp 行列の個々の行を含むバッファーです。
{
1.74f, 0, 0, 0,
0, 2.9f, 0, 0,
0, 0, -2.414f, -1f,
-2.088f, 0, -2.66f, 3
}
これは、uMVPMatrix を均一の mat4 として定義し、glUniformMatrix4fv でロードすると機能します。