【发布时间】:2015-07-27 18:42:22
【问题描述】:
我可以使用 glDrawArrays 成功绘制一个如下所示的场景:
这种技术有点慢,所以我决定制作一个 indexbuffer 并尝试使用 glDrawElements。结果如下所示:
如您所见,右上角的方块渲染不正确,飞机下方的方块消失了。
生成缓冲区的代码
//create vertex and index buffer
glGenBuffers(1, &gVertexBuffer);
glBindBuffer(GL_ARRAY_BUFFER, gVertexBuffer);
glGenBuffers(1, &gIndexBuffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, gIndexBuffer);
// Define the size of the buffers
GLuint floatAmount = 0;
GLuint GLuintAmount = 0;
for each (MeshObject* mesh in meshes)
{
floatAmount += mesh->GetFloatAmount();
GLuintAmount += mesh->GetGLuintAmount();
}
glBufferData(GL_ARRAY_BUFFER, floatAmount, 0, GL_STATIC_DRAW);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, GLuintAmount, 0, GL_STATIC_DRAW);
// Define size and offset of the different subdata in the buffers
GLuint offsetVer = 0;
GLuint offsetInd = 0;
for each (MeshObject* mesh in meshes)
{
// Set offset for mesh
mesh->SetOffset(offsetVer / sizeof(Point));
mesh->SetOffsetInd(offsetInd);
glBufferSubData(GL_ARRAY_BUFFER,
offsetVer,
mesh->GetFloatAmount(),
mesh->GetPoints().data());
glBufferSubData(GL_ELEMENT_ARRAY_BUFFER,
offsetInd,
mesh->GetGLuintAmount(),
mesh->GetIndicies().data());
offsetVer += mesh->GetFloatAmount();
offsetInd += mesh->GetGLuintAmount();
}
...以及渲染代码
glBindBuffer(GL_ARRAY_BUFFER, gVertexBuffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, gIndexBuffer);
mat4 vwMatrix = localCamera->GetPVMatrix() * mh->GetWorld();
glUniformMatrix4fv(projectionviewworldMatrixUniformLocation, 1, GL_FALSE, &(GLfloat)vwMatrix[0][0]);
//glDrawArrays(GL_TRIANGLES, mh->mesh->GetOffset(), mh->mesh->GetPoints().size());
glDrawElements(GL_TRIANGLES, mh->mesh->GetIndicies().size(), GL_UNSIGNED_INT, (void*)mh->mesh->GetOffsetInd());
//GLuint size = mh->mesh->GetIndicies().size();
//GLuint IndSize = mh->mesh->GetOffsetInd();
//glDrawElements(GL_TRIANGLES, size, GL_UNSIGNED_INT, (void*)IndSize);
【问题讨论】:
-
mesh->SetOffset(offsetVer / sizeof(Point)); mesh->SetOffsetInd(offsetInd);是做什么的? -
第一个offsetVer,不是用于glDrawElements,而是用于glDrawArrays。它是一个偏移量,可以按预期工作,但在这种情况下可能没用。第二个,offsetInd,是我想为 glDrawElements 中的最后一个参数设置的偏移量,但我不知道这是否是正确的方法。
标签: opengl graphics 3d rendering