C++ 带ebo的openglvao
我目前正在空闲时间学习OpenGL,最近我遇到了一个我不理解的“错误” 问题是,我没有任何错误,只是屏幕上没有显示任何内容。我正在使用OpenGL和SFML 这是我的密码。以下是我的方法:C++ 带ebo的openglvao,c++,opengl,vbo,vao,C++,Opengl,Vbo,Vao,我目前正在空闲时间学习OpenGL,最近我遇到了一个我不理解的“错误” 问题是,我没有任何错误,只是屏幕上没有显示任何内容。我正在使用OpenGL和SFML 这是我的密码。以下是我的方法: void CreateObjet(GLuint& vao, GLuint& vbo, GLuint& ebo, GLuint& textureLocation) //I create my arrays here.. Don't worry they are fine. C
void CreateObjet(GLuint& vao, GLuint& vbo, GLuint& ebo, GLuint& textureLocation)
//I create my arrays here.. Don't worry they are fine.
CreateTexture(textureLocation);
glGenBuffers(1, &vbo);
glGenBuffers(1, &ebo);
glGenVertexArrays (1, &vao);
glBindVertexArray (vao); //On travaille dans le VAO
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData (GL_ARRAY_BUFFER, sizeof(points), points, GL_STATIC_DRAW);
glVertexAttribPointer (0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), NULL);
glEnableVertexAttribArray(0);
glBufferData (GL_ARRAY_BUFFER, sizeof(colors), colors, GL_STATIC_DRAW);
glVertexAttribPointer (1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)(3* sizeof(GLfloat)));
glEnableVertexAttribArray(1);
glBufferData (GL_ARRAY_BUFFER, sizeof(texCoords), texCoords, GL_STATIC_DRAW);
glVertexAttribPointer (2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), (GLvoid*)(6* sizeof(GLfloat)));
glEnableVertexAttribArray(2);
//EBO
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indiceFinal), indiceFinal, GL_STATIC_DRAW);
glBindVertexArray(0);
我知道我的问题不在于着色器,因为我使用GlshaderRiv()在控制台中没有收到任何错误
我想知道我的订单做得是否正确
这看起来绝对不对。您正在将所有属性的值写入同一缓冲区,每个属性都会覆盖上一个:
glBufferData (GL_ARRAY_BUFFER, sizeof(points), points, GL_STATIC_DRAW);
glVertexAttribPointer (0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(GLfloat), NULL);
glEnableVertexAttribArray(0);
glBufferData (GL_ARRAY_BUFFER, sizeof(colors), colors, GL_STATIC_DRAW);
...
当您进行第二次glBufferData()
调用时,它将用颜色
数据覆盖先前存储在缓冲区中的点
数据
误解可能是关于glvertexattributepointer()
的作用。它指定给定属性来自哪个缓冲区,以及数据布局(组件计数、类型等)。但它不会创建缓冲区数据的副本或类似的内容。绘制调用时,要使用的属性数据仍必须存储在缓冲区中
要解决此问题,您必须为每个属性使用不同的缓冲区,或者排列属性数据,以便所有3个属性的值都可以存储在同一缓冲区中。glVertexAttribPointer()
调用的参数实际上表明,您打算将所有交织的属性值存储在同一缓冲区中。要使其正常工作,您必须相应地排列属性值,然后通过一个glBufferData()
调用将它们存储在缓冲区中
为此需要的内存安排将依次包含第一个顶点的所有属性值,然后是第二个顶点的值等。使用pi
顶点的位置i
,ci
颜色和ti
纹理坐标,正确的内存布局为:
p0x p0y p0z c0r c0g c0b t0s t0t
p1x p1y p1z c1r c1g c1b t1s t1t
p2x p2y p2z c2r c2g c2b t2s t2t
...
glBindVertexArray(&vao)
肯定是错误的,因为这是变量的地址,而不是对象的名称。还有,为什么你认为不绑定VAO可以节省内存?你说的我都做了。我创建了两个新的缓冲区,生成了它们,然后正确地完成了我的订单。遗憾的是,我仍然没有在屏幕上显示任何内容:(