之前的几篇文章中,我们已经完成了Toon模型一些基本的Feature。在深入定制之前,我们必须冷静下来思考一下我们需要什么
🚩 0x00 To begin with
这篇文章将会包含以下内容:
- 集成卡渲着色模型
For reference👇:
👀 0x02 ToonIntergrateBxDF
目前我们的光照模型只是已经具备了基本的明暗处理,仍然有数量众多的Feature需要去实现(Ramp、SDF、Anisotropic hair、Matcap、眼透等等)。虽然有一小部分可以用一些trick附加在基础色或其它材质槽上,但其余的就无可奈何了。而且不同于Unlit,在底层逻辑写死的情况下,能在材质编辑器中做的工作就比较有限了。
一个比较容易想到的方法就是为需要特殊处理的材质单独新建一个着色模型,比如说头发一个、皮肤一个,然后里面各自处理需要的Feature。但着色模型数量是有限的,在不扩展FMaterialShadingModelField至uint32的情况下最多只允许16个着色模型。

而且这么多模型逐一添加也比较繁琐,我认为不太优雅,所以想到另一个方法。既然我们已经有一个ToonBxDF,何不仿照IntegrateBxDF的写法,在里面写个大分支,分发不同Toon材质的情况呢?

思路有了,那下一个问题就是,根据什么分发呢?IntegrateBxDF是根据ShadingModelID,我们应该也需要一个ToonShadingModelID。这个时候我想起了之前开辟但没使用过的ToonCustom引脚。现在它被存储在GBuffer的CustomData的Alpha通道中,我们可以停止放置Play,好好使用它了。

FGBufferData中的CustomData在BasePass中经过编码来到GBufferD,最后输出到MRT[4]或MRT[5]。

类型是float,(没错,half4竟然是个宏)。

但是范围只有0~1,由于GBufferTexture的性质,我们在这个引脚输入的任何数值都会被硬件钳制到这个范围。没办法,写个函数转一下吧。

1uint DecodeFloatToToonShadingModelID(float SrcFloat)
2{
3 return SrcFloat * 255;
4}
UE里面也新写一个材质函数,把正常的ID映射过去,


最后在ToonIntergrateBxDF里随便写点东西测试一下,只有当ToonShadingModelID为0时才有光照计算。

单独把身体的ID设成2看看效果。
