LWJGL - 获取错误:"禁用元素阵列缓冲区对象时不能使用偏移量"

时间:2014-11-14 19:18:28

标签: java opengl lwjgl arraybuffer

我正在尝试在LWJGL(Java)中渲染基本多维数据集。但是程序一直在崩溃,告诉我“当元素阵列缓冲区对象被禁用时不能使用偏移”。我猜这不是确切的错误,并且可能有一些不那么明显的事情。

(我实际上做了我要用C ++向你展示的代码并且它工作得很好)

Init函数(调用一次)

FloatBuffer vertices = BufferUtils.createFloatBuffer(4 * 5);
    vertices.put(new float[]{
            // pos                  // Color
            0.5f, 0.5f,             1.0f, 0.0f, 0.5f,
            0.5f, -0.5f,            0.5f, 0.0f, 0.75f,
            -0.5f, -0.5f,           0.0f, 1.0f, 0.0f,
            -0.5f, 0.5f,            0.5f, 0.5f, 1.0f
    });
    vertices.flip();

    indices = BufferUtils.createByteBuffer(2 * 3);
    indices.put(new byte[]{
            0, 1, 3,
            1, 2, 3
    });
    indices.flip();

    // VAO
    VAO = GL30.glGenVertexArrays();
    GL30.glBindVertexArray(VAO);

    // VBO
    VBO = glGenBuffers();
    glBindBuffer(GL_ARRAY_BUFFER, VBO);
    glBufferData(GL_ARRAY_BUFFER, vertices, GL_STATIC_DRAW);

    // IBO
    IBO = glGenBuffers();
    glBindBuffer(GL_ARRAY_BUFFER, IBO);
    glBufferData(GL_ARRAY_BUFFER, indices, GL_STATIC_DRAW);


    glBindBuffer(GL_ARRAY_BUFFER, VBO);

    glEnableVertexAttribArray(0);
    //                         v - position in layout (see shader)
    //                            v - Nb of component per vertex (2 for 2D (x, y))
    //                                                v - Normalized ? (between 0 - 1)
    //                                                       v - Offset between things (size of a line)
    //                                                                     v - Where to start ?
    glVertexAttribPointer(0, 2, GL11.GL_FLOAT, false, 5 * Float.SIZE , 0);
    glDisableVertexAttribArray(0);
    glEnableVertexAttribArray(1);
    glVertexAttribPointer(1, 3, GL11.GL_FLOAT, false, 5 * Float.SIZE , 2 * Float.SIZE);
    glDisableVertexAttribArray(1);

    glBindBuffer(GL_ARRAY_BUFFER, IBO);

    // Unbinds the VAO
    GL30.glBindVertexArray(0);

这里是渲染函数(现在是静态的,直到我想出来)

glUseProgram(shaderProgram.getID());

    GL30.glBindVertexArray(VAO);

// Error in the line bellow
    GL11.glDrawElements(GL11.GL_TRIANGLES, 4, GL11.GL_UNSIGNED_BYTE, 0);

    GL30.glBindVertexArray(0);

非常感谢一点帮助。另外,我可能是一个非常错误的东西,我不知道,所以如果你发现了一些很棒的东西。

谢谢

编辑:着色器(非常基本的)

顶点:     #version 330核心

layout(location = 0) in vec2 position;
layout(location = 1) in vec3 color;

out vec4 Color;

void main()
{
    gl_Position = vec4(position, 0.0, 1.0);
    Color = vec4(color, 1.0);
}

Framgent:

#version 330 core

in vec4 Color;

out vec4 color;

void main()
{
    color = Color;
}

1 个答案:

答案 0 :(得分:1)

以下行

IBO = glGenBuffers();
glBindBuffer(GL_ARRAY_BUFFER, IBO);
glBufferData(GL_ARRAY_BUFFER, indices, GL_STATIC_DRAW);

正在创建一个新的数组缓冲区。从您选择的名称和您复制的数据,我想这是您的索引缓冲区,因此应该是GL_ELEMENT_ARRAY_BUFFER类型。

错误信息告诉你的是,如果没有,你绘制命令不能使用0作为索引缓冲区的偏移量。

修复索引缓冲区后为什么没有绘制?

问题1:您只绘制了4个索引。如果要绘制2个三角形,则需要6个索引。

问题2:OpenGL是一个状态机,VAO只存储未绑定时设置的最后一个状态。这意味着您对glDisableVertexAttribArray的调用将禁用VAO的属性。您应该在GL30.glBindVertexArray(0);

之后移动此调用