我对c++和OpenGL都不陌生,但是我对使用VBOs很陌生。到目前为止,我一直很懒,几乎所有事情都使用显示列表。
我的问题很可能很简单,但它很烦人!似乎第一个和最后一个三角形列表没有正确显示,在这个例子中,我从一个简单的波前模型obj文件加载一个球体。我从obj文件中加载它,对于显示列表和VBO,我已经验证了它们从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 vector,但是再一次,我已经这样做了,它给出了完全相同的结果。
不确定是否有更多的信息我必须给,我只是包括glew和freeglut(两者的最新…在windows上)
首先,使用STL向量是非常好的,正如你所发现的;c++保证std::vector<>作为普通数组存储在内存中。在使用VBO时,我自己也使用过std::vector,它工作得很好,所以这里不必担心。
除此之外,我没有好的建议,对不起。一个小问题是,在主题中你谈论三角形带,但在代码中你渲染gl_triangle,而不是GL_TRIANGLE_STRIP。这就是你的意图吗?虽然我猜如果这是问题所在,那么输出将会有更大的差异,但是我想检查一下也无妨。
好了,我明白我的问题了。这是相当愚蠢和尴尬的。WFObject文件存储诸如1st, 2nd等索引,而不是0th, 1st等。
虽然是的,我在我的显示列表和VBO中加载了完全相同的顶点,不同之处在于,在我的DL中,我在m_Vertices[m_Vindices[i]-1]
显然OpenGL不知道它必须从每个存储的索引中减去1,这是正确的!这是我自己的问题。现在每个下标都是-1因为它被存储在下标数组中。问题解决了!
很抱歉浪费你的时间,但是谢谢你看一看!
什么是m_Vindices
?您在代码注释中声明它是整数-它应该是std::vector<unsigned int>
。