LOADING

UE5.01 Custom Shading Model

C++部分


1.EngineType.h


添加 材质的ShadingModel枚举,这里加入之后,材质编辑器的下拉菜单也会新增对应选择,必须要在NUM之前添加

2.HLSL MaterialTranslator.cpp 和MaterialHLSLEmitter.cpp


找到GetMaterialEnvironment,往Shader里添加宏定义

3.ShaderMaterial.h


结构体 FShaderMaterialPropertyDefines,添加我们的宏

4.ShaderGenerationUtil.cpp


在ApplyFetchEnvironment里,添加


该操作是判断当前shading model是否被选择,选择就会再次设为1,没被选中的就会设为0
并且继续往下,找到DetermineUsedMaterialSlots
往里面添加

次操作是为了写入GBuffer,不写这段就无法在Shader正常获取GBuffer,
第二句话是 是否写入CustomData

5.ShaderMaterialDerivedHelpers.cpp


往CalculateDerivedMaterialParameters的Dst.WRITE_CUSTOMDATA_TO_GBUFFER里添加我们的宏(如果需要使用CustomData的话就要加)。

这一块区域本身在UE4里是定义在BasePassCommon.ush里的,到的UE5就移动到C++里面了,使用上面的FETCH进行动态判断宏是否需要开启。

可以看到,在ush里,这个宏虽然有被声明,但是底下的实现被注释掉了,证实了已经不需要再在shader里添加了。

6.Material.cpp


我们虽然上面开启了CustomData的接口,但是此时材质编辑器的CustomData接口默认是灰色的,没办法输入,需要在此处开启接口输入。
找到IsPropertyActive_Internal这个函数,
这里是调整材质编辑器控制的位置,
比如我们在延迟贴画的模式下,开启半透明的时候,哪些接口可以被开启之类的。
然后在底下,加入我们的shadingModel

7.MaterialShared.cpp


找到GetAttributeOverrideForMaterial,在这里可以给材质编辑器节点改个名字(如果有必要的话),例如:

这样,C++部分我们就完成了。接下来是shader部分。

Shader部分


1.ShadingCommon.usf


在相同的位置添加我们的shadingModel

再往下,GetShadingModelColor里添加我们的颜色,这样在编辑器里DebugShadingModelColor的时候就会显示我们设置的颜色

2.ShadingModelsMaterial.usf


在这里添加我们的shadingModel的GBuffer参数获取。
值得注意的是,我们从材质编辑器里输入进来的CustomData0和CustomData1都只是一个half,而GBuffer里的CustomData是个float4,这里我们只做一下测试。

3.在DeferredShadingCommon.usf里面还有个坑


就是如果我们确定了要使用GBuffer的CustomData,我们就需要在HasCustomGBufferData这个函数里面,加入我们自己的Shading model id,不然我们从GBuffer里面读出来的永远都是0,包括上面的这个IsSubsurfaceModel,如果要开启subsurface,也要往里面加。

4.最后 ShadingModels.usf


在ShadingModels.usf里加入我们的shading Model分支,就能实现不同的效果了

结果