这是法线贴图系列的第二篇,主要是了解烘焙法线贴图的知识点。
1 烘焙法线贴图
这是法线贴图系列的第二篇unity 法线贴图 shader,主要是了解烘焙法线贴图的知识点。
在此过程中,烘焙师将基于低多边形投射基础光线,遵循顶点法线并搜索高多边形。这是法线贴图最重要的方面,人们对法线贴图的大部分问题都与它有关。如果不控制低多边形模型的顶点法线,就会失去对法线贴图的控制。
为了控制低多边形模型的平滑,我们可以分割顶点法线(创建硬边)或平均顶点法线(创建软边)。
事实证明,并非所有 3D 程序都使用相同的计算来平均顶点法线。这意味着您的低多边形看起来会有所不同,其顶点法线指向略有不同,具体取决于您使用的 3D 程序。这通常没什么大不了的,因为这些偏差非常小,但会影响模型的外观;当使用法线贴图时,这些差异会加剧,法线贴图会修改在应用程序之间变化的低多边形法线。
3D 行业正在努力解决这个问题,最近出现了一种称为 Mikk 空间的标准。这是一种计算所有 3D 应用程序都可以使用的顶点法线的方法,因此顶点法线在 3D 程序之间不会改变。但请记住,并非所有 3d 应用程序都使用它。
另一种减少这种影响的方法是在烘焙时不要过多地依赖法线贴图。尝试将低多边形与高多边形更紧密地匹配,并在平面上使用更多硬边。这样法线贴图就不必完成所有工作,这些小偏差也不太明显。
2 倾斜问题
当计算机对低多边形顶点法线的法线方向进行平均时,表面角度的较大变化会“歪斜”低多边形法线并导致它们不垂直于低多边形表面。
由于烘焙的法线贴图在搜索高多边形细节时使用低多边形的法线方向,如果这些方向是倾斜的;它们在法线贴图上会出现倾斜:
这是一个非常常见的问题,已经找到了几种解决方案。但是没有最好的解决方案,这真的取决于模型。
解决歪斜问题的第一个方法是通过临时修改低多边形法线来重新制作有问题的部分,这样它们就可以在不歪斜的情况下烘焙。八只猴子有这个选项。 Reddit 用户 Tanagashi 好心地向我解释说,一些程序(比如 xNormal)可以对 lowpoly 进行镶嵌以添加新顶点并使法线垂直于 lowpoly 表面以烘焙对象空间法线贴图,然后使用原始的 lowpoly 法线将其转换为切线空间使用这个新的法线贴图,程序可以创建遮罩来控制在哪里使用原始法线贴图以及在哪里使用从细分 lowpoly 创建的法线贴图。
我们还可以通过添加顶点来减少倾斜问题,因为可以将 90º 角拆分为更小的角度,从而减少第二个过渡的倾斜度。这显然会增加你的多边形数量。由于您要添加几何图形,我建议您也使用这个额外的几何图形来为您的模型添加更有趣的轮廓。
另一种解决倾斜问题的方法是分割平均顶点法线(硬边/使用单独的平滑组):这样每个顶点将有多个法线,每个法线都指向低多边形表面。请记住,当 3D 程序分割顶点法线时;它实际上创建了顶点的副本,因此这会增加顶点数并略微降低性能。此外,硬边会给您带来“黑边”问题,我们稍后会看到。
最后,我们还可以通过修改模型的法线来弯曲低多边形的法线,使它们垂直于高多边形细节,从而减少倾斜问题。请记住,并非所有程序都允许修改法线(Zbrush 只有平均法线,OBJ 和旧 FBX 文件没有自定义法线信息)。修改法线基本上有两种方法:
加权法线:这是一种类似于平均顶点法线的自动方法。这里的想法是,在平均顶点法线时,并非所有面都具有相同的强度:与较小的面相比,较大的面会以更大的强度将顶点法线“拉”向它们。这样,较大的面(通常更重要)将具有更好的细节投影。这对于高多边形面板特别有效。
自定义法线:使用 3D 软件中的工具,可以弯曲低多边形法线。这是一个相对较新的想法,并且没有多少标准化的工具。请记住,弯曲法线会在模型的其他部分产生非常奇怪的意外阴影,因此该技术通常与倒角结合使用。有人称这种技术为“中多边形建模”。
3烘烤距离
默认情况下,从低多边形表面投射的光线会传播有限的距离,以防止低多边形接收来自高多边形远处部分的法线信息。这个距离通常被称为“前/后距离”,因为光线可以投射到模型的内部、外部或两者。您可以在下图中以红色看到此距离:
一些 3D 应用程序(例如 3ds Max)也允许我们使用帧。框架是低多边形模型的“副本”,我们可以对其进行修改,使其完美地封装高多边形。而且,在某些(但不是全部)情况下,还允许我们在不改变原始低多边形顶点法线的情况下改变光的方向。这有助于获得最佳烘焙极值并避免失真,但请记住,您不是使用顶点法线的法线方向进行烘焙,因此您最终将使用法线贴图来修改实际的低多边形法线,所以结果可能看起来很奇怪。
4 个烤缝
有时,在烘焙法线贴图时,我们可以看到一些接缝:
当我们在 UV 中间有硬边时,就会出现这些接缝。为什么会这样?
UV值可以非常精确:我们可以在坐标0.0001203123 U和0.34004021 V处精确放置一个顶点。但是,纹理的精确度要低得多:像素是有限的,不能分段(我们不能有半个像素)。
因此,在 UV 空间中,一个像素可能正好位于 0.001,而一个顶点可能位于 0.00134。在考虑法线贴图中像素的颜色时,我们必须选择最能代表其内部面法线方向的颜色,所以我们取平均值:
这适用于所有烘焙过程,而不仅仅是法线贴图。然而,当我们使用硬边时,这在法线贴图中更为明显。法线贴图指示方向,在硬边的情况下3D植物,我们有两个面朝不同的方向看,因此它们可能具有非常不同的颜色。
在 UV 岛之间的交汇处unity 法线贴图 shader,这些岛将竞争用它们的颜色填充像素。这意味着最终我们将从 B 岛获取像素,并修改 A 岛像素的颜色,反之亦然。
由平滑边缘分隔的岛屿在法线贴图上看起来非常相似(因为它们的法线方向是平均的),因此颜色上的微小差异不太明显。然而,被硬边分隔的岛在法线贴图上通常看起来非常不同(因为顶点法线被分割并且每个面的方向不同),并且这种差异在生成硬边时会很明显。
如果我们拆分岛屿,它们将不会竞争像素颜色:每个岛屿都可以修改整个像素以适应其正常方向。这就是为什么当 UV 中的面通过硬边连接时,它们应该被分割。
经验法则很简单:只要模型上有硬边,在 UV 中将它们连接的面分开。
5 总结
一旦我准备好低多边形模型并尽可能地调整到高多边形模型,我就开始在 UV 之前进行平滑处理。我为低多边形设置了平滑(如果它是有机的,我从一个完全平滑的模型开始,如果它是一个坚硬的表面,我从一个 30-60º 的设定角度平滑开始;然后调整模型平滑直到它看起来不错)。为模型设置平滑后,我将处理 UV技能特效,确保将所有硬边分割成单独的 UV 岛(以避免边缘接缝)。
如果存在倾斜错误,我会添加额外的边缘(通常是斜角以保持更圆润的轮廓)。这适用于我的大多数模型,但如果我使用 Marmoset 工具包烘焙,或者使用自定义/加权法线,我也可以修复倾斜错误。
如果出现投影错误,我会修改烘焙距离/帧,修改 lopoly/highpoly 以使其更适合烘焙,或者移除一些非常硬的部分(如圆锥体的尖端)上的法线贴图。
下一篇文章将为法线贴图烘焙创建故障排除指南,并讨论一些最常见的问题和解决方案。