冗余顶点缓冲区导致 OpenGL 无法正确绘制
Redundant Vertex Buffer causing OpenGL to not draw correctly
我目前正在学习 C++ 中的 GFLW 和 OpenGL,我遇到了一个非常奇怪的错误,我真的无法弄清楚它为什么会发生。我有两个顶点缓冲区,一个包含三角形的数据,另一个包含立方体的数据。当我为三角形创建顶点缓冲区并在不为立方体创建顶点缓冲区的情况下绘制它时,它完美地工作并绘制到 window 预期的三角形。但是,如果我创建第二个顶点缓冲区并再次只绘制三角形,它就会变形。
只创建三角形Vertex Buffer时的输出:
同时创建三角形顶点缓冲区和立方体顶点缓冲区时的输出(从不使用立方体顶点缓冲区)
顶点缓冲区的构造函数
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);
以及我的顶点缓冲区的构造函数的内容class:
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,否则最近绑定的缓冲区(立方体)将保持绑定到 GL_ARRAY_BUFFER 并将在渲染期间使用。
在调用 glVertexAttribPointer 之前,您需要更改绘图代码以使用您打算使用的缓冲区(例如三角形缓冲区)调用 glBindBuffer。
我目前正在学习 C++ 中的 GFLW 和 OpenGL,我遇到了一个非常奇怪的错误,我真的无法弄清楚它为什么会发生。我有两个顶点缓冲区,一个包含三角形的数据,另一个包含立方体的数据。当我为三角形创建顶点缓冲区并在不为立方体创建顶点缓冲区的情况下绘制它时,它完美地工作并绘制到 window 预期的三角形。但是,如果我创建第二个顶点缓冲区并再次只绘制三角形,它就会变形。
只创建三角形Vertex Buffer时的输出:
同时创建三角形顶点缓冲区和立方体顶点缓冲区时的输出(从不使用立方体顶点缓冲区)
顶点缓冲区的构造函数
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);
以及我的顶点缓冲区的构造函数的内容class:
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,否则最近绑定的缓冲区(立方体)将保持绑定到 GL_ARRAY_BUFFER 并将在渲染期间使用。
在调用 glVertexAttribPointer 之前,您需要更改绘图代码以使用您打算使用的缓冲区(例如三角形缓冲区)调用 glBindBuffer。