Java OpenGL(LWJGL)VBO四元图形崩溃

Java OpenGL(LWJGL)VBO四元图形崩溃,java,lwjgl,vbo,Java,Lwjgl,Vbo,我目前一直在学习顶点数组和VBO的b/c,我现在知道它比“立即”渲染(如使用glBegin)更好/更快,尽管这要容易得多。我制作了一个小程序(实际上只是一个测试),创建了一个按钮,当您将鼠标悬停在按钮上时,它会改变颜色,但每当我启动它时,程序就会崩溃,并显示以下错误消息: A fatal error has been detected by the Java Runtime Environment: EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0

我目前一直在学习顶点数组和VBO的b/c,我现在知道它比“立即”渲染(如使用glBegin)更好/更快,尽管这要容易得多。我制作了一个小程序(实际上只是一个测试),创建了一个按钮,当您将鼠标悬停在按钮上时,它会改变颜色,但每当我启动它时,程序就会崩溃,并显示以下错误消息:

A fatal error has been detected by the Java Runtime Environment:

EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x000000006875c490, pid=5708, tid=7148

JRE version: 7.0_21-b11
Java VM: Java HotSpot(TM) 64-Bit Server VM (23.21-b01 mixed mode windows-amd64 compressed oops)
Problematic frame:
C  [atio6axx.dll+0x20c490]  DrvPresentBuffers+0x1cb680

Failed to write core dump. Minidumps are not enabled by default on client versions of   Windows

 An error report file with more information is saved as:
C:\Users\UserNameHere\Desktop\Java\workspace\LWJGL Tutorials\hs_err_pid5708.log

If you would like to submit a bug report, please visit:
http://bugreport.sun.com/bugreport/crash.jsp
The crash happened outside the Java Virtual Machine in native code.
See problematic frame for where to report the bug.
我的代码
}

这是因为您告诉OpenGL您想要使用颜色数组,所以当OpenGL尝试使用顶点和颜色缓冲区进行渲染时,它失败了,因为您没有绑定颜色缓冲区

这就是你所缺少的

glBindBuffer(GL_ARRAY_BUFFER, vbo_color_handle);
glColorPointer(vertexSize, GL_FLOAT, 0, 0l);
您需要用自己的颜色句柄id替换
vbo\u颜色\u句柄

更好的例子 另外,仅通过查看您的代码,我可以看出您并不完全了解VBO的工作原理,因此这里有一个VBO存储三角形的顶点和颜色并进行渲染的小示例

创建VBO。 这是创建实际顶点和颜色缓冲区并将它们绑定到VBO的代码

int vertices = 3;

int vertex_size = 3; // X, Y, Z
int color_size = 3; // R, G, B

FloatBuffer vertex_data = BufferTools.createFloatBuffer(vertices * vertex_size);
vertex_data.put(new float[] { -1f, -1f, 0f, });
vertex_data.put(new float[] { 1f, -1f, 0f, });
vertex_data.put(new float[] { 1f, 1f, 0f, });
vertex_data.flip();

FloatBuffer color_data = BufferTools.createFloatBuffer(vertices * color_size);
color_data.put(new float[] { 1f, 0f, 0f, });
color_data.put(new float[] { 0f, 1f, 0f, });
color_data.put(new float[] { 0f, 0f, 1f, });
color_data.flip();

vbo_vertex_handle = glGenBuffers();
glBindBuffer(GL_ARRAY_BUFFER, vbo_vertex_handle);
glBufferData(GL_ARRAY_BUFFER, vertex_data, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);

vbo_color_handle = glGenBuffers();
glBindBuffer(GL_ARRAY_BUFFER, vbo_color_handle);
glBufferData(GL_ARRAY_BUFFER, color_data, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
渲染VBO。 这是渲染VBO时需要调用的代码

glBindBuffer(GL_ARRAY_BUFFER, vbo_vertex_handle);
glVertexPointer(vertex_size, GL_FLOAT, 0, 0l);

glBindBuffer(GL_ARRAY_BUFFER, vbo_color_handle);
glColorPointer(color_size, GL_FLOAT, 0, 0l);

glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);

glDrawArrays(GL_TRIANGLES, 0, vertices);

glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);
glBindBuffer(GL_ARRAY_BUFFER, vbo_vertex_handle);
glVertexPointer(vertex_size, GL_FLOAT, 0, 0l);

glBindBuffer(GL_ARRAY_BUFFER, vbo_color_handle);
glColorPointer(color_size, GL_FLOAT, 0, 0l);

glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_COLOR_ARRAY);

glDrawArrays(GL_TRIANGLES, 0, vertices);

glDisableClientState(GL_COLOR_ARRAY);
glDisableClientState(GL_VERTEX_ARRAY);