WebGL中的索引缓冲区?

时间:2012-12-23 07:28:03

标签: javascript html5 graphics opengl-es webgl

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

2 个答案:

答案 0 :(得分:6)

对象的顶点由3D坐标系(euclidian coordinate system)中的位置定义。因此,您可以将每个跟随的两个顶点连接起来,并在将3D坐标系投影到rasterization process之后立即将其与线投影到2D栅格(屏幕或某些目标图像)。你会得到所谓的wireframe

cube wireframe

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

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

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

cube triangle mesh

但是如何定义哪个顶点形成三角形?通过索引缓冲区。它包含顶点缓冲区的索引(带顶点的列表),并告诉栅格化算法哪三个顶点形成三角形。有很多方法,如何解释索引缓冲区中的索引以减少相同顶点的重复(一个顶点可能是许多三角形的一部分),你可以在article about graphics primitives找到一些。

答案 1 :(得分:4)

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

相反,

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

对于球体glDrawElements很有意义,因为参数匹配,但对于立方体,法线不同,正面需要与顶面不同的法线,但两个顶点的位置是一样的。您仍然需要将位置放入缓冲区两次。对于那种情况glDrawArrays可能有意义。

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