从零开始的UE5卡通渲染【一】:理论基础

最近在研究基于UE5的卡通渲染,颇有收获。正巧前段时间与同事吃饭,聊到知乎,深感自己知乎各种不正经的东西实在太多了,而我又是个懒得腾出时间写正经东西的懒狗,遂决定趁编译Shader的空闲,写点学习笔记、心得与分享。

虽然卡渲本身的知识不算很多,但放到UE5上就是不得不改动源码的大工程了,不由得让人怀念起自由的Unity,令人感叹……扯远了,总之UE5卡渲这块我准备分成多篇文章,多水一水。

目前的大(feng)致(kuang)计(hua)划(bing)如下:

  • 卡通渲染理论基础
  • 修改源码的卡渲光照模型实现
  • 基于卷积矩阵的卡渲描边实现、添加子Mesh的Backface卡渲描边实现
  • 修改源码自定义Pass的Backface卡渲描边实现
    ……
    次世代卡渲/独立的Hair、Skin卡渲光照模型/UE5复刻原神ShadingModel……(或许会有?)
    废话不多说了,进入正题。

提到卡通渲染,很多了解不多的朋友可能就会将其与NPR(Non-Photorealistic Rendering)混为一谈,可实际上这两者并不能划等号。事实上NPR是个非常广泛的概念,不止是卡渲,油画、水墨风等等等等各种特殊的渲染风格都可以算作是NPR的一部分,而整个卡渲大类也只是NPR的一个分支罢了,更不用说卡渲自己还有分有各种流派,比如日式赛璐璐风格、有明显明暗分界的Cel Shading和琪亚娜极乐净土中明暗渐变连续的Tone based Shading,以及结合pbr的次世代卡通渲染等。

GGX采用的就是Cel Shading,可以看到角色身上明显的明暗分界

琪亚娜的皮肤很显然是Tone based Shading……虫虫,我的虫虫,嘿嘿嘿

那么说到流派,既然要研究卡渲,那我们自然要选择一个流派去研究,这里我选择当然的是前面拿来举例、卡渲领域典中之典的罪恶装备(以下简称GGX,注意不是Cook-Torrance BRDF里那个GGX,笑)作为参考。
作为卡渲领域的里程碑作品,GGX的材质模型其实非常的简单,主要使用了三张贴图:BaseColor,ilm和SSS:

  • BaseColor:提供基础颜色

  • ilm:提供高光、阴影与内描边信息

  • SSS:提供模型阴影颜色信息,模型阴影颜色即为SSS * BaseColor

    其中,最值得详谈的是ilm贴图,其RGBA四个通道分别存储了高光强度、阴影阈值、高光范围与内描边信息:

  • R通道:

    高光强度,没什么好说的;

  • G通道:

    阴影阈值,基于128灰度的底色,控制材质进入阴影的倾向强弱。

  • B通道

    高光区域,决定了高光的范围。

  • A通道

    内描边信息,著名的本村线;

除此以外,实际上GGX的卡渲方案还用到了一些贴图,比如角色的伤痕等,但这些对于ShadingModel来说都不重要,我们暂不去考虑。本来打算把卡渲的算法部分放在这里讲,但想了想不如丢到实现部分直接结合代码来讲……而且如果只是做一个简单卡渲模型的话,倒也不需要什么复杂的算法。

那么作为序言的第一篇就到此为止,下一篇开始,我们将在UE5内通过修改源码来实现第一个卡渲模型。

原文链接: https://zhuanlan.zhihu.com/p/544141830