Project Icon

GenshinCelShaderURP

基于Unity URP的原神风格卡通渲染库

GenshinCelShaderURP是一个基于Unity URP的开源卡通渲染库,旨在复现原神角色的渲染风格。该项目整合了多种渲染技术,包括ILM贴图和Ramp纹理,以实现独特的卡通效果。它提供了跨平台支持,适用于PC、移动设备和主机,注重性能和视觉效果的平衡。这个易用且可扩展的渲染库适合希望在Unity项目中实现类似原神风格的开发者。

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

贴图示例

  1. 身体部分:
    图片
    图片
    图片

  2. 脸部的特殊处理: 图片
    图片

支持

关于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

链接

欲了解更多作者相关信息欢迎访问: 米游社@爱莉小跟班gaolxBilibili@galing2333

结语

最后,希望大家玩得开心,这个项目将持续进行更新,如果对我们的项目感兴趣记得给一个star,这便是对我们最好的鼓励与支持。由于本人仅仅是高三的学生,编程水平有限,如有不足之处希望谅解。如果你针对shader部分有任何好的想法、意见或建议,欢迎在Issues中讨论或者提交你的PR。也可以通过邮箱联系我(gaolingxiang123@163.com)。如果你觉得我的作品值得赞赏,我将非常感谢你的赞助。

项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

白日梦AI

白日梦AI提供专注于AI视频生成的多样化功能,包括文生视频、动态画面和形象生成等,帮助用户快速上手,创造专业级内容。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

讯飞绘镜

讯飞绘镜是一个支持从创意到完整视频创作的智能平台,用户可以快速生成视频素材并创作独特的音乐视频和故事。平台提供多样化的主题和精选作品,帮助用户探索创意灵感。

Project Cover

讯飞文书

讯飞文书依托讯飞星火大模型,为文书写作者提供从素材筹备到稿件撰写及审稿的全程支持。通过录音智记和以稿写稿等功能,满足事务性工作的高频需求,帮助撰稿人节省精力,提高效率,优化工作与生活。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

AIWritePaper论文写作

AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号