2

OpenGLとJavaでvertexBufferObjectsを使用して多数の立方体を描画するメソッドを実装しようとしていますが、glDrawArraysコマンドを呼び出すときに問題が発生します。

基本的に、このプログラムはx、y、z座標を循環し、そこからその座標を中心とする立方体の頂点がどこにあるかを計算し、これらの頂点をフロートバッファーに入力します。(コードが完成している間、コードを単純に保つために、現時点では1つの面の頂点データのみを入力していることに注意してください)

発生するエラーは次のとおりです。

EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x000000006056ec90, pid=6424, tid=7696

int verticesPerObject = 12; //number of vertices per square
int chunkSizeX = 4; //number of cubes in x direction
int chunkSizeY = 4; //number of cubes in y direction
int chunkSizeZ = 4; //number of cubes in z direction
FloatBuffer vertexData = BufferUtils.createFloatBuffer(chunkSizeX * chunkSizeY * chunkSizeZ * verticesPerObject);

    for (int x = 0; x < chunkSizeX; x++) {
        for (int y = 0; y < chunkSizeY; y++) {
            for (int z = 0; z < chunkSizeZ; z++) {
                vertexData.put(new float[]{
                        (float)x * blockWidth - blockWidth/2, (float)y * blockHeight - blockHeight/2, (float)z * blockDepth + blockDepth/2,
                        (float)x * blockWidth + blockWidth/2, (float)y * blockHeight - blockHeight/2, (float)z * blockDepth + blockDepth/2,
                        (float)x * blockWidth + blockWidth/2, (float)y * blockHeight + blockHeight/2, (float)z * blockDepth + blockDepth/2,
                        (float)x * blockWidth - blockWidth/2, (float)y * blockHeight + blockHeight/2, (float)z * blockDepth + blockDepth/2
                });
            }
        }
    }

    vertexData.flip();

    int vboVertexHandle = glGenBuffers();
    glBindBuffer(GL_ARRAY_BUFFER, vboVertexHandle);
    glBufferData(GL_ARRAY_BUFFER, vertexData, GL_STATIC_DRAW);
    glBindBuffer(GL_ARRAY_BUFFER, 0);

    glBindBuffer(GL_ARRAY_BUFFER, vboVertexHandle);
    glVertexPointer(verticesPerObject, GL_FLOAT, 0, 0L);

    glEnableClientState(GL_VERTEX_ARRAY);
    glDrawArrays(GL_QUADS, 0, verticesPerObject);
    glDisableClientState(GL_VERTEX_ARRAY);
4

1 に答える 1

5

あなたの呼び出しglVertexPointerは間違っています。その最初のパラメータは、全体的なフロートの数ではなく、単一の頂点のフロート(またはコンポーネント)の数です。この場合は3です。アクセス違反の理由は、glVertexPointer呼び出しが失敗しglDrawArraysてからデフォルトのパラメータを使用するためです。 、頂点ごとに4つのコンポーネントを指定するか、バッファオブジェクトを使用しないか、頂点データと一致しないその他の指定されていないパラメータを使用する可能性があります。だからそれを置き換えるだけです

glVertexPointer(3, GL_FLOAT, 0, 0L);

変数名verticesPerObjectには頂点の数は含まれていませんが、フロートの数は含まれていないため、とにかく少し誤解を招く可能性がありますが、これは単なる見た目であり、残りの使用法は正しいです。

于 2012-10-16T07:57:03.810 に答える