PSO Caching(Pipeline State Object Caching)

UE4用新的PSO Caching用来替代原来的FShaderCache。原来的FShaderCache实现的是对Shader代码(或二进制的ByteCode)进行Cache.新的PSO Caching则是ShaderCache的超集,它不仅Cache了渲染所用的Shader代码,同时也Cache了渲染状态.PSO Caching的设计在很大程度是贴合了新的渲染API的方向,向Vulkan的Pipeline Cache致敬

PSO Caching会把渲染状态、顶点声明、Primitive类型、RenderTarget像素格式等等的数据保存到文件中,或是从文件中加载它们——因为这些渲染状态数字类数据大都是一系列的Int或枚举类数据,空间大小占用有限,故没有做额外的处理。

但PSO Caching中不会直接保存Shader代码(不管是源代码或是编译好的二进制Shader),也不保存Shader的路径,它保存的是Shader路径的SHA1 Hash做为Shader唯一的索引,真正的Shader是由FShaderCodeLibrary管理。

Unreal Lightmass

Lightmass模块是UE4的烘焙渲染器,是一个单独的可执行文件。它工作在CPU上而非GPU上,配合UE自带的Swarm Agent和Swarm Coordinate实用程序,Lightmass还能实现分布式的烘焙。除了光照图,还烘焙阴影、AO,BentNormal、可见性、Mesh距离场等等。

Lightmass是一个基于简化版本的Photon mapping实现的渲染器,虽然有大量的示例证明它能渲染的和离线渲染器一样好。但我这半吊子离线民科还是强烈的感受到,实际上它的实现传统的离线渲染器相距甚远,实现的思路并没有考虑到离线渲染所关注的最大问题:海量资源的管理调度。

相对于暴力Path Tracing来说,Lightmass是有偏的。

相对于Jensen的提出Photon Mapping时的构想来说,Lightmass的实现是个阉割版。它失去了重构Caustic的可能;它不区分镜面和非镜面反射,Photon Trace的结果只有一份Photon Mapping;它内部的材质模型是单一的;它有实现诸如蒙特卡罗,Irrandiance Cachiing,Final Gather 等Photon Mapping的优化手法,但是许多实现都不是非常完善。

Lightmass中的光子被存在八叉树中,Jensen实现是基于数组的KD-Tree。

一整个场景中参与投影的Mesh在Lightmass里会被组织为一个硕大的Mesh,再使用KD-Tree对其进行划分以加速Ray Cast求交。UE4有实现一套自己的Mesh KD-Tree构建,但它默认的并不使用自己的这份Kd-tree,而是用的Intel的Embree库来表达场景快速求交。

Lightmass对几何体的光栅化是基于平底三角形拆分进行光栅化。

UE4烘焙的基本工作流程

Render Path

UE4目前支持3种渲染路径:移动端简单的Forward Render Path,PC/主机端的Deffered Render Path和Forward+。在FrameGraph尚未完善情况下,每种渲染器对应的渲染Pass是人肉组装的。

UE4用于组织渲染路径实现h/cpp文件的后缀均为Renderer,每个Renderer均由数个渲染Pass顺序级联而成,对于具体每个Pass的渲染实现和某个单独的功能性的渲染实现,UE4中的h/cpp文件后缀则是Rendering,如FogRendering,DepthRendering等等

Renderer的基类是FSceneRenderer,当你想实现一个自己的渲染路径时,它的核心接口只有一个:

虽然该接口名为Render,但实际上它的工作不止是渲染,它同时负责了更新部分数据、裁剪、遮挡剔除,组织渲染指令等工作。这就容易在和GPU进行渲染指令同步时出现断供和积压的情况,为了应对渲染线程在干这些脏活累活时的所带来的额外延迟,UE4一方面尽可能的把一些耗时大且可并行的任务扔到线程里去实现(如可见性计算,生成渲染指令),另外一方面还专门针对GPU同步的提交实现了一个RHI线程。

UE4渲染数据和命令组织、可视性计算是通过InitViews函数实现的,这不是FSceneRenderer的接口,但是FSceneRenderer的两个子类均有一个一样功能实现。

FDeferredShadingSceneRenderer用于其它非移动平台。它内部的实现是同时集成了延迟渲染和Forward+。在4.23开发版本中还看到有实现单独的Deffered Cluster Pass。关于Deffered Shading Renderer具体的渲染过程,每个Pass的功能分析,网上资料较为详实可观了。

