ue4.26 forward translucency shadow

发布时间 2023-10-12 15:20:37作者: wantnon

对于前向透明材质:

想找到其阴影代码。

首先由于是前向透明物体,所以肯定不是像不透明物体那样有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: