三角网格的索引缓冲区有什么意义

Yol*_*ola 0 opengl directx render index-buffer

假设我有三角网格,那么我在三角形之间有很多重复的位置,在这种情况下索引缓冲区可能变得非常方便.

但是如果我也需要法线,那么就没有增益,因为所有三角形都有不同的法线.所以元组{position,normal}是唯一的.如果添加纹理坐标和其他功能,那么我不明白为什么需要索引缓冲区?

Inv*_*lid 5

法线通常存储在每个顶点,而不是每个面(面是三角形).如果有多个三角形共享一个顶点,则可以平均所有面的所有法线以获得顶点的法线.现在,您只需在渲染时插入这些法线,并且表面光滑.有些文件类型甚至是这样设计的,因为你不能为每个三角形存储法线,只能为每个顶点存储法线.这是存储和解释法线的一种非常常见的方式,尤其是在实时图形中.

纹理坐标也是每个顶点的大部分时间.如果你有一些光滑的表面,你很可能不需要让纹理突然改变.为了获得表面上的外观,您只需将它们放在纹理上,但保持坐标相同.因此,您可以完美地存储每个顶点的纹理坐标.

这个故事的寓意是,有非常 非常 非常实际需要每面存储几件事情.您需要的大多数数据都可以转换为每顶点表示.特别是法线和纹理坐标通常需要每个顶点而不是每个面.

同样在旁注中,如果您不想要平滑的曲面,但想要平面(这样您可以看到三角形),您实际上可以为每个面选择一个顶点,并仅将其额外数据用于曲面.因此,例如,每个三角形的第一个顶点将存储所述三角形的法线坐标等.这将为您留下一些顶端的顶点,其中包含您不需要的额外数据,但这比更多重复的顶点要好得多.在OpenGL中,这种技术可以通过着色器中的平面插值来实现,我不确定Direct3D的等价物是什么.

  • 正如我在第一部分中所解释的,如果您想要平滑的阴影并假装表面是平滑的而不是三角形的,那么这实际上是需要的。如果您想要真正的平面着色,您可以应用我上一节中的技术。您可能需要一些重复项才能实现此目的,但这仍然比没有索引缓冲区时的重复项数量要好。 (2认同)