UE4中用于移动端的渲染器叫FMobileSceneRenderer,它实现了一个传统的Forward Renderer。MobileRendeer最核心的Pass是MobileBasePass ,它的具体实现分两部分,CPU端的数据组织,Shader及其Permutation管理在MobileBasePassRendering.h/cpp中,Shader本身的实现则在MobileBasePassVertexShader.usf和MobileBasePassPixelShader.usf中。UE4的Shader Permutation是基于Pass和预编译宏来组合的,MobileBasePassPixelShader.usf也不利外,它实现了一个mesh着色的基本过程:从光照图、Shadowmap采样和计算、反射球采样、天光、到实时灯光、Fog混合等。在硬件支持的前提下,它还基于Frame Buffer Fetch实现了Alpha Blend。

UE4同时支持硬件遮挡剔除和软件遮挡剔除,只是它的软件遮挡剔除目前仅用于ES2相关的设备。

UE4 Render Path的实现包含在“Renderer”这一模块中。

Instancing

在Batch和Instancing这两项减少DrawCall的技术方案选型上,和U3D不同,UE4选的是Instancing,所以UE4的Batch功能是比较弱的,你在场景中放100个一模一样的Box,在没有Instancing时,它就是100个DrawCall。

UE4目前有三种Mesh相关的Instancing实现:

UInstancedStaticMeshComponent(ISM),静态的模型Instance,即我们在书上和其它引擎中最常见的Instance形式——只有位置相异而mesh和材质均完全相同的物体可以合并成一个Actor,在理想情况下只提交一次DrawCall。ISM好处是DrawCall少,坏处是LOD计算,裁剪和OC等等都是按一个对象来做,往往ISM的Drawcall减少了,但提交渲染的三角形却更多了。

UHierarchicalInstancedStaticMeshComponent(HISM),UE4中的HISM和ISM不同之处是它是基于分层实现。目的是为了满足一个Mesh有大量实例时分区域进行裁剪、计算LOD。UE中的植被就是HISM的子类。看到HISM大量的Console Variable都直接叫Foliagexxx...可以猜到的是HISM大概一开始是为植被系统所准备的。HISM的实现有两部分,一部分是构建分层(自动化的,每次修改它的instance个数、位置等都会触发)并保存到文件中,另一部分则是基于分层的可见性计算、LOD和渲染组织。

HISM的分层结构是一个KD-Tree,不过它的生成不是基于启发式平衡的结构去做,而是直接用的最长轴做为当前拆分轴,且简单粗暴的从长轴中间分开成左右子树,叶节点所包含的Instance数或三角形数由外部控制。

Dynamic Instance,UE4在4.22中支持的Dynamic Instance和上述的ISM/HISM虽同为Instancing,但实现上是完全不相关的。ISM/HISM的实现是静态的,需要显示的在场景中对相同物件强制打包到一个PrimitiveComponent下面,属于编辑阶段需要确定的数据组织功能。而Dynamic Instancing则是在渲染指令组织的时候,发现相同的mesh+pipeline state自动组装的。Dynamic Instance实现的核心是UE4实现了一个GPU Scene——用一个Buffer来存储全场景每个Primitive的Transform等信息,这样在组装出Instance Buffer之后只需用PrimitiveID就可以访问到自己的位置相关数据,从而实现Instance渲染了。

Dynmic Instance在4.22上的移动端没有实现,但其实只要稍微修改一下UE4使用的RWStructureBuffer为RWBuffer,并且把GPU Scene相关的检测和更新修正,就可以在手机端ES3.1 Feature上正常使用。

GPU Scene的实现可以参考GPUScene.h/cpp。

渲染模块的简介到这儿就基本结束了,光照的介绍、RayTracer的介绍、渲染线程之间的分工和交互、Shader生成和组织过程、Mesh渲染的流程、LOD更迭、HLOD、StreamingTexture等等主题。这些主题因为涉及到具体的算法和代码实现,放到单独文章里去介绍会更容易理解。

