假设我有三角网格,那么我在三角形之间有很多重复的位置,在这种情况下索引缓冲区可能变得非常方便。
但如果我也需要法线,那么就没有增益,因为所有三角形都有不同的法线。所以元组{position,normal}是唯一的。如果添加纹理坐标和其他功能,那么我不明白需要索引缓冲区的目的是什么?
答案 0 :(得分:5)
法线通常存储在每个顶点,而不是每个面(面是三角形)。如果有多个三角形共享一个顶点,则可以平均所有面的所有法线以获得顶点的法线。现在,您只需在渲染时插入这些法线,并且表面光滑。有些文件类型甚至是这样设计的,因为你不能为每个三角形存储法线,只能为每个顶点存储法线。这是存储和解释法线的一种非常常见的方式,尤其是在实时图形中。
纹理坐标也是每个顶点的大部分时间。如果你有一些光滑的表面,你很可能不需要让纹理突然改变。为了获得表面上的外观,您只需将它们放在纹理上,但保持坐标相同。因此,您可以完美地存储每个顶点的纹理坐标。
故事的道德是,非常 非常 非常 实际上需要存储的东西很少每面。您需要的大多数数据都可以转换为每顶点表示。特别是法线和纹理坐标通常需要每个顶点而不是每个面。
另外在旁注中,如果你不想要平滑的表面,但想要平面(这样你可以看到三角形),你实际上可以为每个面选择一个顶点,并且只使用它的额外数据表面。因此,例如,每个三角形的第一个顶点将存储所述三角形的法线坐标等。这将为您留下一些顶点的顶点,提供您不需要的额外数据,但这比更多重复的顶点要好得多。在OpenGL中,这种技术可以通过着色器中的 flat 插值来实现,我不确定Direct3D的等价物是什么。