OpenGL VAO无法按预期工作
OpenGL VAO not working as intended
据我所知,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没有相互覆盖,因为它们上的句柄都是唯一的。
3.)现在我不知道什么可以解决这个问题。
glBindBuffer(GL_ARRAY_BUFFER,0);
glBindVertexArray(0);
解绑 VBO 必须在解绑 VAO之后进行,否则 VAO 会记住您的 VBO 未被绑定。
编辑
正如评论中指出的,在解除 VAO 的绑定之前可以取消绑定GL_ARRAY_BUFFER
。对于GL_ELEMENT_ARRAY_BUFFER
是不行的,但本例中未使用。
因此,问题必须出在别处。
相关文章:
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- OpenGL VAO无法按预期工作
- c++ /OpenGL: vao单独工作,但不能一起工作
- 当使用IBO/EBO时,只有当我在创建VAO之后调用glBindBuffer来绑定IBO/EB0时,程序才能工作