【发布时间】:2021-02-21 21:07:53
【问题描述】:
我正在使用 GLEW 创建 OpenGL 上下文并使用“标准”win32 创建窗口。
如果我每帧设置我的 VBO 和 VAO(都是全局变量),那么我的几何图形会正确渲染。程序和位置都是全局的,并在此循环发生之前设置。
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;
}
我的印象是,一旦设置了缓冲区数据,在明确删除之前它是永久的?我在这里遗漏了什么吗?
非常感谢所有帮助。
【问题讨论】:
标签: c++ winapi opengl graphics