Android アプリでオブジェクトをレンダリングしようとしています。ジオメトリは、インターリーブされた頂点バッファー (位置データと法線データ) とインデックス バッファーに基づいています。
頂点シェーダーは、次の 2 つの属性を想定しています。
頂点シェーダー:
...
attribute vec3 vPosition;
attribute vec3 vNormal;
...
Java 側:
//after compiling the shader
positionHandle = GLES20.glGetAttribLocation(effect, "vPosition");
normalHandle = GLES20.glGetAttribLocation(effect, "vNormal");
次に、ジオメトリを次のように描画します。
GLES20.glUseProgram(effect);
GLES20.glEnableVertexAttribArray(positionHandle);
GLES20.glEnableVertexAttribArray(normalHandle);
final int stride = 24;
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vertexBuffer);
GLES20.glVertexAttribPointer(positionHandle, 3, GLES20.GL_FLOAT, false, stride, 0);
GLES20.glVertexAttribPointer(normalHandle, 3, GLES20.GL_FLOAT, false, stride, 12);
GLES20.glDrawElements(GLES20.GL_TRIANGLES, indexCount,
GLES20.GL_UNSIGNED_SHORT, indexBuffer);
ただし、これにより、
A/libc(1010): 0x00000002 (コード = 1) で致命的なシグナル 11 (SIGSEGV)、スレッド 1024 (スレッド 81)
への呼び出しを削除するとglEnableVertexAttribArray(normalHandle)
、正常にレンダリングされます (ただし、法線がないため黒くなります)。normalHandle
変数には値 1 が割り当てられます。
現在、物理デバイスを持っていないため、エミュレーターでテストしました。
上記のコードに何か問題がありますか? または、このエラーはエミュレーターが原因で、アプリは物理デバイスで実行する必要がありますか?