GL VBO问题:第一个和最后一个三角形带没有正确显示



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

相关内容

  • 没有找到相关文章

最新更新