代码之家  ›  专栏  ›  技术社区  ›  Yippie-Ki-Yay

切线、副法线和其他与材质球相关的东西

  •  8
  • Yippie-Ki-Yay  · 技术社区  · 14 年前

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

    这显然意味着我的模型不应该只输出 , 纹理坐标 近似顶点法线 tangent )因为另一个 可以直接在材质球中找到 cross(tangent, normal) .

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

    position -> normal ->  tangents
                uv     ->
    

    他们真的提供 法线 , 切线 以及 每一个顶点或者它们是否可以在运行时计算?它们应该是模型数据的一部分还是应该是只在运行时使用的属性?

    我也知道当使用 Direct3D10+ 它值得吗?还是这些东西应该永远 预计算 ?

    5 回复  |  直到 10 年前
        1
  •  6
  •   Kos    14 年前

    我的看法如下:

    紫外坐标 此外,如果模型带有纹理蒙皮,则UV需要与蒙皮匹配,因此在这种情况下,它们可能不会在运行时计算。

    理论上,您可以在加载期间在几何体明暗器甚至CPU上预计算它们。但是有一件事:游戏中的真实模型通常不是原始模型,但是 在游戏中使用的最终模型中,顶点数较少,但逐顶点法线是从原始的高多边形模型(也用于环境光遮挡计算等)计算得更精确的。因此,预先计算正态分布也是可行的。

    而且,在很多游戏中 使用每texel法线贴图的纹理 (通常在切线空间中,AFAIK)与每个模型的颜色纹理一起提供,以便稍后在像素着色器中进行并行映射。

    所以看来我的建议很明确- 获取预计算数据

        2
  •  3
  •   David Jewsbury    14 年前

    一般来说,你需要尽可能多地进行预计算。大多数引擎都会有一个自定义的编写工具,可以从3D软件中获取原始数据,并将其转换为运行时的格式(添加切线和双切线等)。 然而。。。

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

    在这些情况下 双切线 双切线 适合于此,因为它们可以从 正常的 , 以及 方向性标志 --它们都是单个顶点的属性。

    ,一些 紫外映射 法线 , 紫外线 第一次 切线 几乎总是预先计算出除了非常专业的几何类型之外的所有类型。

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

    编辑软件

    • 边缘标记为锋利/柔软

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

    • 缓存友好的三角形条和三角形风扇集合
    • 边缘是隐式的,没有附加信息
    • 每个顶点只有一个位置、一个法线和一个UV坐标(每个纹理)
    • 有时存在于多个细节层次上。

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

        3
  •  2
  •   Puppy    14 年前

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

        4
  •  1
  •   Macke    14 年前

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

        5
  •  0
  •   MSN    14 年前

    UV和法线通常由艺术家控制。可以使用UV的渐变计算切线和二法线。一直计算正切和二次法线往往有点昂贵,因此通常根据基础几何体预先计算一次。最好在装船前减少装货时间。