激发顶点可以用于面部变化的法线/平面着色吗?

问题描述 投票:0回答:0

当使用 OpenGL 或 Vulkan 等实时 API 渲染的 3D 模型需要每个面的法线(而不是每个顶点的法线以实现平滑着色)时,我正在尝试优化发送到 GPU 的数据量。

蛮力方法包括复制三角形(在这种情况下使用的图元)顶点,因此,基本上给定网格描述中的每个三角形都是唯一的。所以除了顶点位置之外,你还附加了面法线。在这种方法中,您不仅需要复制顶点,而且还携带 3 条法线而不是一条。对于一些相当微不足道的东西(平面阴影)来说,这是很多数据。

我在某处读到有关激发顶点和平着色插值模式的信息。因此,在这种方法中,我似乎可以避免重复顶点,只需设置索引顶点缓冲区索引,使每个三角形都从面法线所附着的顶点开始。

但是,我需要澄清当使用这种方法时您将如何为 GPU 准备模型。想象一个三角形扇形(例如圆锥体),其中所有三角形共享一个顶点。面顶点法线应附加到其余顶点。解释这似乎是合乎逻辑的,但我需要弄清楚如何开发一种通用算法,该算法将知道您需要将面顶点法线附加到模型中的哪个顶点,以及如何从那里构建索引数组。

  1. 在平面着色的情况下,激发顶点是减少数据量的正确方法吗?而且你仍然需要为每个顶点附加 1 个法线(其中一些法线可能不会在着色期间使用),但至少你会有一个更紧凑的顶点数组。
  2. 是否有通用算法来为平面着色(面变化法线)准备顶点和索引缓冲区?你能描述一下这个通用算法吗?或者给我举个例子? (源代码)
  3. 如果不是,你会怎么做(除了蛮力方法?)。
opengl directx vulkan
© www.soinside.com 2019 - 2024. All rights reserved.