-1

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 が割り当てられます。

現在、物理デバイスを持っていないため、エミュレーターでテストしました。

上記のコードに何か問題がありますか? または、このエラーはエミュレーターが原因で、アプリは物理デバイスで実行する必要がありますか?

4

1 に答える 1

1

私の以前のコメントからコピー:

この線

GLES20.glDrawElements(GLES20.GL_TRIANGLES, indexCount, GLES20.GL_UNSIGNED_SHORT, indexBuffer);

最後のパラメータは現在バインドされている へのバイトオフセットであると想定されているため、少し疑わしいように見えますELEMENT_ARRAY_BUFFERが、変数名はバッファハンドルを渡していることを示唆しています。もしそうなら、これは何らかの奇妙な効果をもたらす可能性があります。

于 2013-05-19T14:03:38.683 に答える