GenshinCelShaderURP
这是什么?
这是一个基于Unity引擎URP管线的卡通渲染项目。经过一段时间的修改,它已经发展成了一个集成式的解决方案。整体技术难度不高,主要是整合了各位大佬的工程,进行了一段时间的效果调研,取其精华并将其整合封装到一套shader中。目前shader仍然使用unlit,未来计划转向lit。本着开源分享的精神,我决定将这个项目分享给大家,也希望通过开源的方式提高代码质量。我们的目标是创建一套能够还原原神角色卡通渲染风格的渲染库,在保证易用性的同时保持扩展性,同时兼顾PC端、移动端和主机端的兼容性、性能和效果。
安装与使用
只需将/Shaders/GenshinCelShaderURP/路径下对应版本的文件夹解压到你的Assets中,即可在材质球中看到添加的shader。 在开始之前,你至少需要准备以下贴图。如果不知道如何获取它们,可以参考B站 @小二今天吃啥啊 的这个教程,链接
(1)RGBA通道的身体Base Map (2)RGBA通道的身体Light Map(ILM Map) (3)身体Shadow Ramp (4)面部Base Map (5)面部阴影SDF阈值图 (6)头发Base Map (7)RGBA通道的头发LightMap(ILM Map) (8)头发ShadowRamp (9)面部阴影Mask (10)金属光泽Map
贴图示例
-
身体部分:
-
脸部的特殊处理:
支持
关于shader兼容性(通用性),目前仅限于在URP的Forward渲染管线中工作。如果需要在延迟渲染管线中使用,请自行设置Render Objects。
PS. 不同游戏开发商对ilm贴图的处理方式略有不同,可以根据自己的需求进行修改和定制。理论上,只要有ilm(表现物体阴影、高光及反射面)和脸部sdf阴影阈值图,都可以使用该shader。值得注意的是,《崩坏3》旧角色的ilm贴图制作方法与新角色略有不同,没有alpha通道控制ramp采样区域,效果会稍差一些,这可能需要各位手动调色。
示例模型
示例用的模型和贴图附在/Model路径下,模型来源:模之屋,链接。可以用于结合我的shader进行测试,模型的最终解释权归mihoyo所有,切勿商用。
生成渐变纹理工具
这个配套工具用于在Unity编辑器中创建适用于该着色器的渐变纹理,可以根据自己的需求定制渐变颜色,具体使用方法可参考这里
关于渐变纹理
让我们回到卡通渲染的本质——将色彩从多个色阶降低到较少的色阶,减少色阶的丰富程度,从而实现类似手工着色的效果,通俗地说就是对光照进行色阶化。卡通渲染有两种常见的做法,一种是计算光照强度后去采样一张渐变贴图,另一种是使用数学计算去拟合渐变贴图。而采样渐变贴图的方法提供了更多的可控性,且更加直观,而且开销并没有增加太多。
图为使用渐变纹理后的阴影效果
half3color = lerp(_ShadowColor, _Color, ramp );
这是一种称为漫反射扭曲(Diffuse Warp)或扭曲漫反射的方法,该方法中使用了渐变贴图(Ramp Texture)。
贴图如上所示。
《军团要塞2》率先使用了这种着色方法,具有重要的历史意义。它不仅能表现鲜明的明暗对比,还能呈现柔和的明暗过渡。我也经常使用这种方法。
相关资料 - https://steamcdn-a.akamaihd.net..
大家可以结合上面的渐变贴图和下方的实现效果一起观察,就能理解渐变贴图是如何影响最终结果的。我们可以这样理解:在采样渐变贴图时,将半兰伯特值应用于UV坐标上,当半兰伯特值较暗时,映射到纹理的左侧;当值较亮时,则映射到纹理的右侧。
除了将横轴对应半兰伯特值的方法外,我们还可以通过灵活处理纵轴来获得不同的效果。例如,在不考虑性能开销的情况下,使用多层"3D渐变"图对阴影和高光进行三次采样,实现三层效果的叠加,并使用外部参数实时调整颜色,做到所见即所得。我们还可以将采样的Y值与各种参数结合,比如以视角与法线的夹角值按Y轴采样,综合实现类似菲涅尔现象的卡通渲染效果。
如在《崩坏3 MMD》中,利用顶点颜色绘制(Vertex color painting),将UV的Y轴映射到顶点颜色值,直接调整软硬明暗效果。(需要注意的是,MMD shader和游戏内shader的实现方式有所不同。)
在《DOTA2》中,还额外使用了一张漫反射扭曲遮罩纹理(Diffuse Warp Mask)。
被遮罩的部分通过采样渐变图来实现明暗渐变。将采样坐标值存入顶点色中有助于优化。
原神相比崩坏3(崩坏3第二部似乎也采用了类似的技术),在漫反射基础色上增加了渐变阴影来实现漫反射效果。在卡通渲染这类非真实感渲染(NPR)中,我们通常会通过冷暖色调分离、硬化阴影边缘等多重手段来达到风格化的目的。例如《原神》这种利用ILM贴图配合渐变纹理实现色调控制的方法,其实早在几年前的《罪恶装备Xrd》中就已经存在类似的实现了。《罪恶装备》和《崩坏3》同样延续了这种思路,只不过在原神中使用了一张单独的2D渐变纹理。在原神中,角色的反照率(Albedo)颜色本身并不依赖于任何光源(也可能是通过后期处理实现,这一点不太确定),而是通过采样渐变颜色(RampColor)来实现。漫反射的暗部由diffuse * RampColor得到,亮部则为diffuse。根据光照贴图(LightMap)的alpha通道不同值域,选择渐变图中的不同层。
原神的Ramp使用了十行一维的Ramp,分为上下五组,分别代表暖色调阴影和冷色调阴影,对应游戏中白天和黑夜使用的两种Ramp。每五组之间通过Ramp Range贴图进行区分,以让不同材质的物体使用不同的Ramp贴图表现不同的材质。Ramp有两张,头发和身体各一张,共10层,分上下两部分,前5行为暖色调阴影,后5行为冷色调阴影,对应夜晚与白天。结合diffuse实现整个Albedo颜色。如下图。
这种做法的优点显而易见,首先是节省性能,因为漫反射的颜色部分不需要参与任何光照计算,亮部就是贴图颜色,阴影颜色已经以贴图形式预先绘制,只需要后期根据光源方向控制阴影位置即可。其次是美术可以更加灵活地控制阴影颜色和明暗过渡,便于实现更复杂的风格化效果。缺点是对美工的要求非常高。
注:《原神》角色ramp图与常规Ramp贴图的不同之处在于——一般的Ramp明暗交界线在0.5的位置,但这个在接近最右边的位置,去除了一些变化不大的亮部部分,既节约了带宽,又保证了美术的操作空间不受限制(压缩Ramp贴图降低采样)。
采样思路:以下是针对该贴图每一行作用的描述: 对于y轴,思路是根据LightMap.a通道,结合光照模型(halflambert)的范围,分层采样ramp图赋予漫反射颜色。我们采样的像素分为冷暖两种色调,以适应白天和夜晚不同的光线环境。为了实现冷暖色调切换,我们要通过shader_feature来进行采样的切换,直接用if语句在inspector中进行调整即可。
对于x轴,根据原来的lambert值,做smoothstep重映射,只保留0到一定数值的渐变,而大于这一数值的全部采样ramp最右边的颜色。这样既可以保留阴影色的过渡,又可以形成硬边,将明暗很好地区分开来(形成硬边)。
最后补充一下原神内ilm贴图各通道的作用:
LightMap.r:高光类型Layer,根据值域区分不同的高光以及matcap金属高光。
LightMap.g:阴影AO ShadowAOMask,可以理解为二级阴影,也就是不随光照方向变化的常驻阴影。
LightMap.b:BltMap.a:Raask SpecularIntensityMa制漫反射暗部颜色。
LightMap.a:Ramp类型Layer,根据值域选择不同的Ramp(控制漫反射暗部颜色,非常重要,待会介绍)
VertexColor.g:Ramp偏移值,值越大的区域越容易"感光"(在特定角度偏移光照明暗)
VertexColor.a:描边粗细
致谢
感谢以下大佬们提交的代码(排名不分先后):
1、Zzzzohar(Generate Ramp Texture Tool) https://github.com/Zzzzohar/Ramp-Tools
2、ashyukiha(shader菲涅尔边缘光、sdf面部阴影、Emission、Bloom、AlphaClipping) https://github.com/ashyukiha/GenshinCharacterShaderZhihuVer
3、ColinLeung-NiloCat(shader卡通轮廓线) https://github.com/ColinLeung-NiloCat/UnityURPToonLitShaderExample
4、YuiLu(shader ramp漫反射及纹理采样、头发修剪视角高光、金属高光、屏幕空间深度等宽边缘光) https://github.com/YuiLu/GenshinCharacterShading
5、T.yz(知乎)(v3版本漫反射模块,包括ramp采样、混合、光照模型、环境光遮蔽等) https://zhuanlan.zhihu.com/p/547129280
使用规则
为了规范项目的使用,你可以将其用于... 学习卡通渲染相关知识、了解HLSL基本语法结构、个人独立游戏开发(相关代码需要遵循MIT许可进行开源)、根据自己需求定制修改源码、MMD等影视制作(如要使用此shader时请在片尾或简介中署名Thanks名单中的名字(可以不写我的名字))
请不要用于... 1 禁止用此模型参与任何商业性质活动和内容制作 2 禁止用此模型参与18禁作品,极端宗教宣传,血腥恐怖猎奇作品,人身攻击视频、暴力、色情、反社会、政治的内容制作 3 禁止对此模型进行侮辱性或猎奇的改造 4 允许对shader的全部代码进行改造,但须始终保持署名(Thanks名单当中,使用哪些作者们代码请把他们署名) 5 禁止个人之间以任何形式的二次配布(即二次传播项目文件) 3 未获得原作者许可,禁止用于商业用途(交易售卖/商业广告类宣传视频等) 5 仅允许使用本场景制作MMD视频,禁止用于其他领域(VRCHAT/游戏MOD等) 6 其他违反GPL开源许可证的行为
在遵守第五则的前提下,允许对此shader二次配布,同须始终保持署名为Github/Gaolingx
链接
欲了解更多作者相关信息欢迎访问: 米游社@爱莉小跟班gaolx、Bilibili@galing2333
结语
最后,希望大家玩得开心,这个项目将持续进行更新,如果对我们的项目感兴趣记得给一个star,这便是对我们最好的鼓励与支持。由于本人仅仅是高三的学生,编程水平有限,如有不足之处希望谅解。如果你针对shader部分有任何好的想法、意见或建议,欢迎在Issues中讨论或者提交你的PR。也可以通过邮箱联系我(gaolingxiang123@163.com)。如果你觉得我的作品值得赞赏,我将非常感谢你的赞助。