Origin
zhuanlan.zhihu.com
Tags
项目
收藏夹
创建时间
收藏类型
Cubox 深度链接
更新时间
原链接
描述
游戏中打光很重要,好的打光能直接让你整个画面立体,增加层次,掩盖瑕疵。
经常看二次元 UE 效果分享的肯定会发现,所有人都实现了一个叫多光源系统的东西。
实际上除了某些大佬实现的风格化多光源,并非需要特意做什么,因为为了让你的角色在实现 Ramp 控制阴影过渡的同时且能接受别的物体阴影投影,必然需要修改引擎 shader 代码里的 bxdf 部分,这个部分就是所有灯光需要调用的光照计算函数,所以自然实现了多光源。
但是真正实现多光源其实需要大量的打磨,有的大佬实现了不错的多光源效果。但是还是会有很多地方看上去不是那么的对,比如我们的面部阴影用的米哈游分享的 SDF 图做法,只能支持单个光源。
然后观察我们实际动画里,并没有出现明显的多光源的情况(有也大多数表现在边缘光)。
赛博朋克的灯够多吧
同时如果希望用 Ramp 图控制光源过渡,那么意味着你需要在材质编辑器算好 Ramp 颜色传入 Gbuffer,材质编辑器实际上是 Basepass 的一个流程,每个材质填入不同的 gbuffer,所以自然不能获取所有光源(这也是为什么 basepass 里你只能拿到一个 directional 和 skylight,因为实际 lightpass 渲染光源也要做裁剪)。硬要做只能修改 bxdf 得到一个用颜色 lerp 的二值阴影。
所以我保守一点考虑,只针对角色做一个最重要光源的 Ramp 过渡,其他可以通过别的方式表现。
这时就需要一个简单的灯光系统了,因为我们材质编辑器无法拿到除了 directional 和 skylight 以外的灯光,所以需要我们传入最近的灯光朝向。
空口无凭,我们来用万物起源原神来观察分析一下。
这是原神在灯照射以外的区域,只受月光(直接光),可以看到阴影角度和头发上的 ramp 过渡
一但靠近,就出现 ramp 跳变,可以观察到角色投影阴影和头发阴影 ramp 已经不对应了。
靠近之后我们还能看到一些细节,我们走动就能发现头发 ramp 实际上表现出的方向和灯光方向并不一致
这应该是为了防止出现角度过大引起一些很难看的角度,硬是偏移了 Light 方向。
我们再去在蒙德大教堂(室内场景)看的更清楚一些。
室内室外是可以分开设计,因为有加载,并非无缝切换
教堂里面有三盏灯
在完全阴影的地方出现了一个假的平行光。(猜测是为了在夜晚不透光的室内带来一点立体感)
在白天:
有直接光太阳光漏出来的场景,人物只受到大阳光
在暗处,人物做了阴影融合,会完全暗下,不会有 ramp 过渡。
不过也有一些假的,完全是 decal 的影子,注意区分。(晨曦酒庄)
同时所谓的室内太阳光也只是单独在外面打的聚光灯,因为我们可以观察影子的拉伸和方向改变。
两盏光都有的时候会进行逻辑判断选一个,所以在交界处走动会出现 ramp 跳变。
然而晨曦酒庄的夜晚在暗处没有 directionallight,我么可以从面部 sdf 阴影判断出。
经过总结如下:
在室外场景:
弱小的点光源,自发光灯并不对人物产生影响。
聚光灯和有一定强度的点光源会对人物产生 ramp 的改变,但是不会改变阴影。
在室内场景:
室内场景没有 directionallight,完全判断影响最大的光源,ramp 和阴影各有自己的一份。如有必要,在黑夜里增加固定方向 ramp 增加角色层次。
在 UE 里,我们走引擎的 deferred 管线,如果不进行一定程度的魔改(比如把角色拿到前向之类的)我们只能通过蓝图来获得的光源传入材质编辑器来修改 Ramp 方向。
由于我不是 gameplay 程序,没有想到特别好的方式获取光源,目前每个 tick 获取
我通过获取 距离 - Radius 的方式,判断这个值的最小值来获取影响最大的灯光。
如果都不满足就取平行光的方向。
如此一来就有了一个简易的灯光控制系统。
本来我以为这种东西应该比较常见,实际我发现很多二游并没有做
堡垒之夜的卡通角色只有 Fresnel 边缘光,没有主光或者主光看不到。
战双的角色有主光,但是只有一盏,并且在角色战斗时,像是有一个摄影师一直跟着你视角再给角色打光,所以他光都是假的。
幻塔的角色没有阴影融合,角色始终只有一个平行光并且在阴影地方也一直存在。
所以难道 ToonShading 的最终目标果然是 Unlit 嘛???
反正原神一直被吐槽,那么多 TA 一直在模仿,但是貌似还木有人能超越,感觉细节还是很多有可以说的地方。 > 本文由简悦 SimpRead 转码