Sef*_*efu 12 javascript graphics html5 opengl-es webgl
我正在尝试学习一些WebGL(来自本教程http://learningwebgl.com/blog/?page_id=1217).我按照指南,现在我正在尝试实现自己的演示.我想创建一个图形对象,其中包含要在场景中显示的每个单独对象的缓冲区和数据.目前,我有一个位置顶点缓冲区,一个纹理坐标缓冲区和一个法线缓冲区.在本教程中,他使用另一个缓冲区,一个索引缓冲区,但仅用于多维数据集.实际上索引缓冲区是什么?我应该实现它,它对除立方体以外的任何东西有用吗?
对象的顶点由3D坐标系(欧几里德坐标系)中的位置定义.因此,在通过光栅化过程将3D坐标系投影到2D光栅(屏幕或某些目标图像)之后,您可以将每两个顶点连接起来并用线连接它们.你会得到所谓的线框.

线框的问题是它不确定.如果以特定角度查看线框立方体,则无法说明立方体是如何精确旋转的.那是因为您需要使用可见性算法来确定立方体的哪个部分更接近观察者位置(相机的位置).
但是线条本身不能定义表面,这对于确定立方体的哪一侧比其他人更接近观察者是必要的.如何在计算机图形中定义曲面的最佳方法是多边形,正好是三角形(它对计算机图形有很多缺点).
所以你现在有三角形定义的立方体(所以调用三角形网格).

但是如何定义哪个顶点形成三角形?通过索引缓冲区.它包含顶点缓冲区的索引(带顶点的列表),并告诉栅格化算法哪三个顶点形成三角形.有很多方法,如何解释索引缓冲区中的索引以减少相同顶点的重复(一个顶点可能是许多三角形的一部分),您可以在文章中找到一些关于图形基元的内容.
小智 5
从技术上讲,您不需要索引缓冲区。使用glDrawArrays和渲染几何的方法有两种
glDrawElements。glDrawArrays不使用索引缓冲区。您只需将顶点一个接一个地写入缓冲区,然后告诉GL处理元素。如果GL_TRIANGLES在调用中用作模式,则必须将三元数据(顶点,法线等)放入缓冲区,因此,当多次使用顶点时,必须将其倍增时间添加到缓冲区中。
glDrawElements相反,可用于存储一次顶点,然后多次使用。但是有一个问题,单个索引的参数集是固定的,因此当您有一个顶点时,您需要两个不同的法线(或另一个属性,例如纹理坐标或颜色),您必须为每个属性集存储一个顶点。
对于球体glDrawElements来说很有意义,因为那里的参数匹配,但是对于立方体,法线是不同的,前表面需要的法线与顶表面的法线不同,但是两个顶点的位置相同。您仍然必须将头寸两次放入缓冲区。对于这种情况glDrawArrays可以说得通。
它取决于数据,哪个调用需要较少的数据,但glDrawElements更灵活(因为您始终可以glDrawArrays使用包含数字0、1、2、3、4,...的索引缓冲区进行模拟)。