c++ - 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();
}
有人知道我做错了什么吗?
解决方案
VAO 不存储缓冲区绑定。它只存储哪个缓冲区绑定到哪个属性。如果您需要缓冲区绑定本身(例如 for glBufferData
),则必须自己绑定缓冲区。
另请注意,必须在程序对象获取链接之前glBindAttribLocation
调用它。
推荐阅读
- r - Excel或VBA中是否有类似收集功能的东西?
- azure-devops - VS 2019 不断要求重新输入我的 Azure DevOps 凭据
- javascript - 这个递归函数是否存在设计问题?
- python - 获取完整页面的历史数据,雅虎财经
- python - 没有名为“main”的模块
- c++ - 静态成员变量,不允许有限定名
- python-3.x - 如果可能的话,如何提高以下 python 代码的时间复杂度,否则我可以将它全部放在一行而不是这个原始代码
- javascript - 在 React 中每两秒更改一次占位符文本
- swift - 为什么我的通知在 Swiftui 上不起作用
- c++ - ArrayList 作为模板化类