ue4 离线渲染_UE4渲染引擎模块简介(2)相关推荐

  1. opengl游戏引擎源码_UE4渲染引擎模块简介(1)

    UE4官方文档中<Graphics Programming Overview>开篇即说:UE4的渲染代码太多故难以从宏观上快速预览它的全貌(There is a lot of render ...

  2. ue4 迁移模型_UE4虚幻引擎学习云笔记(六)-关卡设计入门-[5.地形快速入门]

    [六.关卡设计入门(Level Designer Quick Start)] 19-09-29 UE4虚幻引擎学习云笔记(六)-关卡设计入门​zhuanlan.zhihu.com UE4虚幻引擎学习云 ...

  3. ue4 离线渲染_[译]Real Shading in Unreal Engine 4(UE4中的真实渲染)(2)

    利用假期接着把剩下的部分搞完吧,其实,纯粹的翻译应该还是比较简单的,但是,为了更好地理解,我一般都会多找一些资料来进行互相印证.在上面一部分Shader Model的改变过程中,我主要是参考了一些PB ...

  4. 如何降低ue4 cpu消耗_UE4实时渲染第一节:渲染之前(遮挡处理)

    本节主要讲一下虚幻渲染之前,都发生了生么. 渲染流程: 首先,虚幻的渲染由三个线程共同完成.分别是CPU线程,DRAW线程,和GPU线程. CPU线程:顾名思义,运行在CPU上,用于计算游戏中的所有逻 ...

  5. <2021SC@SDUSC>【Overload游戏引擎】源码模块简介及项目分工

    <2021SC@SDUSC>[Overload游戏引擎]源码模块简介及项目分工 模块简介 Overload SDK Overload 应用程序 项目分工 模块简介 Overload 由12 ...

  6. Renderbus瑞云渲染正式支持UE云渲染!离线渲染+实时渲染=渲染起飞!

    2022年已经到了尾声,回顾今年CG圈里最具讨论性的话题,除了AI绘图,就是虚幻引擎了,这两者如同一股风潮,从概念创意到后期制作,一路以"席卷"之势影响到了视觉领域的各个行业. R ...

  7. 实时渲染:实时、离线、云渲染、混合渲染的区别

    渲染,就是将3D模型转换成2D图像,并最终呈现在屏幕上的过程.虽然这里只有一句话,但是这一句话里面包含了太多的数学.物理和计算机方面的知识,它描述了我们用计算机来虚拟化真实世界的基本逻辑.渲染过程是需 ...

  8. live2dmesh渲染优先级_Cocos引擎_游戏开发引擎

    大家好,引擎组经过了近半年的努力,终于带来了 Cocos Creator 3.0 预览版.Cocos Creator 3.0 集成了原有 2D 和 3D 两套产品的所有功能,带来了诸多重大更新,将做为 ...

  9. 国内做 3D 渲染和游戏引擎的码农们都在哪里获取技术信息?

    国内做 3D 渲染和游戏引擎的码农们都在哪里获取技术信息? 国内的做 3D 渲染,图形有关的码农们,主要都是去哪里获取技术帮助呢?尤其是移动这边. 现在公司里主要任务就是在 iOS 上用 GLES 做 ...

  10. osg动态加载模型不显示_探索未知种族之osg类生物---渲染遍历之Renderer::draw()简介...

    我们今天进入上一节的遗留问题Renderer::draw()的探究. 1.从_drawQueue中取出其中一个sceneView对象.SceneView是对scene和view类的封装,通过他可以方便 ...

最新文章

  1. Linux UserSpace Back-Door、Rootkit SSH/PAM Backdoor Attack And Defensive Tchnology
  2. 大数据与数据挖掘考试题_大数据时代下的数据挖掘试题及答案
  3. Maven 的 settings.xml 配置中的mirror节点
  4. python函数名第一类方法、f-string格式化、迭代器及递归函数
  5. 搭建jenkins+gitlab+tomcat+maven步骤
  6. Spring:笔记整理(1)——HelloWorld
  7. 同步中心服务器,同步中心以非常慢的速度同步脱机文件 - Windows Server | Microsoft Docs...
  8. 106. 数据库增删改的封装
  9. 面象对象与面象过程内存分区
  10. 2021-2004中国环境统计年鉴面板数据、环境面板数据
  11. 一群人在网上直播自己怎么写代码,而且还有人爱看
  12. C语言博客作业--一二维数组
  13. 网页游戏外挂资料(转)
  14. 有一个已经排好序的数组,今输入一个数,要求按照原来排序的规律将它插入数组中
  15. php for android
  16. 离开腾讯首创业,贾佳亚谈人工智能 2.0 革命,技术究竟该如何变革?
  17. Python 第几周和星期几
  18. Vue扭蛋机营销小游戏
  19. 架构分析:「转转云平台」的 Kubernetes 实践
  20. Web前端--HTML+CSS+JS实现仿切水果小游戏

热门文章

  1. 英文情景对话(背诵篇)
  2. vh和vw是什么单位?
  3. 腾讯云产品介绍——腾讯云云服务器之运维指南
  4. 2014年计算机一级考试题目,2014年计算机一级考试PS模拟试题
  5. 悉尼大学计算机科学专业,悉尼大学计算机科学专业
  6. 2021-11-08 RAID磁盘阵列的分级与结构 总结
  7. mac idea向上/向下插入空行快捷键
  8. 第一台微型计算机处理器位数,微处理器芯片的位数指的是什么 - 全文
  9. 使用CSS格式化Table样式
  10. coreldraw做生化标志_CorelDRAW标志绘制图文教程,logo设计制作教程