8

许多映射技术,包括法线凹凸贴图、视差贴图和其他技术,都需要特殊的逐顶点切线空间基础(切线、法线、副法线/双切线)。

这显然意味着我的模型不仅应该导出顶点位置纹理坐标近似的每个顶点法线,还应该导出切线空间基向量之一(通常tangent),因为另一个可以直接在着色器中使用cross(tangent, normal).

请注意,位置、法线、uv 和切线实际上以下列方式相互依赖(您必须了解有关顶点的所有其他信息才能准备切线基础)。

position -> normal ->  tangents
            uv     ->

现在 - 现代 3D 游戏/渲染引擎如何处理这类事情?

它们实际上是否提供了每个顶点的法线切线uv 坐标,或者它们是否可以在运行时以某种方式计算?它们应该是模型数据的一部分还是应该是仅运行时的属性?

我也知道,当使用Direct3D10+几何着色器时,实际上可以在运行时准备法线和切线(显然,因为我们可以访问每个三角形中的顶点)——值得还是应该总是预先计算这些东西?

4

5 回答 5

6

我的看法如下:

UV 坐标:显然是预先计算的。复杂模型的 UV 展开不是一项简单的算法任务,通常需要手动放置接缝以获得最佳结果。此外,如果您的模型带有纹理皮肤,那么 UV 需要与皮肤匹配,因此在这种情况下,它们可能不会在运行时计算。

法线:理论上,您可以在几何着色器中甚至在加载期间在 CPU 上预先计算它们。但有一件事:游戏中的真实模型通常不是原始模型,而是多边形数量较少的版本。在游戏中使用的最终模型中,您的顶点较少,但每个顶点的法线是从原始高多边形模型(也用于环境光遮蔽计算等)中更准确地计算出来的。因此,预先计算法线也是可行的。

此外,在许多游戏中,为每个模型提供了具有每个纹理的法线贴图(通常在切线空间中,AFAIK)的纹理以及颜色纹理,以便稍后在像素着色器中进行并行映射。

因此,看起来我的建议很明确 -使用预先计算的数据,拥有更好的细节并节省着色器处理或加载时间 - 除非您需要担心模型大小(即 GPU 内存限制) - 只有在几何中计算法线着色器将为您节省一些空间。

于 2010-11-11T18:54:17.743 回答
3

通常,您会希望尽可能多地进行预计算。大多数引擎都会有一个定制的编写工具,可以从 3D 软件中获取原始数据,并将其处理成运行时的格式(添加切线和双切线等)。然而...

在某些情况下,每个顶点的内存开销可能是一个特定的性能问题。这是因为移动有关系统的数据会产生开销——它是“隐藏的”,因为它不像添加到着色器中的指令那样显式,所以它更高级一些。

在这些情况下,可能不会预先计算双切线,而是在运行时构造(以减少内存中顶点的大小)。双切线适用于此,因为它们可以由法线切线方向标志构建——这些都是单个顶点的属性。

法线、一些UV 映射和其他东西需要了解网格的“拓扑”——而这种拓扑通常不会出现在运行时数据中。他们还需要艺术家的额外标记;像锋利的边缘和纹理接缝等。因此,法线UV和第一个切线几乎总是会为除了非常特殊的几何类型之外的所有类型预先计算。

请记住,Max、Maya 或 Blender 中的模型表示与运行时版本非常不同。

编辑软件

  • 三角形和四边形汤,带有邻居信息
  • 边缘标记为锋利/柔软
  • 一个顶点可以有多个法线和多个 UV 坐标

运行时(用于 DirectX、OpenGL 等)

  • 缓存友好的三角条和三角扇集合
  • 边缘是隐含的,没有与它们相关的额外信息
  • 每个顶点只有一个位置,一个法线和一个 UV 坐标(每个纹理)
  • 有时存在于多个细节层次

一般来说,你会丢失很多无法重建的信息。如果您尽可能多地使用原始 Max/Maya 版本的几何体,您的艺​​术家将是最快乐的。

于 2010-11-14T09:37:48.850 回答
2

您也可以在 D3D9 中使用 ID3DXMesh 执行此操作。您应该始终提前计算它们 - 因为在运行时再次计算它们是浪费的。但是,对于每个网格,您只能计算一次,因此除非您的程序按程序生成网格,否则在何时何地完成可能不是问题。

这里唯一重要的是在 CPU 上计算它们,而不是在 GPU 上,因为你每帧都在 GPU 上一次又一次地做这项工作,与 CPU 上的一次相比,这完全是浪费。据我所知,所有 3D 渲染系统都会在 CPU 上计算一次法线等,将其保存到文件中,然后加载并将其发送到 GPU 进行工作。

于 2010-11-09T17:52:15.647 回答
1

我更喜欢预先计算它们,因为您需要对接缝、镜像纹理、环绕等进行特殊处理。

在运行时计算它并不完全是微不足道的,因为您可能需要比当前三角形数据更多的数据来获得正确的切线空间。

于 2010-11-09T18:22:18.660 回答
0

UV 和法线通常在艺术家的控制之下。可以使用 UV 的梯度计算切线和副法线。一直计算切线和副法线往往有点昂贵,因此您通常会根据基础几何预先计算它们一次。最好在发货之前减少装载时间。

于 2010-11-12T19:40:50.397 回答