我正在创建一个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);
我觉得这是一个非常愚蠢的问题,但我不知道问题出在哪里。任何人都可以对这种情况有所了解吗?
感谢。
答案 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.