我正在尝试学习WebGL(来自这个教程:http://learningwebgl.com/blog/?page_id=1217)。我跟随指南,现在正在尝试实现我的演示。我想创建一个图形对象,其中包含每个单独对象出现在场景中所需的缓冲区和数据。目前,我有一个位置顶点缓冲区,一个纹理坐标缓冲区和一个法线缓冲区。在教程中,作者使用另一个缓冲区,即索引缓冲区,但仅用于立方体。索引缓冲区的实际作用是什么?我应该实现它吗?除了立方体之外,它还有其他用途吗?
我正在尝试学习WebGL(来自这个教程:http://learningwebgl.com/blog/?page_id=1217)。我跟随指南,现在正在尝试实现我的演示。我想创建一个图形对象,其中包含每个单独对象出现在场景中所需的缓冲区和数据。目前,我有一个位置顶点缓冲区,一个纹理坐标缓冲区和一个法线缓冲区。在教程中,作者使用另一个缓冲区,即索引缓冲区,但仅用于立方体。索引缓冲区的实际作用是什么?我应该实现它吗?除了立方体之外,它还有其他用途吗?
但是如何定义哪些顶点形成三角形呢?通过索引缓冲区。它包含对顶点缓冲区(带有您的顶点列表)的索引,并告诉光栅化算法哪三个顶点形成三角形。有很多方法可以解释索引缓冲区中的索引,从而减少相同顶点的重复使用(一个顶点可能是许多三角形的一部分),您可以在关于图形基元的文章中找到一些。
glDrawArrays
和glDrawElements
。glDrawArrays
不使用索引缓冲区。您只需将顶点一个接一个地写入缓冲区,然后告诉GL如何处理元素即可。如果在调用中使用GL_TRIANGLES
模式,则必须将数据(顶点、法线等)的三元组放入缓冲区,因此当一个顶点被多次使用时,您必须将其多次添加到缓冲区中。glDrawElements
可以用于仅存储一次顶点,然后多次使用它。但是有一个问题,单个索引的参数集是固定的,因此当您需要两个不同的法线时(或者另一个属性,例如纹理坐标或颜色),您必须为每个属性集存储它。glDrawElements
非常有意义,因为参数匹配,但对于立方体而言,法线不同,前面的面需要不同的法线而顶部面则需要另一种法线,但两个顶点的位置相同。您仍然必须将位置放入缓冲区两次。对于这种情况,glDrawArrays
可能有意义。glDrawElements
更加灵活(因为您始终可以使用包含数字0、1、2、3、4等的索引缓冲区来模拟glDrawArrays
)。