使用VBO的渲染结果不正确

时间:2014-06-21 16:11:58

标签: c++ opengl vbo voxel

我尝试使用高度图和分块方法编写简单的体素化地形引擎。我想为每个块构建单独的网格,并将网格加载到单独的VBO中。我已经准备好了所有的逻辑,但我似乎并没有让VBO渲染正常工作。我准备了非常简单的测试高度图,它应该只渲染2行体素16x16x2 = 512个立方体,每个12个三角形。问题是我的结果看起来没什么应该的 - 这就是我的意思:

Click

看起来非常相似,无论我放大或缩小或扭曲相机多远,线条都会移动一点。
以下是我尝试这样做的方法:
构造由CMesh类表示的paricular网格的缓冲区:

void CMesh::generateVertexBufferData()
{
    this->vertexBuffer = new GLuint();
    glGenBuffers(1,vertexBuffer);
    glBindBuffer(GL_ARRAY_BUFFER, *this->vertexBuffer);
    glBufferData(GL_ARRAY_BUFFER, sizeof(GLfloat)*meshVertexData->size(),&meshVertexData[0],GL_STATIC_DRAW);
    this->vertexCount = meshVertexData->size();
}
void CMesh::generateIndexBufferData()
{
    this->indexBuffer = new GLuint();
    glGenBuffers(1,this->indexBuffer);
    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, *this->indexBuffer);
    glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(GLuint)*meshIndexData->size(),&meshIndexData[0],GL_STATIC_DRAW);
    this->indexCount = meshIndexData->size();
}

由GeometryManager类完成渲染:

glPushMatrix();
    pRenderer->ImmediateColorAlpha(1.0f,1.0f,1.0f,1.0f);
    pRenderer->SetRenderMode(GL_LINE);

    pRenderer->TranslateWorldMatrix(geometryPosition.x*Chunk::CHUNK_SIZE,
                    geometryPosition.y*Chunk::CHUNK_SIZE,
                    geometryPosition.z*Chunk::CHUNK_SIZE);
    glBindBuffer(GL_ARRAY_BUFFER,*meshArray->at(geometryID)->getBuffer(VERTEX_BUFFER));
    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(3,GL_FLOAT,0,BUFFER_OFFSET(0));


    glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,*meshArray->at(geometryID)->getBuffer(INDEX_BUFFER));
    glDrawElements(GL_TRIANGLES,meshArray->at(geometryID)->indexCount,GL_UNSIGNED_INT,BUFFER_OFFSET(0));

glPopMatrix();


我已经检查了天气我正确地计算顶点位置是通过使用简单的立即模式将它们直接从std :: vector * meshVertexData渲染出来的,如下所示:

for(int i=0; i < meshArray->at(geometryID)->meshVertexData->size(); i+=3)
{
    glBegin(GL_POINTS);
    glVertex3f(meshArray->at(geometryID)->meshVertexData->at(i),
            meshArray->at(geometryID)->meshVertexData->at(i+1),
            meshArray->at(geometryID)->meshVertexData->at(i+2));
    glEnd();
}

结果似乎是correct。 我完全不知道这件事,我不确定在用数据填充VBO和渲染它之间会发生什么样子。我谦卑地在这件事上请求帮助,我真的不明白我做错了什么。我的做法是完全有缺陷还是我错过了一些简单的事情? 如果有人真的有兴趣帮我解决问题,但需要更多信息,我愿意提供你要求我在pastebin上包含完整CMesh和GeometryManager代码的任何内容。

1 个答案:

答案 0 :(得分:0)

经过一段时间调试和测试建议的解决方案后,我终于找到了这个bug。事实证明,对于std::vector,此表达式&meshVertexData[0]不等于此表达式&(meshVertexData->at(0))。因此,它没有正确地在VBO中分配数据。将glBufferData分配更改为后者,代码运行正常。我希望有人能从我的错误中吸取教训。感谢大家帮助我了解您的见解!