gpt4 book ai didi

java - openGL 中的 VBO

转载 作者:行者123 更新时间:2023-12-01 14:19:17 24 4
gpt4 key购买 nike

我目前正在学习使用 openGL 和 LWJGL。当尝试设置一些顶点缓冲区对象时,我收到错误消息:

Invalid memory access of location 0x0 rip=0x10f95f42f

这是我的代码。

public class Test {

public Test(){
try {
Display.setDisplayMode(new DisplayMode(768, 512));
Display.setTitle("This is a title!");
Display.create();
} catch (LWJGLException e) {
e.printStackTrace();
}

//Initialize openGL
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(1, 1, 1, 1, 1, -1);
glMatrixMode(GL_MODELVIEW);

final int vertexAmount = 3;
final int vertexSize = 2;
final int colorSize = 3;

FloatBuffer vertexData = BufferUtils.createFloatBuffer(vertexAmount * vertexSize);
vertexData.put(new float[]{-0.5f, -0.5f, 0.5f, 0.5f, -0.5f, 0.5f});
vertexData.flip();

FloatBuffer colorData = BufferUtils.createFloatBuffer(vertexAmount * colorSize);
colorData.put(new float[]{1, 0, 0, 0, 1, 0, 0, 0, 1});
colorData.flip();

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

int vboColorHandle = glGenBuffers();
glBindBuffer(GL_ARRAY_BUFFER, vboColorHandle);
glBufferData(GL_ARRAY_BUFFER, colorData, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);

while(!Display.isCloseRequested()){
glClear(GL_COLOR_BUFFER_BIT);

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

glBindBuffer(GL_ARRAY_BUFFER, vboColorHandle);
glVertexPointer(colorSize, GL_FLOAT, 0, 0L);

glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);
glDrawArrays(GL_TRIANGLES, 0, 3);
glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);

Display.update();
Display.sync(60);
}

glDeleteBuffers(vboVertexHandle);
glDeleteBuffers(vboColorHandle);

Display.destroy();

}

public static void main(String[] args){

Test test = new Test();

}

}

最佳答案

您的问题可能是您启用了GL_COLOR_ARRAY而没有向其提供任何数据。我注意到在你的 while 循环中,有这样的代码块:

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

glBindBuffer(GL_ARRAY_BUFFER, vboColorHandle);
glVertexPointer(colorSize, GL_FLOAT, 0, 0L);

注意到最后一行也是glVertexPointer吗?这应该是 glColorPointer,以指定绑定(bind)缓冲区中的数据用于 GL_COLOR_ARRAY,而不是 GL_VERTEX_ARRAY

我不认为这真的有什么区别,但我总是喜欢在设置数据之前启用/禁用某些东西,所以如果上述方法不起作用,请尝试移动两个 glEnableClientState在 while 循环中的第一个 glBindBuffer 调用之前调用,看看是否会改变任何内容。

关于java - openGL 中的 VBO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17768075/

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