gpt4 book ai didi

c++ - GL VBO 问题 : First and final strip of triangles not being displayed correctly

转载 作者:行者123 更新时间:2023-11-30 04:32:46 27 4
gpt4 key购买 nike

我不是 C++ 或 OpenGL 的新手,但我是使用 VBO 的新手。到目前为止,我一直很懒惰,几乎所有的事情都使用显示列表。

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

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

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

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

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

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

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

这里更明显的是顶部 strip 从 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 vector ,它只包含 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 );仅用于调试目的,因为它最能显示错误三角形的问题。

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

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

最佳答案

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

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

关于c++ - GL VBO 问题 : First and final strip of triangles not being displayed correctly,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7401478/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com