【发布时间】:2013-12-23 09:24:28
【问题描述】:
我一直在实现一个基于本教程的小型 opengl 应用程序: http://openglbook.com/the-book/chapter-4-entering-the-third-dimension/
我了解大部分代码,但我对这一行感到非常困惑:
glGenBuffers(2, &BufferIds[1]);
然后是
glBindBuffer(GL_ARRAY_BUFFER, BufferIds[1]);
glBufferData(GL_ARRAY_BUFFER, size, &theModel->theMesh.pos[0], GL_STATIC_DRAW);
我假设我只需要一个空闲名称/ID 来绑定我的缓冲区数据,但如果我改变了
glGenBuffers(2,
到
glGenBuffers(1,
缓冲区绑定失败,没有任何效果。
BufferIds 的大小为 3 (GLuint BufferIds[3])。我想使用 VAO 的第一个插槽和 VBO 的第二个插槽使其成为 BufferIds[2]。
glGenVertexArrays(1, &BufferIds[0]);
ExitOnGLError("ERROR: Could not generate the VAO");
glBindVertexArray(BufferIds[0]);
ExitOnGLError("ERROR: Could not bind the VAO");
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
glEnableVertexAttribArray(2);
ExitOnGLError("ERROR: Could not enable vertex attributes");
glGenBuffers(2, &BufferIds[1]); //if this gets from changed 2 to 1 ...
ExitOnGLError("ERROR: Could not generate the buffer objects");
int size = theModel->theMesh.pos.size() * sizeof(theModel->theMesh.pos[0]) ;
glBindBuffer(GL_ARRAY_BUFFER, BufferIds[1]);
ExitOnGLError("ERROR: Could not bind the VBO to the VAO"); // ...this error triggers
glBufferData(GL_ARRAY_BUFFER, size, &theModel->theMesh.pos[0], GL_STATIC_DRAW);
【问题讨论】:
-
旁注:我建议使用不同的变量名称。使用
BufferIds存储缓冲区和顶点数组的 ID 不会通过我的代码审查。 -
我同意 BufferIds 的名称,它不是我在教程中的名称,一旦我开始工作并了解发生了什么,我将重新编写它。我只需要知道如何编写干净的代码。
-
说真的,这比你所说的数组更深刻。在 OpenGL 3 中,名称与它们的功能相关联。在此之前,如果需要,您可以使用
glGenTextures (...)生成的名称(或随机选择的唯一无符号整数值)来识别 VBO。您不想创建一个名称服务完全不同的函数的数组,因为如果您忘记了哪个索引属于哪种类型的对象,那么您在 GL3 中剩下的就是一个无意义的无符号整数数组;你甚至无法使用glIs___来确定是什么。 -
因为 VAO 的集合可能有一个名称 23,而所有分配的 VBO 的集合也可能有一个名称 23。
glIsVertexArray (...)将为名称 23 返回 true,glIsVertexBuffer (...)也是如此。每组对象类型都有自己的可能重叠的名称池。