本文为(转):Unreal 调试着色器编译过程

 
 

调试着色器编译过程

Rolando Caloca 在 April 19, 2016 | 学习编程

 
 

启用 CVAR 以允许转储中间着色器

在 ConsoleVariables.ini 文件(通常位于 Engine/Config/ConsoleVariables.ini)中,启用下列 Cvar:

 
 

在调试时构建 SHADERCOMPILEWORKER

默认情况下,UnrealBuildTool (UBT) 将为工具生成项目,以便始终在开发时进行编译。要在调试时构建项目,请将 ShaderCompileWorker 的解决方案属性(Visual Studio:生成 -> 配置管理器)更改为 Debug_Program:

 
 

生成中间文件

此刻,您想要生成可调试的文件;启用 Cvar 将允许后续编译转储所生成的文件;要强制重建所有着色器,请在Engine/Shaders/Common.usf 中添加一个空格或进行更改,然后重新运行编辑器。这将重新编译着色器并转储Project/Saved/ShaderDebugInfo 文件夹中的所有中间文件。

 
 

转储的着色器的文件夹结构

让我们分析转储的文件的完整路径:

D:\UE4\Samples\Games\TappyChicken\Saved\ShaderDebugInfo\PCD3D_SM5\M_Egg\LocalVF\BPPSFNoLMPolicy\BasePassPixelShader.usf

项目的根路径:

D:\UE4\Samples\Games\TappyChicken\Saved\ShaderDebugInfo\PCD3D_SM5\M_Egg\LocalVF\BPPSFNoLMPolicy\BasePassPixelShader.usf

转储着色器的根路径:

D:\UE4\Samples\Games\TappyChicken\Saved\ShaderDebugInfo\PCD3D_SM5\M_Egg\LocalVF\BPPSFNoLMPolicy\BasePassPixelShader.usf

现在,对于每种着色器格式/平台,您可找到一个子文件夹,在本例中,这是 PC D3D Shader Model 5:

D:\UE4\Samples\Games\TappyChicken\Saved\ShaderDebugInfo\PCD3D_SM5\M_Egg\LocalVF\BPPSFNoLMPolicy\BasePassPixelShader.usf

现在,对于每个材质名称都有一个对应的文件夹,并且有一个名为 Global 的特殊文件夹。在本例中,我们在 M_Egg 材质内:

D:\UE4\Samples\Games\TappyChicken\Saved\ShaderDebugInfo\PCD3D_SM5\M_Egg\LocalVF\BPPSFNoLMPolicy\BasePassPixelShader.usf

着色器分组在贴图内并按顶点工厂排序,而这些顶点工厂通常最终对应于网格/元件类型;在本例中,有一个"本地顶点工厂":

D:\UE4\Samples\Games\TappyChicken\Saved\ShaderDebugInfo\PCD3D_SM5\M_Egg\LocalVF\BPPSFNoLMPolicy\BasePassPixelShader.usf

最后,下一路径是特性的排列;因为我们早先已启用 r.DumpShaderDebugShortNames=1,所以名称已压缩(以减小路径长度)。如果将其设置为 0,那么完整路径将是:

D:\UE4\Samples\Games\TappyChicken\Saved\ShaderDebugInfo\PCD3D_SM5\M_Egg\FLocalVertexFactory\TBasePassPSFNoLightMapPolicy\BasePassPixelShader.usf

在该文件夹中,有一个批处理文件和一个 usf 文件。这个 usf 文件就是要提供给平台编译器的最终着色器代码。您可通过这个批处理文件来调用平台编译器,以查看中间代码。

 
 

使用 SHADERCOMPILEWORKER 进行调试

从 4.11 版开始,我们为 ShaderCompileWorker (SCW) 添加了一项功能,使其能够调试平台编译器调用;命令行如下所示:

PathToGeneratedUsfFile -directcompile -format=ShaderFormat -ShaderType -entry=EntryPoint

  • PathToGeneratedUsfFile 是 ShaderDebugInfo 文件夹中的最终 usf 文件
  • ShaderFormat 是您想要调试的着色器平台格式(在本例中,这是 PCD3D_SM5)
  • ShaderType 是 vs/ps/gs/hs/ds/cs 中的一项,分别对应于"顶点"、"像素"、"几何体"、"物体外壳"、"域"和"计算"着色器类型
  • EntryPoint 是 usf 文件中此着色器的入口点的函数名称

例如,D:\UE4\Samples\Games\TappyChicken\Saved\ShaderDebugInfo\PCD3D_SM5\M_Egg\LocalVF\BPPSFNoLMPolicy\BasePassPixelShader.usf-format=PCD3D_SM5 -ps -entry=Main

