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中的:
1 2 3 | /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中可用正则表达式替换实现:
1 2 3 | (以下正则表达式来自gpt)<br>以数字开头,开头允许有空格的行,正则表达式: ^\s*\d.*\n 以 / 开头,开头允许有空格的行,正则表达式: ^\s*/.*\n 空行,正则表达式: ^\s*\n |
但Disassembly中的代码毕竟是展平后的,看不到各种函数名了。
更有用的信息是,由于File List中排在Disassembly下面的文件是BasePassPixelShader.usf,所以可知Pxiel Shader就是BasePassPixelShader.usf中的FPixelShaderInOut_MainPS。
于是就不难找到计算前向透明光照的位置为:
GetForwardDirectLightingSplit中通过ComputeDirectionalLightDynamicShadowing来计算阴影:
在ComputeDirectionalLightDynamicShadowing中可以看到有两种模式,带pcf和不带pcf:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 字符编码:从基础到乱码解决