gpt4 book ai didi

java - glDrawArrays Exception_Access_Violation 异常

转载 作者:行者123 更新时间:2023-11-30 06:28:07 24 4
gpt4 key购买 nike

我正在尝试实现一种使用 OpenGL 和 Java 中的 vertexBufferObjects 绘制一堆立方体的方法,但是在调用 glDrawArrays 命令时遇到了问题。

本质上,该程序所做的是循环遍历 x、y、z 坐标,并从那里计算以该坐标为中心的立方体顶点所在的位置,然后将这些顶点输入到浮点缓冲区中。 (请注意,我目前只输入一个面的顶点数据,以便在完善代码时保持代码简单)

出现的错误是:

EXCEPTION_ACCESS_VIOLATION (0xc0000005) 在 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 的调用是错误的。它的第一个参数不是整体 float ,而是单个顶点的 float (或更确切地说是组件),在您的情况下为 3。访问冲突的原因只是 glVertexPointer调用失败,然后 glDrawArrays 使用默认参数,这可能为每个顶点指定 4 个组件,或者不使用您的缓冲区对象或使用其他一些与您的顶点数据不匹配的未指定参数。所以只需将其替换为

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

无论如何,变量名 verticesPerObject 有点误导,因为它不包含顶点数,而是包含 float ,但这仅仅是装饰品,其余用法是正确的.

关于java - glDrawArrays Exception_Access_Violation 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12909432/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com