素色流年783 发表于 2020-12-21 09:40

Unreal Engine4 Rendering Part 1: Introduction

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

Unreal Engine 4(UE4)的渲染系统非常方便配置,支持目前多个平台大多数最新渲染技巧。感谢节点式编辑器,在UE4中写材质是非常容易的,但是由于渲染系统复杂性和缺乏教材资源,人们对于深入到UE4中去是非常迟疑的。


下面列举出来的内容将分成几篇文章来介绍。这些文章是基于前面的文章基础之上写的,如果需要,你可以跳跃式阅读。每篇文章将在整个系统中组成某个特别步骤的多个渲染系统部分进行归组后的信息进行介绍。
当我们开始往Unreal添加新的Shading Model时,我开始思考渲染系统不同部分是怎么一起工作的。虽然目前已经有一些教材介绍如何使用Shading Model,但是没有人介绍这些系统是如何一起工作的。
所以,这一系列文章的目标就是帮助人们理解渲染系统不同部分是如何连接在一起工作,而不是盯着某个特定部分来剖析它具体的实现。这一系列文章专注于deferred shading pipeline从CPU到GPU,而不会深入Shadowing system, translucent object或者post effects. 我们目标不是看某个具体的实现,而是让你自己感觉哪些类或者函数值得你自己去探索。
Posts in this Series

1. 介绍和安装!这篇文章介绍一些工作和配置,能让我们开发起来更加方便一些
2. Shaders和Vertex工厂。这篇文章介绍Unreal如何创建Shader实例和将它们与HLSL代码进行连接,以及Unreal如何把vertex数据发往GPU
3. Drawing Policies和Drawing Policy工厂,这篇文章介绍为不同技巧如何提供正确的Shader变体,以及引擎如何在绘制不同pass里面,如何知道它们的顺序
4. Shader Architecture. 这篇文章介绍GPU上的延时渲染管线,一个特定pixel按什么顺序将光照和光源考虑进去的
5. Shader遍历技巧. 由于序列编译,在Shaders上面进行遍历是非常耗时的,所以这篇文章将寻找方法来减少花在编译shaders上的时间
6. 添加新Shading Model的教程。这篇论文将介绍如何在不修改PBR属性基础上,如何添加一个卡通式的material
7. (Coming Soon)通过Geometry Shader修改Base Pass. 这篇文章介绍如何修改deferred base pass来支持Geometry Shader,以及在此基础上创建一个轮廓Shader
Article Limitations

尽管我介绍Unreal渲染能力的方方方面面,但是这太多内容了。因此,我只介绍一些最常见的领域。这一系列文章主要关注deferred shading管线和忽略Unreal移动和群聚渲染。Unreal移动和向前shading管线使用不同的类(C++/HLSL),但是他们使用了相同的模式,他们也使用了main deferred shading管线中一些函数和结构。在shader这边,我们忽略透明和instanced stereo,因为他们大都数都是现有代码预编译定义好的变体。每个平台变体也会被忽略,在C++端,我忽略阴影投射的事情。
一些代码片段讲被简写和简化。大量的引擎复杂性来自于不同预定义变量,所以为了简化学习,我们也忽略这些。这也就是意味着这一系列文章是概括性文章,而不是一个特定的学习教程。
Engine Setup

你必须从GitHub上源代码处编译代码。你可以使用Epic Games启动版本,但是添加新shading models需要引擎代码。如果你计划使用c++调试,非常必要编一个Debug Editor版本的引擎,而不是使用Debug Game或者Development Editor。掌握C++/HLSL/templates当然最好。


下面是一系列推荐安装包
HLSL Tools for Visual Studio

这个是Visual Studio一个免费的扩展。他让基本的HLSL语法高亮和在Unreal中.usf/.ush文件中寻找定义。通过Tools->Text Editor->File Extensions就可以让它工作了。


RenderDoc

RenderDoc是监测GPU的强大工具。它让你看到draw calls,经过GPU每个阶段的数据,显示在Unreal正在产生和运行的源代码。一旦下载和安装,在Unreal有个提前安装好的RenderDoc插件,通过它可以把抓取按钮添加到主视口。


Modifying ConsoleVariables.ini

这个文件位于\Engine\Config\目录下。它让你在引擎启动之前,配置它。大部分变量都在里面,而且有相关注释。


