【问题标题】:OpenGL - drawing indices from OBJ using GL_TRIANGLE_STRIPOpenGL - 使用 GL_TRIANGLE_STRIP 从 OBJ 绘制索引
【发布时间】:2015-10-12 03:35:38
【问题描述】:

我试图创建一个 OBJ 解析器,它将读取 OBJ 文件并使用 GL_TRIANGLE_STRIP 渲染它。我知道 OBJ 文件的行为类似于 TRIANGLES,这就是为什么当我读取这些面孔时,我会将它们重新排列为 STRIPS。

例如我有这样的脸

    f 5 1 4
    f 5 4 8
    f 3 7 8

因为 OBJ 文件是基于 1 的索引,所以在我重新排列它们后将按此顺序减去 1。

    f 4 0 3
    f 3 0 4
    f 0 4 3
    f 3 4 7
    f 4 7 2
    f 2 7 6
    f 7 6 7

我将此索引发送到 OpenGL 并使用 glDrawElements 绘制它们,但我得到的输出是错误的。看看here 的图片。

我基于 OpenGL 文档中关于使用 GL_TRIANGLE_STRIP 的安排,我坚持这一步,因为使用 GL_TRIANGLES 对我有用。什么会导致输出不正确?

【问题讨论】:

    标签: c++ opengl opengl-es


    【解决方案1】:

    .obj 文件包含适合以 GL_TRIANGLES 模式呈现的索引。您以 GL_TRIANGLES_STRIP 模式渲染它们。你在这里完全错了。以 GL_TRIANGLES 模式渲染它们,然后开心。

    在其他模式下渲染相同的索引数据几乎总是不正确的。 GL_TRIANGLES 模式每个三角形使用三个索引,而 GL_TRIANGLE_STRIP 平均每个三角形使用一个索引(它是压缩格式)。因此,除非您将索引数据压缩了大约 3 次,否则您不能使用索引绘制为 GL_TRIANGLE_STRIP

    详情请参阅wikipedia article。您可以在下面看到在 GL_TRIANGLE_STRIP 中呈现索引 {0, 1, 2, 3, 4, 5, 6} 的结果。显然,如果您在 GL_TRIANGLES 模式下渲染它们,您将只看到 2 个三角形而不是 5 个。

    【讨论】:

    • 压缩索引数据是什么意思?我应该删除重复的索引吗?我现在有点困惑。对不起:)
    • @zyner 在 GL_TRIANGLES 模式下绘制 K 个索引会产生 [K/3] 个三角形。在 GL_TRIANGLES_STRIP 模式下绘制 K 个索引会产生 K-2 个三角形。您会看到:为相同数量的索引绘制了更多的三角形。所以 T 三角形的索引数据采用 T+2 元素而不是 3T,这就是我所说的压缩。
    • 我现在明白了。使用相同的索引将导致不同的输出,因为 2 个基元在绘制方式上的行为。但是,我仍然想学习如何使用 GL_TRIANGLE_STRIP 从 OBJ 文件中绘制模型?我在搅拌机中导出时的三角测量选项重要吗?
    • @zyner 将三角形索引转换为 triangle_strip 索引是一个科学研究课题。见论文<1><2>
    • 我已经读过它,它对我来说太复杂了。哈哈没有其他简单的方法可以将OBJ文件画成GL_TRIANGLE_STRIPS吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-05
    • 2014-03-19
    • 2021-08-10
    相关资源
    最近更新 更多