c++ - 冗余顶点缓冲区导致 OpenGL 无法正确绘制

标签 c++ opengl render glfw vertex-buffer

我目前正在学习 C++ 中的 GFLW 和 OpenGL,我遇到了一个非常奇怪的错误,我真的无法弄清楚它为什么会发生。我有两个顶点缓冲区,一个包含三角形的数据,另一个包含立方体的数据。当我为三角形创建顶点缓冲区并在不为立方体创建顶点缓冲区的情况下绘制它时,它可以完美地工作并将预期的三角形绘制到窗口。但是,如果我创建第二个顶点缓冲区并再次仅绘制三角形,它就会变形。

只创建三角形Vertex Buffer时的输出: enter image description here

同时创建三角形顶点缓冲区和立方体顶点缓冲区时的输出(从不使用立方体顶点缓冲区)

enter image description here

顶点缓冲区的构造函数

    VertexBuffer(const GLvoid *data, GLsizeiptr size, GLenum mode, GLsizei count, GLsizei stride, ShaderInterface *shader, GLvoid *positionOffset, GLvoid *normalOffset);

创建两个顶点缓冲区:

    VertexBuffer *vertexBuffer=new VertexBuffer(vertices,sizeof(vertices),
                                            GL_TRIANGLES,
                                            3,
                                            sizeof(GL_FLOAT)*3,
                                            shaderArray->at(0),
                                            NULL,
                                            NULL);
vertexBufferArray->push_back(vertexBuffer);
VertexBuffer *cubeVertexBuffer=new VertexBuffer(cubeVertices,
                                                sizeof(cubeVertices),
                                                GL_TRIANGLES,
                                                36,sizeof(VertexDataPN),
                                                shaderArray->at(1),
                                                (GLvoid*)(offsetof(VertexDataPN,positionCoordinates)),
                                                (GLvoid*)(offsetof(VertexDataPN,normalCoordinates)));
//vertexBufferArray->push_back(cubeVertexBuffer);

以及我的 Vertex Buffer 类的构造函数的内容:

glGenBuffers(1,&vertexBufferID);
glBindBuffer(GL_ARRAY_BUFFER,vertexBufferID);
glBufferData(GL_ARRAY_BUFFER,size,data,GL_STATIC_DRAW);

另外,我已经检查过它们的 vertexBufferID 是不同的。 Cube Vertex Buffer 在创建后永远不会被使用或引用。如果有人知道为什么会发生这种情况,请告诉我。

最佳答案

OpenGL 是基于状态的,这意味着在初始化期间更改 OpenGL 内部状态的对象可能会影响其行为,即使它们随后没有被使用。

您正在顶点缓冲区构造函数中调用 glBindBuffer,这意味着除非您稍后调用 glBindBuffer,否则最近绑定(bind)的缓冲区(立方体)将保持绑定(bind)到 GL_ARRAY_BUFFER 并将在渲染期间使用。

在调用 glVertexAttribPointer 之前,您需要更改绘图代码以使用您打算使用的缓冲区(例如三角形缓冲区)调用 glBindBuffer。

关于c++ - 冗余顶点缓冲区导致 OpenGL 无法正确绘制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29053691/

相关文章:

c++ - 我的 Visual C++ 程序可以监听它自己的调试输出吗?

c++ - 在 C++ 中为 enum 分配一个 int 值,反之亦然

c++ - 使用 Visual C++ 在 Opengl 中创建 3D 球体

opengl - Mandelbrot 在片段着色器版本 330 中设置

grails - 呈现 View ,但gsp中没有对象

reflection - BRDF 通常是如何实现的?

c++ - 在 boost for_each 中运行成员函数 vector

c++ - 在派生的 QObject 构造函数中连接 Qt 信号和槽

c++ - 将 freetype 位图复制到 opengl 纹理时出现问题

ios - 如何使用 CGPDF 获取 PDF 目标