如何查看 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 出错时可以弹出详细的出错信息;
;r.DumpShaderDebugInfo=1
去掉分号,可以 dump 最终 usf 到工程目录的 Saved 文件夹;
重新打开 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 文件。相信你会有一些收获。我们下节教程再见。