OpenGL VAO未按预期工作

时间:2017-03-31 08:41:54

标签: c++ opengl

根据我的理解,VAO应该存储渲染所需的状态,如缓冲区和属性指针。 但我遇到的问题是,我需要设置VAO并在每次渲染之前将数据加载到缓冲区,否则所绘制的内容是错误的。

我正在使用一个名为mesh的类,它将VAO和VBO句柄保存为受保护的GLuint变量,以初始化并将顶点数据加载到GPU中。

我搜索了几个小时,但它接缝没有其他人遇到同样的问题。

所以,如果我像这样初始化并像这样渲染:

mesh coneMesh, sphereMesh, boxMesh;

coneMesh.setup(coneVertex, GL_STATIC_DRAW, 1, ShaderA);
sphereMesh.setup(*sphereVertex, GL_STATIC_DRAW,1, ShaderA);
boxMesh.setup(boxVertex, GL_STATIC_DRAW, 1, ShaderA);

并在渲染循环中:

//sphereMesh.setup(*sphereVertex, GL_STATIC_DRAW,1, ShaderA);
sphereMesh.render(GL_TRIANGLE_STRIP,0,sphereVertex->size(),0);
sphereMesh.render(GL_TRIANGLE_STRIP,0,sphereVertex->size(),1);

//coneMesh.setup(coneVertex, GL_STATIC_DRAW, 1, ShaderA);
glPolygonMode( GL_FRONT_AND_BACK, GL_LINE);
coneMesh.render(GL_TRIANGLE_STRIP,0,coneVertex.size(),2);
glPolygonMode( GL_FRONT_AND_BACK, GL_FILL);

//boxMesh.setup(boxVertex, GL_STATIC_DRAW, 1, ShaderA);
boxMesh.render(GL_LINE_LOOP, 0, boxVertex.size());


glfwSwapBuffers(window);

如果我拿出评论并重新初始化VAO并重新加载数据,每件事情都能完美运作,有人可以告诉我我做错了什么以及如何修复它?谢谢

int mesh::setup(std::vector<vertex> &vert, GLenum BufferDataUsage, GLuint        nuberOfAttribute, shader &shad)
{

this->nuberOfAttribute = nuberOfAttribute;
this->shad = &shad;

std::vector<glm::vec3> position;
std::vector<glm::vec2> textureCoord;

position.reserve(vert.size());
textureCoord.reserve(vert.size());

for(unsigned int i; i<vert.size(); i++)
{
    position.push_back(vert[i].pos());
    textureCoord.push_back((vert[i].textureCoordinate));
}

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

glGenBuffers(1,&vbo[0]);
glBindBuffer(GL_ARRAY_BUFFER,vbo[0]);
glBufferData(GL_ARRAY_BUFFER,(GLsizeiptr)vert.size() * sizeof (position[0]), &position[0], BufferDataUsage);
glEnableVertexAttribArray(0);
glVertexAttribPointer ( ( GLuint ) 0, 3, GL_FLOAT, GL_FALSE,0,0);


glBindBuffer(GL_ARRAY_BUFFER,0);
glBindVertexArray(0);

std::cout <<vbo[0]<<std::endl;
return 0;
}

渲染功能:

void mesh::render(GLenum DrawHint,  GLint first,GLsizei count)
{
shad->bind();//glUseProgram(id)
//set up transform matrix and set up uniform

glBindVertexArray(vao);
glDrawArrays(DrawHint, first, count);
glBindVertexArray(0); 

修改

1.)我已经在另一台机器上运行了代码,但问题并没有消失。所以它可能不是驱动程序错误。

2.)我可以确认不同的VAO和VBO没有互相覆盖,因为每个VAO和VBO上的句柄都是唯一的。

3。)现在我不知道什么可能导致这个问题。

1 个答案:

答案 0 :(得分:0)

glBindBuffer(GL_ARRAY_BUFFER,0);
glBindVertexArray(0);

取消绑定VBO必须在>取消绑定VAO之后,否则VAO会记住你的VBO没有绑定。

修改

正如评论中所指出的,在取消绑定VAO之前取消绑定GL_ARRAY_BUFFER是可以的。 GL_ELEMENT_ARRAY_BUFFER没有问题,但在这个例子中没有使用。

因此,问题必须在其他地方。