David902 发表于 2021-1-18 14:14

《Babel》项目技术整理:卡通渲染

游戏中的角色, 一开始就是定的卡通风格, 前后迭代了几次才让大家满意.
在UE4中做过卡通渲染的小伙伴都知道, 引擎其实默认并没有给出自定义光照模型的接口. 所以除在PostProcess材质中去实现外, 多数人都是选择加一个ShadingModel, 比如
当时实现了这个效果:
不过这个明显不是我们想要的, 所以最早我们比较暴力的根据光照方向去修改了BaseColor:
这种做法其实就是CelShading
后来在Unreal论坛看到这个:
支持多光源并且具备一些材质参数调节的ToonShading, 做为技术当然觉得人家做得挺完善的, 所以也拿来做了一下效果:
yaoyao表示这不是他想要的...给出各种参考我才明白, 原来他想要的是平面化的着色, 亮部跟暗部分开, 不需要明暗过渡, 甚至连AO可能都不需要, 所以我总结下就是这个效果去除描边的效果:

也就是Anime Shading, 知乎上也有人发过:
通过调节高光范围和BaseColor的颜色, 我们还可以模拟游戏中下雨打湿的效果:
Color纹理其实是给了两张的, 一张亮部颜色, 一张暗部(无光照)颜色:

一切看起来很美好, 但是放入场景后发现一些光照上的问题. 因为场景还是按照PBR的材质光照去制作的, 所以整体的打光同样也是需要作用于角色的, 并不是角色单独一套光照. 一般的卡通渲染的游戏只需要有个方向光作用于角色就可以了, 但是我们还需要兼容局部光照, 结果...
搜索资料发现卡通渲染的多光照也是有人尝试过的:
所以参考UE4论坛上那个ToonShading进行了多光源支持改造, 兼容了PointLight, SpotLight, CapsuleLight, RectLight等:
可以看到对于局部光照的叠加是没有办法保持平面着色感觉的, 因为亮度是有衰减距离的
DiffuseColor的与Shadow的关系也是需要特殊处理的, 不然会出现这种情况:
后来又发现一个问题, 如果进入室内场景, 没有太阳光(方向光)的情况下, 角色会黑掉:
因为之前是把暗部颜色的计算放在了方向光中去做的, 在没有实时方向光开启的情况下, 角色暗部相当于没有光照强度了, 那这里的改法就是把之前方向光暗部的颜色当成环境光照来处理.
游戏中还有大量的室内外切换的场景, 那环境的间接光照要不要影响角色呢?
在烘焙了IndirectLightCache的情况下, 间接光照相当于是一个多方向的SH系数, 直接叠加到角色身上是会破坏平面着色的感觉的, 所以这里我是只取了一个方向的强度来进行环境光的强度调整
效果还是像那么回事:
所以, 最终实现的卡通渲染效果, 不仅受方向光影响, 还可以被局部光照亮, 也能在室内烘焙光照的情况下接受间接光照, 如果还要剔除SSAO影响的话, 那就要再做个CustomStencil在PostProcessing时剔除角色部分的计算了.
页: [1]
查看完整版本: 《Babel》项目技术整理:卡通渲染