【问题标题】:Index buffers in WebGL?WebGL 中的索引缓冲区?
【发布时间】:2012-12-23 07:28:02
【问题描述】:
我正在尝试学习一些 WebGL(来自本教程 http://learningwebgl.com/blog/?page_id=1217)。我按照指南进行操作,现在我正在尝试实现自己的演示。我想创建一个图形对象,其中包含要出现在场景中的每个单独对象的缓冲区和数据。目前,我有一个位置顶点缓冲区、一个纹理坐标缓冲区和一个法线缓冲区。在本教程中,他使用了另一个缓冲区,即索引缓冲区,但仅适用于多维数据集。索引缓冲区的实际用途是什么?我应该实现它吗?它对立方体以外的任何东西有用吗?
【问题讨论】:
标签:
javascript
html
graphics
opengl-es
webgl
【解决方案2】:
从技术上讲,您不需要索引缓冲区。有两种渲染几何图形的方法,分别是
glDrawArrays 和 glDrawElements。 glDrawArrays 不使用索引缓冲区。您只需将顶点一个接一个地写入缓冲区,然后告诉 GL 如何处理这些元素。如果您在调用中使用GL_TRIANGLES 作为模式,则必须将三组数据(顶点、法线、...)放入缓冲区,因此当一个顶点被多次使用时,您必须将其多次添加到缓冲区中.
glDrawElements 相反可以用来存储一个顶点一次,然后多次使用它。但是有一个问题,单个索引的参数集是固定的,所以当你有一个顶点时,你需要两个不同的法线(或另一个属性,如纹理坐标或颜色),你必须为每组属性存储它.
对于球体glDrawElements 很有意义,因为参数匹配,但对于立方体,法线不同,正面需要与顶面不同的法线,但两个顶点的位置是相同的。您仍然必须将位置放入缓冲区两次。对于这种情况,glDrawArrays 是有意义的。
这取决于数据,哪个调用需要较少的数据,但glDrawElements 更灵活(因为您始终可以使用包含数字 0、1、2、3、4 的索引缓冲区模拟glDrawArrays, ...)。