/ / Android - なぜ私は致命的な信号を取得していますか? - アンドロイド、OpenGL - es

Android - なぜ私は致命的な信号を取得していますか? - アンドロイド、OpenGL - es

私はOpenGLでスクリーン上のいくつかのポイントを表示しようとしています。 ここにondrawのコードがあります:

gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);
gl.glLoadIdentity();
gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl.glColor4f(0, 255, 0, 0);
gl.glVertexPointer(3, GL10.GL_FLOAT, 0, buffer);
gl.glDrawArrays(GL10.GL_POINTS, 0, points.length);
gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);

誰かが私が何をやっているのか教えてもらえますか?

EDIT:バッファとポイントを生成するコード

    points = new float[12288];
int pos = 0;
for (float y = 0; y < 64; y++) {
for (float x = 0; x < 64; x++) {
points[pos++] = x/100;
points[pos++] = y/100;
points[pos++] = 0;
}
}

ByteBuffer vertexByteBuffer = ByteBuffer.allocateDirect(points.length * 4);
vertexByteBuffer.order(ByteOrder.nativeOrder());
// allocates the memory from the byte buffer
buffer = vertexByteBuffer.asFloatBuffer();
// fill the vertexBuffer with the vertices
buffer.put(points);
// set the cursor position to the beginning of the buffer
buffer.position(0);

logcatでのエラー:

04-17 06:38:11.296:A / libc(24276):0x41719000(コード= 2)の致命的なシグナル11(SIGSEGV)

このエラーはgl.glDrawArraysで発生します。

回答:

回答№1は2

私はこれが問題だと思う:

gl.glDrawArrays(GL10.GL_POINTS, 0, points.length);

glDrawArrays の数を取る 頂点 あなたが描きたいものあなたはそれに数を与えています 浮動これは3倍の大きすぎます。したがって、OpenGLは実際にあなたのポイント配列から12288個の頂点= 36、xxx浮動小数点数を読み込もうとしています。どちらの方法でも配列の境界を超えています。


回答№2の場合は-1

問題: glBindBufferは呼び出されていませんが、glDrawArraysが呼び出されました。これによりセグメンテーションが発生します。

glBindBufferコマンドを使用してバッファを最初にバインドせずにIBOバッファを使用しようとしたときも同じ問題がありました。たとえば、私の描画関数の1つは次のようになります。

GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, common.vbo);
GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, common.ibo);

GLES20.glVertexAttribPointer(handleManager.switchPosition, 2, GLES20.GL_FLOAT, false, 0, 0);
GLES20.glEnableVertexAttribArray(handleManager.switchPosition);

GLES20.glDrawElements(GLES20.GL_TRIANGLES, common.iboPointCount, GLES20.GL_UNSIGNED_BYTE, 0);

GLES20.glDisableVertexAttribArray(handleManager.switchPosition);

GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0);
GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, 0);

glBindBufferコマンドはすべて、シェーダーに認識させようとしている属性データを操作することができます。