C++ OpenGL:为什么我不能访问另一帧中的数据?
我使用GLEW创建OpenGL上下文,使用“标准”win32创建窗口 如果我在每一帧设置VBO和VAO(两个全局变量),那么我的几何体将正确渲染。程序和位置都是全局的,并在循环发生之前设置C++ OpenGL:为什么我不能访问另一帧中的数据?,c++,winapi,opengl,graphics,C++,Winapi,Opengl,Graphics,我使用GLEW创建OpenGL上下文,使用“标准”win32创建窗口 如果我在每一帧设置VBO和VAO(两个全局变量),那么我的几何体将正确渲染。程序和位置都是全局的,并在循环发生之前设置 while (!done) { PeekMessage(&msg, hwnd, NULL, NULL, PM_REMOVE); if (msg.message == WM_QUIT) done = true; e
while (!done)
{
PeekMessage(&msg, hwnd, NULL, NULL, PM_REMOVE);
if (msg.message == WM_QUIT)
done = true;
else
{
glClear(GL_COLOR_BUFFER_BIT);
glGenVertexArrays(1, &vao);
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(positions), positions, GL_STATIC_DRAW);
glBindVertexArray(vao);
glVertexAttribBinding(0, vao);
glVertexArrayVertexBuffer(vao, 0, vbo, 0, sizeof(glm::vec4));
glVertexArrayAttribFormat(vao, 0, 4, GL_FLOAT, GL_FALSE, 0);
glEnableVertexAttribArray(0);
glUseProgram(program);
glDrawArrays(GL_TRIANGLES, 0, 3);
glBindVertexArray(0);
glUseProgram(0);
SwapBuffers(g_HDC);
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return msg.wParam;
}
但是,我希望在渲染块外部初始化VBO/VAO,而不是每帧绑定VAO。这是我目前拥有的,但我仍然无法让它工作。渲染的只是一个黑屏
glGenVertexArrays(1, &vao);
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, sizeof(positions), positions, GL_STATIC_DRAW);
glBindVertexArray(vao);
glVertexAttribBinding(0, vao);
glVertexArrayVertexBuffer(vao, 0, vbo, 0, sizeof(glm::vec4));
glVertexArrayAttribFormat(vao, 0, 4, GL_FLOAT, GL_FALSE, 0);
glEnableVertexAttribArray(0);
glBindVertexArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
while (!done)
{
PeekMessage(&msg, hwnd, NULL, NULL, PM_REMOVE);
if (msg.message == WM_QUIT)
done = true;
else
{
glClear(GL_COLOR_BUFFER_BIT);
glUseProgram(program);
glBindVertexArray(vao);
glDrawArrays(GL_TRIANGLES, 0, 3);
glBindVertexArray(0);
glUseProgram(0);
SwapBuffers(g_HDC);
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
return msg.wParam;
}
我的印象是,一旦设置了缓冲区数据,它将是永久的,直到显式删除?我是不是遗漏了什么
非常感谢所有帮助。将缓冲区绑定到顶点缓冲区绑定点,但不绑定到属性索引。绑定点和属性索引之间的关联通过以下方式建立:
glVertexAttribBinding(0,vao)代码>
glVertexAttribBinding(0,0);
DSA版本分别为:
glvertexarrayattribbbinding(vao,0,0);
将缓冲区绑定到顶点缓冲区绑定点,但不绑定到属性索引。绑定点和属性索引之间的关联通过以下方式建立:
glVertexAttribBinding(0,vao)代码>
glVertexAttribBinding(0,0);
DSA版本分别为:
glvertexarrayattribbbinding(vao,0,0);
谢谢!我明白为什么第一个参数是0,但为什么是第二个?您链接的文档中描述的绑定索引是什么?@ConnorHemingway请阅读。对这个问题的完美回答详细解释了一切。在这里重新做一遍,甚至复制/粘贴都没有意义。谢谢!我明白为什么第一个参数是0,但为什么是第二个?您链接的文档中描述的绑定索引是什么?@ConnorHemingway请阅读。对这个问题的完美回答详细解释了一切。在这里重新做一遍,甚至复制/粘贴都没有意义。