java - LWJGL - 出现错误 : "Cannot use offsets when Element Array Buffer Object is disabled"

标签 java opengl lwjgl arraybuffer

我正在尝试在 LWJGL (Java) 中渲染一个基本的立方体。但程序不断崩溃,告诉我“当元素数组缓冲区对象被禁用时无法使用偏移量”。我猜这不是这里的确切错误,可能还有一些不那么明显的错误。

(实际上,我用 C++ 编写了即将向您展示的代码,并且运行得非常好)

初始化函数(调用一次)

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);
//                    ,-- position in layout (see shader)
//                    |  ,-- Nb of component per vertex (2 for 2D (x, y))
//                    |  |                 ,-- Normalized ? (between 0 - 1)
//                    |  |                 |      ,-- Offset between things (size of a line)
//                    |  |                 |      |                ,- 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 core

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;
}

最佳答案

以下几行

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 仅存储未绑定(bind)时设置的最后状态。这意味着您对 glDisableVertexAttribArray 的调用将禁用 VAO 的属性。您应该将此调用移到 GL30.glBindVertexArray(0); 之后

关于java - LWJGL - 出现错误 : "Cannot use offsets when Element Array Buffer Object is disabled",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26937307/

相关文章:

java - LWJGL 和 Nuklear 无法在英特尔显卡上正确渲染

java - LWJGL 端口到 android

linux - wglGetProcAddress/glXGetProcAddress 如何与图形驱动程序通信?

opengl - 线程过剩 : glutPostRedisplay being ignored

java - Android 首选项屏幕布局

java - 当必须始终捕获异常时,Java 程序怎么会崩溃?

macos - Mac OS X 10.6 中的 OpenGL 对象有光泽/ Shiny ,但 10.5 则不然。为什么?

java - 缓冲 VBO 数据的小延迟

java - wsimport - 两个声明导致冲突,给定同一行

java - 从Excel传递数据时如何将double值转换为int