Java VBO&x27;openGL中的s

Java VBO&x27;openGL中的s,java,opengl,lwjgl,vbo,Java,Opengl,Lwjgl,Vbo,我目前正在学习使用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 t

我目前正在学习使用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\u COLOR\u ARRAY
,而从未提供任何数据。我注意到,在while循环中,有以下代码块:

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

glBindBuffer(GL_ARRAY_BUFFER, vboColorHandle);
glVertexPointer(colorSize, GL_FLOAT, 0, 0L);
请注意,最后一行也是
glvertexinter
?这应该是
glColorPointer
,以指定绑定缓冲区中的数据用于
GL\u COLOR\u数组
,而不是
GL\u VERTEX\u数组


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

在绑定之前,我会尝试移动
glEnableClientState
调用,并将第二个
glVertexPointer
更改为
glColorPointer
@Robert为什么不将其作为答案发布?@AndreasHaferburg,因为我在浏览代码时发现的这两个bug可能与他所遇到的问题有关,也可能与他所遇到的问题无关。我也正要离开,这时我看到了这个问题,所以我写下了一个非常简短的答案,没有解释为什么这可能是他的问题。我想我现在要写一个完整的答案…这是GL_顶点数组,应该是GL_颜色数组,这似乎是这里的错误。