两个不同的对象 OpenGL.VAO VBO IBO 网格失真问题
Two Different Objects OpenGL. VAO VBO IBO Issue with mesh distortion
我正在尝试创建两个要同时渲染的独立对象,一个立方体和一个球体。问题是一旦我添加了球体的代码,立方体缺少一些面孔等。
这是我的代码:
glGenBuffers(1, &g_VBO);
glBindBuffer(GL_ARRAY_BUFFER, g_VBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(Vertex)*g_numberOfVertices[0], g_pMeshVertices[0], GL_DYNAMIC_DRAW);
glGenBuffers(1, &g_IBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, g_IBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLint) * 3 * g_numberOfFaces[0], g_pMeshIndices[0], GL_DYNAMIC_DRAW);
glGenVertexArrays(1, &g_VAO);
glBindVertexArray(g_VAO);
glBindBuffer(GL_ARRAY_BUFFER, g_VBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, g_IBO);
glVertexAttribPointer(positionIndex, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), reinterpret_cast<void*>(offsetof(Vertex, position)));
glVertexAttribPointer(normalIndex, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), reinterpret_cast<void*>(offsetof(Vertex, normal)));
glEnableVertexAttribArray(positionIndex);
glEnableVertexAttribArray(normalIndex);
/////////////////////////////////////////ORN///////////////////////////////////////////////
glGenBuffers(1, &ornVBO);
glBindBuffer(GL_ARRAY_BUFFER, ornVBO);
glBufferData(GL_ARRAY_BUFFER, sizeof(Vertex)*g_numberOfVertices[1], g_pMeshVertices[1], GL_DYNAMIC_DRAW);
glGenBuffers(1, &ornIBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ornIBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLint) * 3 * g_numberOfFaces[1], g_pMeshIndices[1], GL_DYNAMIC_DRAW);
glGenVertexArrays(1, &ornVAO);
glBindVertexArray(ornVAO);
glBindBuffer(GL_ARRAY_BUFFER, ornVBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ornIBO);
glVertexAttribPointer(positionIndex, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), reinterpret_cast<void*>(offsetof(Vertex, position)));
glVertexAttribPointer(normalIndex, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), reinterpret_cast<void*>(offsetof(Vertex, normal)));
glEnableVertexAttribArray(positionIndex);
glEnableVertexAttribArray(normalIndex);
所以它使球体变得精细,但是所有的立方体都缺少三角形面。我想我已经把它缩小到IBO方面的一个问题,但我不能完全弄清楚。
这是图像: https://puu.sh/vLBSm/1617b5d996.png
在球体和立方体旁边和后面是其他立方体忽略这些,它们有同样的问题,但故意在那里。我只是无法弄清楚如何正确显示两者。我确定它与此有关:
glGenBuffers(1, &ornIBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ornIBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLint) * 3 * g_numberOfFaces[1], g_pMeshIndices[1], GL_DYNAMIC_DRAW);
glGenVertexArrays(1, &ornVAO);
在 ORN 代码中,您正在重写第一个 VAO 的索引缓冲区绑定。
此时:
glGenBuffers(1, &ornIBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ornIBO);
g_VAO
仍处于活动状态,因此索引缓冲区绑定将替换为 ornIBO
。要解决这个问题,您应该在启动 ORN 代码之前取消绑定g_VAO
:
glBindVertexArray(g_VAO);
glBindBuffer(GL_ARRAY_BUFFER, g_VBO);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, g_IBO);
glVertexAttribPointer(positionIndex, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), reinterpret_cast<void*>(offsetof(Vertex, position)));
glVertexAttribPointer(normalIndex, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), reinterpret_cast<void*>(offsetof(Vertex, normal)));
glEnableVertexAttribArray(positionIndex);
glEnableVertexAttribArray(normalIndex);
//Unbind!!
glBindVertexArray(0);
相关文章:
- VBO必须在VAO之后绑定
- 我们是否需要序列化 VAO 和 VBO
- OpenGL VAO VBO resize
- glVertexAttribDivisor 存储在哪里 - VAO、VBO 或全局状态?
- 为什么VAO可以使用VBO数据绑定它?
- 两个不同的对象 OpenGL.VAO VBO IBO 网格失真问题
- 如何使用多个VAO和VBO在OpenGL中绘制多个对象
- GLSL着色器不渲染任何内容,VAO已填充,VBO已填充顶点
- Opengl VAO and VBO objects
- c++OpenGL发布用存储在对象中的vbo和vao绘制网格
- OpenGL VAO VBO 着色器混淆
- 在3.2中使用VAO和VBO绘制OpenGL线条和正方形
- vao如何知道哪些vbo/ibo被绑定到它?
- 每个着色器属性的VBO没有VAO,或不同的方法
- OPEN GL:这是使用VBO、IBO和VAO的正确方式吗?
- VAO/VBO管理-更改所有VBO数据
- OpenGL - glVertexAttribPointer与多个vbo和vao使用相同的着色器
- 一个VBO可以绑定多个vao
- 如何在体素引擎中正确使用VAO和VBO
- OpenGL -正确分离VAO定义从VBO和其他缓冲区的创建