opengl 日内瓦国际中心组织问题:第一条和最后一条三角形未正确显示

5fjcxozz  于 12个月前  发布在  其他
关注(0)|答案(3)|浏览(78)

我的问题是第一个和最后一个三角形列表没有正确显示,在这个例子中,我从一个简单的波前模型obj文件加载一个球体。我从obj文件加载它完全相同的方式为显示列表和VBO,我已经验证了他们是从obj文件获得完全相同的数字。
在这个例子中,我使用STL向量来存储顶点和顶点索引。然而,我之前也试过使用float* 和int*,但它给出了完全相同的结果。
这是一个从VBO绘制球体的屏幕
编辑:我删除了这个超链接,因为我不能发布超过2个,因为我的帐户仍然是新手。
正如你所看到的,有一个巨大的圆锥体从远处画到球体的中间,很难看到,但是从最近的一边到最远的一边的三角形带也是错误的,这将在接下来的几个屏幕中变得明显。
编辑:我删除了这个超链接,因为我不能发布超过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是Vec 3f的STL向量,它简单地保存x,y,z。我也试过把它作为vector,它给出了同样的问题,所以改变为vector或float* 不是问题。
好了,现在我画的地方,我有一种感觉,这是我做错了什么

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)绘图;只是为了调试的目的,因为它显示的问题与不正确的三角形最好的。
有人能看看我做错了什么吗?我是否初始化错误?我错过了一个步骤吗?
不知道是否有任何更多的信息,我必须给予,我只是包括格鲁和自由过剩(最新的两者.在Windows上)

rqmkfv5c

rqmkfv5c1#

首先,正如您所发现的那样,使用STL向量是非常好的; C++保证std::vector<>作为普通数组存储在内存中。我自己在处理VBO的时候也用过std::vector,它工作得很好,所以这里不用担心。
除此之外,我没有什么好的建议,抱歉。一个小问题是,在主题中,您谈论了三角形条带,但在代码中,您使用GL_TRIANGLES而不是GL_TRIANGLE_STRIP渲染。是这样吗?虽然我猜如果这是问题所在,输出会有更大的差异,但我想检查一下也无妨。

z31licg0

z31licg02#

好吧,我知道我的问题了。这是相当愚蠢和尴尬。WFObject文件存储索引,如1st,2nd等,而不是0 th,1st等。
虽然是的,我在显示列表和VBO中加载的顶点完全相同,但不同的是,在DL中,我在m_Vertices[m_Vindices[i]-1]处绘制
显然,OpenGL不知道它必须从存储的每个索引中减去1,这是正确的!是我自己的问题。所以现在我从每个索引中得到-1,因为它存储在索引数组中。问题解决了!
很抱歉浪费你的时间,但谢谢你看!

rkkpypqq

rkkpypqq3#

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

相关问题