OpenGL 是如何实际读取索引的?

Posted

技术标签:

【中文标题】OpenGL 是如何实际读取索引的?【英文标题】:How does OpenGL actually read indices? 【发布时间】:2019-12-26 12:18:45 【问题描述】:

我试图弄清楚如何使用 triangle_strips 绘制平坦的地形,当我编写用于创建索引数组的循环时,我想 OpenGL 是如何知道解析索引的,因为到目前为止,我已经看到每个人在创建索引时都会编写它们像这样:

0 3 1 4 2 5 0xFFFF 3 6 4 7 5 8

(这里是 0xFFFF 基元重启,标志着条带的结束)

从技术上讲,据我所知,每个三角形都应该使用偏移量 +1 来解析......所以第一个三角形将使用前三个索引 (0 3 1),下一个使用偏移量 +1 (3 1 4)。 ..下一个(1 4 2)等等。如果我没有很好地解释,这是图片:

但我看到的另一种方法是分别为每个三角形创建索引......所以: 0 3 1 3 1 4 1 4 2 4 2 5

所以我的问题是如何指定布局...当我将绘制调用设置为 GL_TRIANGLE_STRIP 时,OpenGL 是否会自动执行此操作?

【问题讨论】:

【参考方案1】:

三角形基元分为三种:

GL_TRIANGLES:顶点 0、1 和 2 形成一个三角形。顶点 3、4 和 5 形成一个三角形。以此类推。

GL_TRIANGLE_STRIP:每组 3 个相邻顶点组成一个三角形。一个长度为 n 的顶点流会生成 n-2 个三角形。

GL_TRIANGLE_FAN:第一个顶点始终保持固定。从那时起,每组 2 个相邻顶点与第一个顶点形成一个三角形。因此,对于顶点流,您会得到一个三角形列表,如下所示: (0, 1, 2) (0, 2, 3), (0, 3, 4) 等。长度为 n 的顶点流将生成 n- 2 个三角形。

您的第一个场景描述了GL_TRIANGLE_STRIP,而您的第二个场景描述了GL_TRIANGLES

【讨论】:

以上是关于OpenGL 是如何实际读取索引的?的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL - 使用 glDrawElements 错误地映射纹理

Opengl 顶点数组对象

OpenGL:如何在一次调用中绘制多条线带?

OpenGL索引缓冲区对象元素顺序绘制不正确

OpenGL仅从顶点数组中绘制一些索引

iOS 上的 OpenGL ES 多个没有索引的 VBO