这是一个奇怪的问题。我有一个功能:
void drawLines(std::vector<GLfloat> lines) {
glBindVertexArray(VAO2);
//positions
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (void*)0);
glEnableVertexAttribArray(0);
//colors
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 6 * sizeof(GLfloat), (void*)(3 * sizeof(GLfloat)));
glEnableVertexAttribArray(1);
glBindBuffer(GL_ARRAY_BUFFER, VBO2);
glBufferData(GL_ARRAY_BUFFER, sizeof(lines[0]) * lines.size(), &lines[0], GL_STATIC_DRAW);
glUseProgram(pShaderProgram);
glDrawArrays(GL_TRIANGLES, 0, lines.size() / 6);
}
Run Code Online (Sandbox Code Playgroud)
它绘制指定粗细的线条(这是内置于数据中的,其中lines包含三个浮点数用于位置,三个浮点数用于颜色,每个点有超过 200 个点来标记线条结尾)。SwapBuffers(HDC)即使在使用and之后,调用该函数一次也不会产生任何结果glFlush()。但是,当我调用该函数两次时,一切都会显示出来。我怀疑我在通过渲染管道推送缓冲区时遗漏了一些细微差别,这可能通过多次绑定缓冲区来激活。我不确定。有什么想法吗?
glVertexAttribPointer需要绑定到绑定点的缓冲区GL_ARRAY_BUFFER,以便在通用顶点属性和从中获取数据的缓冲区对象之间建立关联。
但是,您可以在调用glBindBuffer(GL_ARRAY_BUFFER, VBO2) 后绑定缓冲区glVertexAttribPointer。
这就是为什么您需要两次调用,因为第一次调用不会将任何缓冲区对象关联到通用顶点属性,因为之前可能没有绑定缓冲区。
然而,您使用 VAO 的方式是值得怀疑的,因为您在此方法/函数中所做的一切都已经被保存为 VAO 状态。因此,您不需要每次都重新建立通用顶点属性和缓冲区对象之间的关联,也不需要每次绘制时都启用通用顶点属性。
所有这些都可以在为 VAO 指定顶点时完成一次。
| 归档时间: |
|
| 查看次数: |
221 次 |
| 最近记录: |