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