游戏开发论坛

 找回密码
 立即注册
搜索
查看: 3068|回复: 0

烘焙法线中的坑

[复制链接]

1万

主题

1万

帖子

3万

积分

论坛元老

Rank: 8Rank: 8

积分
36572
发表于 2020-2-17 11:13:21 | 显示全部楼层 |阅读模式
法线贴图(NormalMap)是3d从业者第一个学到的技术活。这篇文章就来细品,在制作过程曾犯下的错误与其原因。走过路过瞧一瞧,说不定这里就有你疑惑多年问题的答案。

同步更新unity connect,求点赞收藏

https://connect.unity.com/p/hong ... ngconnect.unity.com

法线是什么?

image001.png

先简单说下定义。

物体平面上任意一点,垂直于平面的方向,就是法线方向。以3dsmax为例,修改器添加“编辑法线”。就能看到该模型的顶点法线方向。

法线贴图的做法相当简单:做高模和低模→低模展UV→高低模烘焙法线

烘焙法线的意义,就是把高模的法线方向,以像素的形式,存到低模的表面上。贴上法线贴图的低模,就会有高模的光影变化,从而看起来像高模一样。(unlit没有法线,因为没有光影变化。)

下面开始说问题

做法线贴图看似三步,但每个环节都会出问题。

1. 高模法线有问题

正方体的硬转角,低模转高模,为了高模能有圆滑的转角(或叫高光边),常见做法是,倒角+细分。

image004.jpg

如果用的是这种倒角+细分。恭喜你,不管细分有多高,烘焙后肯定会获得一个凸起来的面。这就像正方形直接细分会变成球一样。

并且由于贴图在引擎压缩后,贴图精度不够,会产生马赛克方块一样的平面。

image005.jpg

正确做法,倒角不能影响到原模型的边缘形状。

这样才能保住中心平面是用4个相同方向的法线算平均,算出来整个面都是一个方向。高模甚至不需要细分,拐角处正好是完美的0-90度过渡。

2.低模法线有问题

高模的光滑组(软硬边)随便分都没事,只要看起来对就能用。

但低模不同,作为接收法线的受体,有很多限制。

低模需要烘焙的地方不能有硬边。如果一定要硬边,硬边处UV需要切开。

image007.jpg

这是高模,绿线是硬边

image009.jpg

如果低模UV不断开处有硬边,法线明显有一条锯齿错误。

image011.jpg

会发生错误的原因很好理解,硬边同时存在两个方向的法线,分别对应到左右两个面。

假设法线贴图,左边需要红色才能还原高模法线,右边需要蓝色。

而红过渡到蓝没法在一个像素内完成,所以共用像素的硬边,肯定会产生错误。

同理切开UV重新摆,会使硬边上有足够像素做红蓝过渡。

可效果相同谁会选择更麻烦的做法呢。。直接低模全软就好

3.低模UV重叠

为保证贴图像素利用率,低模一般会有UV左右对称重叠。

常见做法如下。

低模删掉对称面,和高模一起把穿插部件分开。高低模烘焙出法线贴图,对称低模缝合断面,贴上法线贴图。

image013.jpg

思考一下,低模的对称缝合线,应该用硬边还是软边?

看图可知。答案是硬边。

image016.jpg

用于烘焙的“低模”在删除面时,切口就已经变成了硬边,所以烘焙出来的法线只能用于硬边模型。螺口不对自然无法开螺丝。

结合23两条,不难得出:

•        模型全软边也能烘焙,不管UV切不切。

•        烘焙模型法线被你改了,自然要把原模型切口处法线改成一样。

•        所以,是UV接缝但不是切口处的线,无需改成硬边。

有些老前辈的教条“烘焙法线时UV接缝处要硬边”,现在看看就是笑话。知其然而不知其所以然的样子,真有趣。

甚至于我还要继续打脸。

“UV接缝处要硬边”的源头,是UV重叠会影响烘贴图。只要UV重叠不会影响到烘贴图,就不用切开模型。

做法如下:

•        低模对称缝合好,全软边,存为最终游戏内用的低模A

•        原本想用于烘焙的面,设为一个单独材质球。其他面设为另一个材质球,存为低模B。

•        B模型红色材质球烘焙贴图。出来的法线即可直接贴到低模A上。

image018.jpg

4.不同软件互导

改变法线的方法有分两种,1.软硬边2.光滑组

软件导出模型成FBX,OBJ等模型资源时,会把 光滑组/软硬边 转化成法线方向。

以max为例,模型在导入导出时,均会提示你,是否导光滑组(max里的光滑组)。

image019.jpg

如果导入时没勾选,光滑组信息会丢弃,法线方向被锁定,法线颜色变为绿色,此时编辑光滑组会不起作用,编辑面会导致法线凌乱瞎算。(重置法线即可解开)

5.引擎里贴图设置

Unity内法线贴图在用时,需要指定Texture Type为Normal map。勾选这个相当于对法线进行了Unpack,也就是法线贴图的RG两个通道进行了*2-1

但如果你不需要引擎为你unpack,而是自己解的话,记得把sRGB去掉。

image020.jpg

曾经有一次自己反复检查1-4到底哪里出了问题,结果花了好久才发现自己没去掉sRGB,惨痛的教训。

还没点赞收藏的GKD,I‘ve got you in my sight.

image021.jpg

下面是我的artstation地址:

https://www.artstation.com/luteli


作者:Lute Li
专栏地址:https://zhuanlan.zhihu.com/p/107252209

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2024-12-22 20:23

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表