【转载】UE4 查看编译后 Shader 文件

1,645 阅读2分钟

原文链接:UE4 查看编译后 Shader 文件 | 翼神

如何查看 UE4 编译后真正用于运行的 shader 文件(.usf)。

以下 usf(Unreal Shader File) 代表 UE4 中的 shader 文件。

首先,我们要搞清楚一个事实,UE4 中的 shader 并不是与材质一一对应的,也就是说你创建一个材质,编辑了,保存了这个材质,并不说明这个材质就对应生成了一个 usf 文件,事实上,UE4 最终会根据 shader 模板(引擎 Shader 目录下的 usf 文件)为这个材质生成多个 usf 文件,分别用于不同的渲染阶段(Pass)以及不同的顶点类型以及光照类型。而这些生成出来的 usf 文件才是最终用于运行的 shader 。

Tips:也许大家会在材质编辑器里看到查看 “HLSL代码” 的选项(材质编辑器->窗口->HLSL代码),这个打开后看到的并不是最终运行的代码,而是用于组合到最终 usf 中的代码。

那么最终的 usf 文件如何查看呢,很简单,打开引擎目录下的一个配置文件Engine\Config\ConsoleVariables.ini,其中
;r.ShaderDevelopmentMode=1 将前面的分号去掉可以打开 shader 编译的详细 Log ,用于在编译 shader 出错时可以弹出详细的出错信息;

image.png

;r.DumpShaderDebugInfo=1 去掉分号,可以 dump 最终 usf 到工程目录的 Saved 文件夹

image.png

重新打开 UE4 编辑器,按下 Ctrl + Shift + . 强制重新编译所有 shader(或者简单点直接随便打开一个你的材质,随便修改一下然后点编译),UE4 就会把生成的所有 shader 文件 dump 到磁盘上,这时候进到你的工程目录下 Saved\ShaderDebugInfo 文件夹,点进去会看到有一堆以材质名命名的文件夹,这些文件夹以一定的规则命名,我们暂时不管它命名的含义,这里我们关心哪一个是最终真正运行的 shader 呢?我这里举个例子,假设你项目中有一个材质叫 newMat ,如果你仔细找一下,会找到一个 newMat 文件夹,我这里的目录是\Saved\ShaderDebugInfo\PCD3D_SM5\newMat\LocalVF\BPPSFNoLMPolicy\BasePassPixelShader.usf

解释一下 BPPSFNoLMPolicy 这个命名的含义是 PS(Pixel Shader),NoLM(No LightMap),就是不使用 LightMap 时对应的 Pixel Shader,这个 BasePassPixelShader.usf 文件里面就包含完整的最终执行 shader 代码,包括 main 函数,以及所有从模板里编译进来的函数。

分析最终 shader 文件可以避免我们在 shader 模板里看到的一大堆宏控制的区块,因为这些区块里的代码很多并不是最后运行的实际代码。

有兴趣可以新建一个最简单的材质,着手分析一下最终 usf 文件。相信你会有一些收获。我们下节教程再见。