现在,您可以对 D3D11ShaderCompiler.cpp 中的 CompileD3D11Shader() 函数设置断点,通过命令行运行 SCW,并且应该能够开始了解如何调用平台编译器。

有关此主题的更多信息,请参阅虚幻引擎文档的以下两个页面:

(转)Unreal Shader模块(四): 着色器编译的更多相关文章

  1. (原)Unreal渲染模块 管线 - 着色器(1)

    @author: 白袍小道 转载悄悄说明下 随缘查看,施主开心就好 说明: 本篇继续Unreal搬山部分的渲染模块的Shader部分, 主要牵扯模块RenderCore, ShaderCore, RH ...

  2. (原)Unreal Shader模块(一): 着色创建

    一.着色加载 这里说的Shader是编译后的文件或内存     源码说明 --------------------------------------------------------------- ...

  3. OpenGL ES学习笔记(一)——基本用法、绘制流程与着色器编译

    首先声明下,本文为笔者学习<OpenGL ES应用开发实践指南(Android卷)>的笔记,涉及的代码均出自原书,如有需要,请到原书指定源码地址下载. 在Android.iOS等移动平台上 ...

  4. shader之顶点着色器

    Vertex Shader 是渲染管道中一个可编程的模块,用于处理独立的顶点.Vertex Shader接收Vertex Attribute Data,由定点数组对象通过渲染指令来生成. Vertex ...

  5. Initialize the shader 初始化着色器

    目录 Loads the shader files and makes it usable to DirectX and the GPU 加载着色器文件并使其可用于DirectX和GPU Compil ...

  6. Unity Shader着色器优化

    https://mp.weixin.qq.com/s?__biz=MzU5MjQ1NTEwOA==&mid=2247493518&idx=1&sn=c51b92e9300bcf ...

  7. WPF 像素着色器入门:使用 Shazzam Shader Editor 编写 HLSL 像素着色器代码

    原文:WPF 像素着色器入门:使用 Shazzam Shader Editor 编写 HLSL 像素着色器代码 HLSL,High Level Shader Language,高级着色器语言,是 Di ...

  8. (译)Minimal Shader(最小的着色器)

    (原文:https://en.wikibooks.org/wiki/Cg_Programming/Unity/Minimal_Shader) This tutorial covers the basi ...

  9. OpenGL ES 3.0片段着色器(四)

    片段着色器流程图 片段着色器(fragment shader)实现了一个通用的可编程操作片段的方法.片段着色器执行由 光栅化生成的每个片段. • Shader program(着色器程序)—片段着色器 ...

随机推荐

  1. python url库学习

    参考资料:http://cuiqingcai.com/947.html urllib,urlib2是python自带的库. urlopen(url,data,timeout),三个参数. 第一个是地址 ...

  2. 【转】Android 组件系列-----Activity保存状态

    本篇随笔将详细的讲解Activity保存状态的概念,也就是saving activity state. 一.Activity状态保持概念 保存Activity的状态是非常重要的,例如我们在玩一个游戏的 ...

  3. IIS7.5如何限制某UserAgent 禁止访问

    参见Blocking Bots Based on User-Agenthttp://moz.com/ugc/blocking-bots-based-on-useragent http://server ...

  4. IIS/IIS Express中遇到的证书问题

    上面这幅图大家应该不陌生(觉得陌生的话就不用看下面的内容了,呵呵),再放上中英两段关键字: 根据验证过程,远程证书无效. The remote certificate is invalid accor ...

  5. python main

    python中的main函数,总体来说就是,main比较适合写test测试,有点类似于java中的testcase,就是程序单独运行时是运行main的,但是当被调用时就不会运行main了.具体可以参考 ...

  6. Python 初始—(多级字典)

    字典中 嵌套字典 如同json 对象, data={ "msg":{ “xxx.com”:["a","b"] } } data.values ...

  7. poj_3641_Pseudoprime numbers

    Fermat's theorem states that for any prime number p and for any integer a > 1, ap = a (mod p). Th ...

  8. 使用 python快速搭建http服务

    在 Linux 服务器上或安装了 Python 的机器上,Python自带了一个WEB服务器 SimpleHTTPServer. 我们可以很简单的使用  python -m SimpleHTTPSer ...

  9. 【Ecshop】商品数据采集扩展

    一个自用的Ecshop商品数据采集程序 ->到此下载

  10. php集成开发环境xampp的搭建

    一:运维闲谈 作为一名linux运维工程师,在确保能够有熟练的服务器的搭建和维护优化技能的前提,还需对自身解决问题方法上做出一番功夫. 如何为自己的运维工作添砖加瓦,自动化运维便变得非常重要,一方面, ...