12

我正在尝试学习一些 WebGL(来自本教程http://learningwebgl.com/blog/?page_id=1217)。我按照指南进行操作,现在我正在尝试实现自己的演示。我想创建一个图形对象,其中包含要出现在场景中的每个单独对象的缓冲区和数据。目前,我有一个位置顶点缓冲区、一个纹理坐标缓冲区和一个法线缓冲区。在本教程中,他使用了另一个缓冲区,即索引缓冲区,但仅适用于多维数据集。索引缓冲区的实际用途是什么?我应该实现它吗?它对多维数据集以外的任何东西有用吗?

4

2 回答 2

7

对象的顶点由 3D 坐标系(欧几里得坐标系)中的位置定义。因此,在您的 3D 坐标系通过光栅化过程投影到 2D 光栅(屏幕或某些目标图像)之后,您可以将每两个以下顶点与线连接起来。你会得到所谓的线框

立方体线框

线框的问题是它不明确。如果您以特定角度查看线框立方体,您无法说出立方体是如何精确旋转的。那是因为您需要使用可见性算法来确定立方体的哪个部分更靠近观察者的位置(相机的位置)。

但是线本身不能定义表面,这是确定立方体的哪一侧更接近观察者所必需的。如何在计算机图形中定义曲面的最佳方法是多边形,确切地说是三角形(它对计算机图形有很多缺点)。

所以你现在有由三角形定义的立方体(所以称为三角形网格)。

立方体三角形网格

但是如何定义哪些顶点形成三角形呢?通过索引缓冲区。它包含顶点缓冲区的索引(包含您的顶点的列表),并告诉光栅化算法三个顶点形成三角形。有很多方法,如何解释索引缓冲区中的索引以减少相同顶点的重复(一个顶点可能是许多三角形的一部分),您可以在有关图形基元的文章中找到一些。

于 2012-12-23T11:29:21.193 回答
5

从技术上讲,您不需要索引缓冲区。有两种渲染几何图形的方法,使用 glDrawArraysglDrawElementsglDrawArrays不使用索引缓冲区。您只需将顶点一个接一个地写入缓冲区,然后告诉 GL 如何处理这些元素。如果您GL_TRIANGLES在调用中使用 as 模式,则必须将三组数据(顶点、法线、...)放入缓冲区,因此当一个顶点被多次使用时,您必须将其多次添加到缓冲区中。

glDrawElements相反可以用来存储一个顶点一次,然后多次使用它。但是有一个问题,单个索引的参数集是固定的,所以当你有一个顶点时,你需要两个不同的法线(或另一个属性,如纹理坐标或颜色),你必须为每组属性存储它.

对于球体glDrawElements来说很有意义,因为参数匹配,但对于立方体,法线不同,正面需要与顶面不同的法线,但两个顶点的位置相同。您仍然必须将位置放入缓冲区两次。对于这种情况glDrawArrays是有道理的。

这取决于数据,哪个调用需要更少的数据,但glDrawElements更灵活(因为您始终可以glDrawArrays使用包含数字 0、1、2、3、4 ......的索引缓冲区进行模拟)。

于 2012-12-24T09:11:43.630 回答