设置r.ShaderDevelopmentMode = 1后,当缺省materil编译失败后,Unreal提示你重新编译shader。如果不设置它为1,Unreal会直接崩溃掉,如果它不能编译缺省material。因此,这个能让Unreal提示我们和允许我们解决编译错误和不需要重启editor进行重试。设置r.Shaders.Optimize=0和r.Shaders.KeepDebugInfo=1让Unreal使用低优化编译器和保留调试信息。更低优化器会降低编译时间,保留debug信息会让RenderDoc有更好的调试。
设置r.DumpShaderDebugInfo=1和r.DumpShaderDebugShortNames=1在特定场合下非常有用。它会将生成后的HLSL写入硬盘(空工程,约2G),但是它会对RenderDoc调试非常有帮助。第二个变量会让变量名称变端,以符合OS最大路径长度限制。
Modifying BaseEngine.ini

如果你从往下滚动,你能找到bAllowCompilingThroughWorker=True,和bAllowAsynchronousShaderCompiling=True。这两个标志会让Unreal多线程编译所有需要的shader maps。它对于调试一个C++ shader管线非常有用,如果你关掉它们。


Start an Empty Project

每次你修改一个shader file,Unreal会重新编译使用该文件所有组合。这也就是,如果你修改一些基础shader,你系需要编译125 shaders,产生10000个组合。如果从空工程,这个时间不会太长,在I7-4770k处理器上约10分钟左右。
Unreal在shader管线上有能力为每个材质基础hot-reload一些文件。这个允许你直接修改shader源代码,修改引擎中材质,点击apply按钮,就能重新加载shader源代码。但是,源代码hot reloading并不是你修改所有文件时都会生效。后面有篇文章会详细剖析这个问题。
Helpful Links

下面这些链接会帮助理解你一些概念。
Graphics Programming Overview.Unreal文档中渲染系统的整体描述,包括game thread和render thread并行化。Threaded Rendering. 介绍Game和Rendering跨线程通讯,限制及其潜在的条件竞争。Shader Development. 介绍vertex factories和material shader,以及global shader大体情况。Coordinate Space Teminology. 介绍了在不同空间中坐标值How Unreal Renders a Frame. 介绍一渲染帧在GPU上做过些什么
Terminology

下面是我们这一系列文章经常提到的专业术语
RHI

Render Hardware Interface(渲染硬件接口),它是一个将不同图形API抽象的图层。所有渲染命令通过它传递到不同的渲染器上面。
Deferred Rendering

在UE4中缺省渲染模式。这系列文章基本上是介绍它。顾名思义,就是将将灯光和shading计算从每个mesh渲染移到一个full-screen通道。一个完整的deferred rendering超出了本系列文章的领域。更多关于deferred rendering可以查看Wikipedia arcticle, compare/contrast of Forward vs Deferred和Intel Developer Zone example on Forward Clustered.
(Clustered)Forward Rendering

Unreal桌面向前渲染实现。这系列文章不包含该内容。这个跟mobile render使用传统的tile
deferred render也不同。
View

在Fscene中一个window,一个Fscene可以有多个Views。
Drawing Policy/Drawing Policy Factory

Unreal提出Drawing Policy概念来指定包含使用指定shader来逻辑渲染特定网格的一个Class。例如,Depth Only drawing policy为给定的材质寻找正确depth-only shader变体,这样使用该policy的对象就使用优化后的depth-only shader。Drawing Policies不需要知道shader细节或者它们将要渲染的网格。一个Drawing Policy Factory是针对更加具体类型的,它为每个应该渲染的对象创建一个Drawing Policy,然后把他们加入到不同list里面去。
Vertex Factory

Vertex Factory是一个class,包含vertex数据,作为vertex shader输入。Static Meshes, Skeletal Meshes和Procedural Mesh Components都使用不同Vertex Factory。
Shader

在Unreal中,Shader是HLSL代码(.ush/.usf文件格式)和一个材质图的组合体。当在Unreal中创建材质,它会基于设置,编译出几种不同shader组合。
Next Post

在我们一篇文章,我们将更加详细介绍Shader和Vertex Factories。我们将讨论C++如何绑定到HLSL代码,C++如何修改HLSL代码中变量,如何定制放入vertex shader中的数据!


Credits

Mostly written by Matt Hoffman @lordned, and peer reviewed by the following people: Sai Narayan @nightmask3, Jeremy Abel @jabelsjabels, Stephen Whittle @mov_eax_rgb, Joe Radak @Fr0z3nR, Steve Biegun, Steve Davey @llnesisll, and Javad Kouchakzadeh @stoopdapoop. Thanks for sifting through 40+ pages of technical writing!
翻译 大禾 copyright: DAHE@ALIBABA
页: [1]
查看完整版本: Unreal Engine4 Rendering Part 1: Introduction