1

我对 C++ 和 OpenGL 并不陌生,但我对使用 VBO 并不陌生。到目前为止,我一直很懒惰,几乎所有东西都使用显示列表。

我的问题很可能很简单,但很烦人!似乎第一个也是最后一个三角形列表没有正确显示,在这个例子中,我从一个简单的波前模型 obj 文件加载一个球体。对于显示列表和 VBO,我以完全相同的方式从 obj 文件中加载它,并且我已经验证它们从 obj 文件中获得了完全相同的数字。

在这个例子中,我使用了 STL 向量来存储顶点和顶点索引。但是我之前也尝试过使用 float* 和 int* ,但它给出了完全相同的结果。

所以这是一个从 VBO 绘制的球体屏幕

编辑:我删除了这个超链接,因为我不能发布超过 2 个,因为我的帐户仍然是新的......正如你所看到的,有一个巨大的圆锥体从球体的远端进入球体的中间,它很难看到,但从最近一侧到最远一侧的三角形带也是错误的,这将在接下来的几个屏幕之一中变得明显 这是从 DL 绘制的完全相同的球体

编辑:我删除了这个超链接,因为我不能发布超过 2 个,因为我的帐户仍然是新的...

您可以在那里看到 DL 正在正确绘制它们这是同时绘制的,您会看到最大的区别是线条是绿色的,这就是它们应该是的样子

编辑:我删除了这个超链接,因为我不能发布超过 2 个,因为我的帐户仍然是新的...

在这里更明显的是,从 VBO 中绘制的顶部条带是错误的

然后我尝试在每个顶点的 y 值上添加一个大数字,这表明我的 VBO 肯定有问题,因为球体内的圆锥体顶点永远不会移动!

好的,现在您已经对问题有了一个直观的了解,我想我会在这里扔一些代码,我可能只是错过了一步或有一个数字错误。请看一下

这就是我创建 vbo 的方式

void VBOWFModel::Create_VBO()

{

    // Vertex Array VBO handle

    glGenBuffers(1, &m_VAVBO_handle);
    glBindBuffer(GL_ARRAY_BUFFER, m_VAVBO_handle);
    glBufferData(GL_ARRAY_BUFFER, 
                 m_vertices.size()*sizeof(Vec3f), 
                 &m_vertices[0].x, GL_STATIC_DRAW);

}

其中 m_vertices 是 Vec3f 的 STL 向量,它简单地保存 x,y,z。我也试过这个作为向量,它给出了同样的问题,所以改变为向量或浮点*不是问题。

好的,现在到我画它的地方,我觉得这是我做错了什么

void VBOWFModel::Render()

{

    glEnableClientState(GL_VERTEX_ARRAY);

    glBindBuffer(GL_ARRAY_BUFFER, m_VAVBO_handle);
    glVertexPointer(3, GL_FLOAT, sizeof(Vec3f), (float*) NULL);

        glPolygonMode( GL_FRONT_AND_BACK, GL_LINE );

    // m_Vindices are the vertex indices, not the greatest naming convention but hey...
    // it is an STL vector of integers
    glDrawElements(GL_TRIANGLES, m_Vindices.size(), GL_UNSIGNED_INT, &m_Vindices[0]);

    glPolygonMode( GL_FRONT_AND_BACK, GL_FILL );

    glDisableClientState(GL_VERTEX_ARRAY);

}

我正在使用 glPolygonMode( GL_FRONT_AND_BACK, GL_LINE ); 仅出于调试目的,因为它最好地显示了不正确三角形的问题。

谁能看看我是否做错了什么?我是否错误地初始化了某些东西?我错过了一步吗?我查看了各种教程并在谷歌上搜索了很多,我似乎与其他人并没有太大的不同。大多数教程都使用 float* 而不是 stl 向量,但我再次这样做了,它给出了完全相同的结果。

不确定我是否需要提供更多信息,我只包括 glew 和 freeglut (两者中最新的..在 Windows 上)

4

3 回答 3

1

一方面,正如您所发现的,使用 STL 向量非常好;C++ 保证 std::vector<> 作为普通数组存储在内存中。我自己在使用 VBO 时使用了 std::vector,它工作得很好,所以这里不用担心。

除此之外,我没有什么好的建议,对不起。一件小事是,在主题中您谈论的是三角带,但在您使用 GL_TRIANGLES 而不是 GL_TRIANGLE_STRIP 呈现的代码中。是这个意图吗?虽然我猜如果这是问题所在,输出会有更大的差异,但我想检查一下也不会有什么坏处。

于 2011-09-13T12:34:47.677 回答
1

好的,我想出了我的问题。这是相当愚蠢和尴尬的。WFObject 文件存储索引,如 1st、2nd 等,而不是 0th、1st 等。

虽然是的,但我在显示列表和 VBO 中加载的顶点完全相同,不同之处在于在我的 DL 中我正在绘制m_Vertices[m_Vindices[i]-1]

显然,OpenGL 不知道它必须从存储的每个索引中减去 1,这是正确的!这是我自己的问题。所以现在我从每个索引中得到-1,因为它存储在索引数组中。问题解决了!

很抱歉浪费您的时间,但感谢您观看!

于 2011-09-14T03:05:38.167 回答
0

是什么m_Vindices?您在代码注释中声明它是整数 - 它应该是std::vector<unsigned int>.

于 2011-09-13T12:04:30.037 回答