ue4.26 forward translucency shadow
对于前向透明材质:
想找到其阴影代码。
首先由于是前向透明物体,所以肯定不是像不透明物体那样有screen space shadow mask图,而是在shader中计算前向光照时顺便计算阴影。所以只需找到相应shader文件。
为此用renderDoc截帧,但默认截帧只显示pass名,而不显示shader名,为了显示shader名,把r.Shaders.Optimize=0和r.Shaders.KeepDebugInfo=1两行注释(分号)去掉:
找到绘制前向透明物体的drawcall:
在Pipline State标签页点View,跳转到Pixel Shader:
左边File List中Disassembly就是pixel shader的内容,其余是其代码来源文件。
比如Disassembly中的:
/Engine/Private/Common.ush:85 - MainPS() const static float PI = 3.1415926535897932f; 0: mov r0.x, l(3.1416)
意思是说:pixel shader的第0行汇编语句是:mov r0.x, l(3.1416),它是由/Engine/Private/Common.ush第85行,MainPS函数中的语句“const static float PI = 3.1415926535897932f”翻译而来。
如果想看紧凑的pixel shader代码,可以把汇编行及文件名行都删掉,在vs2022中可用正则表达式替换实现:
(以下正则表达式来自gpt)
以数字开头,开头允许有空格的行,正则表达式: ^\s*\d.*\n 以 / 开头,开头允许有空格的行,正则表达式: ^\s*/.*\n 空行,正则表达式: ^\s*\n
但Disassembly中的代码毕竟是展平后的,看不到各种函数名了。
更有用的信息是,由于File List中排在Disassembly下面的文件是BasePassPixelShader.usf,所以可知Pxiel Shader就是BasePassPixelShader.usf中的FPixelShaderInOut_MainPS。
于是就不难找到计算前向透明光照的位置为:
GetForwardDirectLightingSplit中通过ComputeDirectionalLightDynamicShadowing来计算阴影:
在ComputeDirectionalLightDynamicShadowing中可以看到有两种模式,带pcf和不带pcf: