我正在尝试实现一种在OpenGL和Java中使用vertexBufferObjects绘制一堆多维数据集的方法,但是在调用glDrawArrays命令时遇到了问题。
从本质上讲,该程序要做的是循环遍历x,y,z坐标,并从此处计算以该坐标为中心的立方体的顶点在何处,然后将这些顶点输入到float缓冲区中。 (请注意,我目前仅输入一张面的顶点数据,以使代码在完善后保持简单)
发生的错误是: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);
最佳答案
您对glVertexPointer
的呼叫是错误的。在您的情况3中,它的第一个参数不是总浮点数,而是单个顶点的浮点数(或分量)。导致访问冲突的原因仅是glVertexPointer
调用失败和然后使用默认参数,该参数可能为每个顶点指定4个组件,或者不使用缓冲区对象或使用一些其他未指定参数,这些参数与顶点数据不匹配。因此,只需将其替换为
glVertexPointer(3, GL_FLOAT, 0, 0L);
无论如何,变量名
glDrawArrays
有点误导,因为它不包含顶点数,但包含浮点数,但这仅是化妆品,其余用法是正确的。