【问题标题】: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


    【解决方案1】:

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

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

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

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

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

    【讨论】:

    • 感谢您清晰详尽的解释!正是我想要的。
    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-19
      • 2016-12-07
      • 1970-01-01
      • 2015-03-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多