glBindBuffer中的参数顺序

时间:2016-03-25 16:01:19

标签: c++ opengl-3

我正在创建一个VBO,用数据填充它,然后使用以下代码呈现该数据:

// Buffer data
glGenBuffers(1, &VBOID);
glBindBuffer(VBOID, GL_ARRAY_BUFFER); // Shouldn't these be the other way around?
glBufferData(GL_ARRAY_BUFFER, bufferSize, buffer, GL_STATIC_DRAW);
glVertexPointer(3, GL_FLOAT, 0, buffer);

// Draw arrays
glBindBuffer(VBOID, GL_ARRAY_BUFFER);
glEnableClientState(GL_VERTEX_ARRAY);
glDrawArrays(GL_TRIANGLES, 0, bufferSize);
glDisableClientState(GL_VERTEX_ARRAY);

但是,openGL引用(https://www.opengl.org/sdk/docs/man/html/glBindBuffer.xhtml)表示glBindBuffer函数接受目标TYPE缓冲区,然后是缓冲区ID,而不是相反。当我以这种方式放置它们时,屏幕上没有任何东西,但是当它们出现“错误”时。方式,似乎工作得很好。

澄清:

// Should be this
glBindBuffer(GL_ARRAY_BUFFER, VBOID);
// Only this works
glBindBuffer(VBOID, GL_ARRAY_BUFFER);

我觉得这是一个非常愚蠢的问题,但我不知道问题出在哪里。任何人都可以对这种情况有所了解吗?

感谢。

1 个答案:

答案 0 :(得分:0)

绝对应该这样写:

glBindBuffer(GL_ARRAY_BUFFER, VBOID);

我无法解释为什么反转这些参数会导致成功绘图。但是,您需要修改代码中的一些奇怪之处:<​​/ p>

glVertexPointer(3, GL_FLOAT, 0, buffer);

这是立即模式代码。我不认为它已被弃用,但写这个的正确方法是

glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 3, nullptr);

最重要的是,您有两个关于设置客户端状态的引用 - glEnableClientState(GL_VERTEX_ARRAY);glDisableClientState(GL_VERTEX_ARRAY); - 这些也是立即模式的一部分,应该被删除。

最后,整个事情应该包含在Vertex数组对象中,如下所示:

glGenVertexArrays(1, &vao);
glBindVertexArray(vao);

glGenBuffers(1, &VBOID);
glBindBuffer(GL_ARRAY_BUFFER, VBOID); 
glBufferData(GL_ARRAY_BUFFER, bufferSize, buffer, GL_STATIC_DRAW);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 3, nullptr);
glEnableVertexAttribArray(0);

// Draw arrays
glBindVertexArray(vao);
glDrawArrays(GL_TRIANGLES, 0, num_of_vertices); //num_of_vertices is usually the number of floats in the buffer divided by the number of dimensions of the vertex, or 3 in this case, since each vertex is a vec3 object.