C++ glBindBuffer中参数的顺序
我正在创建一个VBO,用数据填充它,然后使用以下代码呈现该数据:C++ glBindBuffer中参数的顺序,c++,opengl-3,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_FL
// 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引用()指出glBindBuffer函数采用目标类型的缓冲区,然后是缓冲区ID,而不是相反。当我把它们放在那样的位置上时,没有任何东西会吸引到屏幕上,然而当它们放在“错误”的位置上时,它似乎工作得很好
澄清:
// Should be this
glBindBuffer(GL_ARRAY_BUFFER, VBOID);
// Only this works
glBindBuffer(VBOID, GL_ARRAY_BUFFER);
我觉得这是一个非常愚蠢的问题,但我就是看不出问题在哪里。有人能解释一下情况吗
谢谢。一定要这样写:
glBindBuffer(GL_ARRAY_BUFFER, VBOID);
我无法解释为什么反转这些参数会导致成功的绘图。但是,代码中有一些奇怪之处需要修改:
glVertexPointer(3, GL_FLOAT, 0, buffer);
这是即时模式代码。我不认为有人反对它,但写这篇文章的正确方法是
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(GLfloat) * 3, nullptr);
最重要的是,您有两个对设置客户端状态的引用-glEnableClientState(GL_VERTEX_ARRAY)代码>和glDisableClientState(GL\u顶点\u数组)代码>-这些也是即时模式的一部分,应该删除
最后,整个过程应该封装在顶点数组对象中,如下所示:
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.
啊,谢谢。你永远不知道,那可能会有所不同。什么特别限定立即模式?我以为这只是使用glBegin()和glEnd()绘制的几何体?glVertexPointer
以及GLCOLORPOINT
、GLNORMAPOInter
,以及其他固定管道属性都不推荐使用。