【问题标题】:Tangent, binormal and other shader-related things切线、副法线和其他与着色器相关的东西
【发布时间】:2011-05-06 08:28:48
【问题描述】:

包括法线凹凸贴图、视差贴图等在内的许多贴图技术都需要特殊的每顶点切线空间基础(切线、法线、副法线/双切线)。

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

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

position -> normal ->  tangents
            uv     ->

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

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

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

【问题讨论】:

    标签: 3d shader normals


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      在运行时计算它并不是一件容易的事,因为您可能需要比当前三角形数据更多的数据来获得正确的切线空间。

      【讨论】:

        【解决方案3】:

        我的看法如下:

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

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

        此外,在许多游戏中,每个纹理贴图的纹理(通常在切线空间中,AFAIK)与每个模型的颜色纹理一起提供,用于稍后的并行映射像素着色器。

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

        【讨论】:

          【解决方案4】:

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

          【讨论】:

            【解决方案5】:

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

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

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

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

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

            编辑软件

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

            运行时间(用于 DirectX、OpenGL 等)

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

            通常,您会丢失很多无法重建的信息。如果您尽可能多地使用原始 Max/Maya 版本的几何体,您的艺​​术家将会非常高兴。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-01-22
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2021-10-28
              • 1970-01-01
              相关资源
              最近更新 更多