C++ OpenGL,为什么顶点数组不绑定顶点缓冲区?

马克西姆

我很确定顶点数组没有绑定顶点缓冲区,因为如果我注释掉取消绑定顶点缓冲区的行,它就可以正常工作,这表明顶点数组没有正确绑定顶点缓冲区。这是代码(程序和窗口有一些抽象,但与问题无关):

GLuint va;
glGenVertexArrays(1, &va);
glBindVertexArray(va);

GLuint vb;
glGenBuffers(1, &vb);
glBindBuffer(GL_ARRAY_BUFFER, vb);

glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, (2 + 3) * sizeof(float), nullptr);
glBindAttribLocation(program.id(), 0, "i_position");
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, (2 + 3) * sizeof(float), (const void*)(2 * sizeof(float)));
glBindAttribLocation(program.id(), 1, "i_color");

glBindVertexArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0); //< if this line is commented out it works perfectly fine

program.bind();

while(window->isOpen())
{
    glfwPollEvents();

    glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    glClear(GL_COLOR_BUFFER_BIT);

    glBindVertexArray(va);
    glBufferData(GL_ARRAY_BUFFER, 3 * (2 + 3) * sizeof(float), vertexes, GL_DYNAMIC_DRAW);
    glDrawArrays(GL_TRIANGLES, 0, 3);

    window->update();
}

有人知道我做错了什么吗?

BDL

VAO 不存储缓冲区绑定。它只存储哪个缓冲区绑定到哪个属性。如果您需要缓冲区绑定本身(例如, for glBufferData),则必须自己绑定缓冲区。

另请注意,glBindAttribLocation必须链接程序对象之前调用它

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

多个顶点缓冲区 OpenGL C++

OpenGL更新顶点数组/缓冲区

OpenGL忽略绑定的顶点缓冲区

c + +和DX11中的动态常量缓冲区或动态顶点缓冲区

OpenGL顶点数组对象是存储顶点缓冲区名称和索引,还是仅存储索引?

DirectX:如果绑定索引缓冲区而不绑定顶点缓冲区,将会发生什么?

为什么在调用glDrawArrays之前不需要绑定顶点缓冲区对象?

顶点数组GLFW崩溃C ++程序

OpenGL绘制顶点缓冲区对象

C ++为什么仍然还有输入缓冲区?

gl.drawElements如何“查找”相应的顶点数组缓冲区?

OpenGL顶点缓冲区绑定点可以在不同的VAO之间重用吗?

合并顶点缓冲区

为什么在C#7.2的结构中不能同时使用只读缓冲区和固定大小缓冲区

C中缓冲区数组的使用

C:什么是缓冲区下溢?

动态打包OpenGL顶点缓冲区对象的数据

OpenGL 4向顶点缓冲区提供数据

OpenGL无法使用VAO过程更新顶点缓冲区

OpenGL顶点缓冲区不正确渲染

冗余顶点缓冲区导致OpenGL无法正确绘制

如何更改opengl中放入顶点缓冲区的值?

如何在绑定顶点数组对象和缓冲区数据以在渲染时动态绘制时编写通用的 webgl 渲染循环?

顶点缓冲区绑定索引和统一缓冲区绑定点?

为什么绑定OpenGL缓冲区对象?

顶点缓冲区的渲染数组OenGL ES2

OpenGL-从顶点着色器访问缓冲区中的下3个顶点

C API:为什么函数使用带有缓冲区+大小的returnParameters而不是返回char *

为什么会出现缓冲区溢出?我怎样才能避免它?[C++]