Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ glBindBuffer中参数的顺序_C++_Opengl 3 - Fatal编程技术网

C++ glBindBuffer中参数的顺序

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

我正在创建一个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引用()指出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
,以及其他固定管道属性都不推荐使用。