【问题标题】:Redundant Vertex Buffer causing OpenGL to not draw correctly导致 OpenGL 无法正确绘制的冗余顶点缓冲区
【发布时间】:2015-05-17 04:50:32
【问题描述】:

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

仅创建三角形顶点缓冲区时的输出:

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

顶点缓冲区的构造函数

    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 在创建后就永远不会被使用或引用。如果有人知道为什么会发生这种情况,请告诉我。

【问题讨论】:

    标签: c++ opengl render glfw vertex-buffer


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-01
      • 1970-01-01
      相关资源
      最近更新 更多