当使用 OpenGL 或 Vulkan 等实时 API 渲染的 3D 模型需要每个面的法线(而不是每个顶点的法线以实现平滑着色)时,我正在尝试优化发送到 GPU 的数据量。
蛮力方法包括复制三角形(在这种情况下使用的图元)顶点,因此,基本上给定网格描述中的每个三角形都是唯一的。所以除了顶点位置之外,你还附加了面法线。在这种方法中,您不仅需要复制顶点,而且还携带 3 条法线而不是一条。对于一些相当微不足道的东西(平面阴影)来说,这是很多数据。
我在某处读到有关激发顶点和平着色插值模式的信息。因此,在这种方法中,我似乎可以避免重复顶点,只需设置索引顶点缓冲区索引,使每个三角形都从面法线所附着的顶点开始。
但是,我需要澄清当使用这种方法时您将如何为 GPU 准备模型。想象一个三角形扇形(例如圆锥体),其中所有三角形共享一个顶点。面顶点法线应附加到其余顶点。解释这似乎是合乎逻辑的,但我需要弄清楚如何开发一种通用算法,该算法将知道您需要将面顶点法线附加到模型中的哪个顶点,以及如何从那里构建索引数组。