Unreal Engine 4 渲染 (1)Setup

原文地址:https://medium.com/@lordned/unreal-engine-4-rendering-overview-part-1-c47f2da65346

翻译:yarswang 转载请保留

 

你必须使用从GitHub下载的源码来构建引擎。你可以直接去更改Launcher版本的现有shader,不过要新增渲染模型就需要引擎源码了。如果你觉得需要多次调试C++代码,那么最好生成一个"Debug Editor" 的构建配置,而不是"Debug Game" 或 "DevelopmentEditor"。熟悉C++,HLSL和templates 是个加分项,但并不是必须,因为我们的目标是更多是理论而非技术方面。

 

Unreal Engine 4 渲染 (1)Setup

UnrealVS也是个极好的Visual Studio插件。

下面是推荐工具与设置,他们的作用以及为什么你会需要它们。

 

HLSL Tools for Visual Studio

点击此链接来获取,这是Visual Studio的免费拓展。拥有基本的HLSL语法高亮和跳转到对应Unreal .usf/.ush文件功能。想在.usf/.ush文件中启用它,请跟随作者的操作指引将其添加到编辑器的Tools > TextEditor> File Extensions

Unreal Engine 4 渲染 (1)Setup

RenderDoc

RenderDoc是一个神奇的GPU运行情况查看工具。RenderDoc能够显示draw call、检测数据在GPU中通过的每个阶段(下图中带旗子的那个)、显示Unreal正在产生和运行的源码。下载和安装RenderDoc后,在Unreal主界面中就会有RenderDoc插件的开关按钮。

Unreal Engine 4 渲染 (1)Setup

RenderDoc可以让你深入查看每一帧的draw call和检测GPU数据!

ConsoleVariables.ini

这个文件位于\Engine\Config\目录下,可以让你在引擎启动前来指定参数数据,它的大多数参数在那里都有注释。

Unreal Engine 4 渲染 (1)Setup

 

设置r.ShaderDevelopmentMode=1可以使Unreal在缺省shader编译失败时,提示你进行shader编译。一般情况下,Unreal会在缺省shader编译失败时崩掉(用来做回退处理),所以这个改变可以使Unreal来提醒我们并允许我们在不重启编辑器的情况来修改编译错误进行重试。注意:如果你有一个attach Unreal的debugger,那么依然会触发一个断言。这个行为可以通过注释一个if语句来禁用,这个语句位于FShaderCompilingManager::HandlePotentialRetryOnError方法中,搜索FPlatformMisc::DebugBreak()即可。

设置r.Shaders.Optimize=0  r.Shaders.KeepDebugInfo=1 可以使Unreal通知shader编译来使用较低层级的优化并留下debug信息。较低层级的优化可以缩减编译时间,保留shader中的debug信息以以使我们使用RenderDoc来进行更好的debug。

设置 r.DumpShaderDebugInfo=1 和 r.DumpShaderDebugShortNames=1 可以用在特定的情况下。这可以将生成的HLSL写入磁盘(空工程大概有2gb的数据),但是我发现RenderDoc是更高效的debug工具。第二个设定只是将OS系统下的最大路径名的长度缩写成变量名。

BaseEngine.ini

如果你下拉到 [DevOptions.Shaders]代码块,你会发现 bAllowCompilingThroughWorker=True  bAllowAsynchronousShaderCompiling=True

这两个标志位合在一起可以使Unreal申请shader map时做多线程编译。如果你打算debug一段C++ shader 管线代码,那么关掉它们很有用(这样一次就只编译一个shader)但是这会使shader编译过程变得超级漫长!

Unreal Engine 4 渲染 (1)Setup

 

使用一个空的工程

如果所有的准备工作完毕,那么可以新建一个工程来进行Shader开发。每次你修改一个Shader文件,Unreal都会重新编译使用到这个文件的所有排列。这意味着如果你改动了一些基础Shader(我们会这样做!),那么你必须要编译约125个引擎自带Shader,那么需要组织约10000个他们的排列,哈哈哈!使用一个空的工程可以防止这个数目变得更大,这已经需要花费i7–4770k处理器大概10分钟的时间了。

Unreal可以热重载Shader管线中的一些文件。 这允许你更改Shader代码,修改引擎内的材质并点击Apply来重新加载着色器代码。 据我所知,Shader资源的热重载不适用于所有可修改的文件。 稍后的博客文章中将有一节详细地介绍如何加速测试Shader变化的迭代过程。