我对 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 上)