电影、电视和可视化领域长期使用光线追踪技术渲染照片般逼真的影像,但这种技术需要功能强大的计算机,而且渲染每一帧图像都很花时间。对于电影和电视,可能要花费许多个小时乃至许多天来渲染出高质量的影像序列,但是最终结果可以产生逼真的3D内容,能够与实拍影像无缝地混合在一起。对于建筑可视化公司,光线追踪意味着创作出美丽的渲染效果,可以供汽车业展示,也可展示内容丰富的家居或办公楼在一切完工时的景象,并且得到逼真的观看效果。
通过将虚幻引擎4(UE4)的技术与 实时光线追踪(RTRT)相结合,就可以创作出在细微光照效果上能够与许多脱机渲染器相媲美的交互式体验。实时光线追踪可以让影像看起来更自然,制作出面积光源下的柔和阴影、准确的环境光遮蔽、交互式的全局光照等效果。
虚幻引擎中的光线追踪
UE4中的光线追踪包含两种技术:
- 一是混合的 Ray Tracer,将光线追踪功能与我们现有的光栅效果相结合。
- 一是 Path Tracer,用于生成参考渲染器。
Ray Tracer
Ray Tracer能够针对阴影、环境光遮蔽(AO)、反射、半透明和全局光照生成带有光线追踪的实时效果。它使用数量不多的采样配合降噪算法来实现这一点,可以得到在视觉上得到与Path Tracer极为近似的效果。
Path Tracer
Path Tracer是一款基于物理的无偏性路径追踪器,很适合渲染场景的参考图像。它与脱机渲染器类似,通过连续收集采样来工作,以它目前的状态更适合用于生成场景的真相渲染,而不是最终像素。
要了解更多信息,请参见Path Tracer。
在你的项目中启用光线追踪
请按照这些步骤在你的项目中启用光线追踪支持。
系统要求 | |
---|---|
操作系统 | Windows 10 RS5(Build 1809)或更高版本 请在Windows搜索栏中输入 winver 来确认你的Windows构建版本。 |
GPU | 使用最新设备驱动程序的NVIDIA RTX显卡和某些支持DXR的GTX系列显卡。 详情请参阅此处的英伟达网站。 |
虚幻引擎版本 | 4.22或更高版本 |
虚幻引擎渲染路径 | 延迟路径(请参阅下方的支持功能部分) |
启用DX12和光线追踪
-
转到主菜单,使用 编辑(Edit) 菜单打开 项目设置(Project Settings)。
-
在 平台(Platforms)> Windows 下面,使用 默认RHI(Default RHI) 下拉菜单选择 DX12。
-
在 引擎(Engine)> 渲染(Rendering) 下面,启用 光线追踪(Ray Tracing)。
要启用光线追踪,必须为项目启用 支持计算皮肤缓存(Support Compute Skincache)。如果尚未启用此设置,你会看到一个消息对话框,询问你是否要立即启用。如果是这样,请单击 是(Yes)。
-
重新启动 引擎来使编辑器带DX12启动,并为你的项目启用光线追踪。
实时光线追踪功能
光线追踪阴影
光线追踪阴影 为环境中的物体模拟柔和的面积光照效果。这意味着根据光源的大小或光源角度,物体的阴影在靠近接触面的部分会比较锐利,离接触面越远就越柔和且变宽。
光线追踪反射
光线追踪反射(RTR)能够模拟准确的环境表现,并且可支持多次反射。
此示例比较了光线追踪反射单次反弹和多次反弹的结果。借助多次反弹, 我们可以让场景中的各个反射表面之间形成实时的相互反射效果。
相较而言,屏幕空间反射 (SSR)、平面反射、甚至包括反射捕获Actor在内,都无法动态捕获整个场景;光线追踪反射也没有其他反射方法中的一些限制。
相比之下,SSR仅能进行一次反射反弹,并且仅限于屏幕上的可见内容。与之不同的是,RTR能够多次反弹,并且不会局限于屏幕上的可见内容,这意味着我们可以看到书的侧面、摄像机背后的反射效果,以及通过窗户反射到表面上的额外灯光。
光线追踪半透明
光线追踪半透明(RTT)能准确表现玻璃和液体材质,在透明表面上显示符合物理的正确反射、吸收和折射。
光线追踪环境光遮蔽
光线追踪环境光遮蔽(RTAO)准确地对环境光照被遮挡的区域投射阴影,使物体更好地融入环境,例如在角落和墙壁相交处投射阴影,或者为裂缝或皮肤上的皱纹增添深度。
与屏幕空间环境光遮蔽(SSAO)相比,RTAO能使物体融入环境,并为场景增加深度,使被间接照明的区域呈现自然的阴影。
通过改变环境遮蔽效果的 强度(Intensity) 和 半径(Radius) 属性,你可以控制其大小和强度。
光线追踪全局光照
光线追踪全局光照(RTGI)会对那些未被光源直接照射的场景区域施加实时交互反射光照效果。
最终收集法
目前这是一种实验性RTGI法。
这是另一种基于光线追踪的全局光照法,使用基于最终收集的技术,力求提高运行时性能。该技术为two-pass算法。第一阶段分配着色点(类似于原始RTGI法),但以逐像素一个采样的固定速率进行。在此阶段,着色点采样的历史记录(最多16个)将保存在屏幕空间中。在第二阶段中,该算法尝试重新连接到着色点历史记录,从而摊销该方法的开销。
原始RTGI算法旨在模拟路径追踪器地面实况参考,与执行路径追踪结果类似。新方法用模拟换取性能,将造成一些限制;目前仅限于间接漫反射GI的单次反射,并且上一帧GI采样数据的重投影很容易出现重影。
点击 类型(Types) 下拉选项,在后期处理体积的 光线追踪全局光照(Ray Tracing Global Illumination) 部分启用 最终收集(Final Gather) 法。
为处理临时重影的瑕疵,可以使用以下命令修改场景空间拒绝条件。
r.RayTracing.GlobalIllumination.FinalGatherDistance [number of units]
其当前基于从原始着色点测量的场景距离。此拒绝条件默认为10个单位。
还需要在后期处理体积中进行以下设置,才能有效使用最终收集法:
- 最大反射次数:1
- 逐像素采样:16
超过1的所有其他最大反射次数都会被丢弃(无提示);调整逐像素采样时,最好以2的幂次方进行增加(例如8、16、32、64)。
使用光线追踪功能
后期处理体积
在场景中使用后期处理体积来控制光线追踪和路径追踪功能及属性。可以将体积添加到内部和外部的不同区域,从而应用你所需要的功能和设置。
以下后期追踪功能通过后期处理体积控制:
- 环境光遮蔽
- 全局光照
- 反射
- 半透明
如需进一步了解可用的后期处理设置,请参阅光线追踪设置。
光源
Ray Tracer对UE4中可用的所有类型光源都支持柔和区域阴影。
通过调节下列设置来控制阴影柔和度:
- 在 定向光源 上,设置 光源角度(Source Angle)。
- 在 点光源 和 聚光源 上,设置 光源半径(Source Radius)。
- 在 矩形光源 上,设置 挡光板角度(Barn Door Angle) 和 挡光板长度(Barn Door Length) 来控制阴影柔和度。
天空光照
在 天空光照 上,使用 SLS捕捉场景(SLS Captured Scene) 或 SLS指定立方体贴图(SLS Specified Cubemap) 配合光线追踪阴影来捕捉关卡的远端部分,并作为光源应用到场景。选取 投射光线追踪阴影(Cast Raytraced Shadow) 标志以在场景中启用天空光照。
要使RTGI配合天空光照发挥作用,请启用控制台变量 r.RayTracing.GlobalIllumination.EvalSkylight
(还处于测试阶段)。
性能与调试
Stat GPU
使用控制台命令 GPU Stats
来检查相关的光线追踪GPU性能。你会找到已启用的光线追踪功能的相关信息,并了解在当前视图中为了渲染它们花费了多少帧时间。
Stat D3D12RayTracing
使用控制台命令 Stat D3D12RayTracing
来检查相关的光线追踪资源使用情况。
光线追踪调试视图模式
在关卡视口下面,选择 视图模式(View Mode) 下拉菜单,然后选择 光线追踪调试(Ray Tracing Debug) 以选择可用的调试视图模式。
光线追踪立体角和基于距离的剔除
在采用光线追踪的场景中,摄像机视锥体之外的对象也会出现在场景中,特别是一些高反射表面——这些表面会加大渲染开销。剔除那些不可见或不需要的对象有助于优化并节省一些性能开销。
光线追踪提供了若干种剔除场景对象的方法:基于摄像机距离进行判断,或者在摄像机后面投射一个区域(或一个 实体角度),然后检测每个对象的边界来决定它们是否应该被剔除,或者同时用这两种方法。剔除类型可通过控制台变量 r.RayTracing.Culling
以及下列值来设置:
- 1 基于距离和立体角(solid angle)来剔除摄像机后面的对象(这是默认的剔除方法)。
- 2 基于距离和立体角来剔除摄像机前后的对象。
- 3 基于距离 或 立体角来剔除摄像机前后的对象。
该值越高,场景中被剔除的对象就越多。
光追控制台变量(r.RayTracing.*
)使用两个命令来设置立体角剔除:Angle 和 Radius。例如,r.RayTracing.Culling.Angle
和 r.RayTracing.StaticMeshes.WPO.CullingRadius
。
- Angle 设置摄像机后面的投影区域角度(单位:度)。该区域用于检测对象边界,确定它们是否应被剔除。增加角度对剔除数量的增加影响很大。
- Radius 剔除任何在指定半径之外的物体。默认情况下,半径被设置为100米(或10000厘米/虚幻单位)。
评估降噪器质量
通过执行下列操作来评估不同光线追踪效果的降噪器质量:
- 禁用 临时抗锯齿(Temporal Anti-Aliasing) 和 景深(Depth of Field)。
- 这两个设置在虚幻引擎的渲染器中都在线性色彩空间中运行。它们会使用一些HDR颜色加权技巧来避免在阴影和高光之间产生锯齿。
- 请比较降噪后的逐像素单采样与未降噪的逐像素单采样。
- 由于能量差异以及降噪器对阴影暗化过多,结果看起来不正确。但是,由于色调映射器的非线性运算,逐像素单采样看起来会比较明亮。
- 为了更好地对比,应该对照未降噪的逐像素 多 采样来测试降噪后的逐像素 单 采样。
由于信息丢失,降噪后的逐像素单采样是不完美的。但是与未降噪的逐像素多采样相比,结果是一致的。
此外还要记住,降噪器最多支持每个像素四次采样,这可以提高质量并且更符合未降噪的逐像素多采样结果。
其他调试注意事项
- 使用命令
r.raytracing.ForceAllRayTracingEffects
可快速启用和禁用场景中的光线追踪。值为0时禁用所有效果,为1时启用所有效果,为-1时将使用之前启用的项目设置。
其他注意事项
材质
-
测试材质成本
- 复杂材质会影响光线追踪功能的性能。使用控制台命令r.RayTracing.EnableMaterials测试性能影响。
- Ray Tracing Quality Switch Replace节点
- 使用此节点替换整个材质逻辑,通过简单逻辑降低RTGI、RT反射和RT半透明等功能的开销。此为影响所有光线追踪效果的全局更改。
- 本例中,法线 逻辑路径渲染以场景中所示方式渲染。光线追踪 路径使用简单逻辑实现光线追踪中如RTGI和反射等效果,其中的纹理、法线和粗糙度的开销可能较高。
-
逐材质投射光线追踪阴影(Cast Ray Traced Shadows Per-Material)
- 使用 投射光线追踪阴影(Cast Ray Traced Shadows) 复选框设置此材质是否投射光线追踪阴影。此设置适用于控制指定到几何体材质的特定元素,而不考虑该材质是否应投射光线追踪阴影。
反射
- 渲染具有多层反射的多次反射时,光线追踪反射开销较高。若无多次反射,内部反射材质将显示为黑色。启用
r.RayTracing.Reflections.ReflectionCaptures
将反射捕捉Actor用作光线追踪反射中的最终反射。
包含反射中的半透明对象
在渲染功能(Rendering Features)>光线追踪反射(Ray Tracing Reflections)的 后期处理体积(Post Process Volume) 设置中启用 包括半透明对象(Include Translucent Objects),拥有半透明材质的对象便会出现在光线追踪反射中。
半透明折射率(IOR)
在为光线追踪设置并使用折射时,折射(Refraction) 材质输入用于控制半透明材质中的折射指数(IOR)。
当你在材质中定义折射值时并在后期处理体积中设置折射属性时,你可以充分控制半透明材质的IOR。
材质设置:
- 在材质中启用 双面(Two Sided)。
- 尽管这不是一项要求,但是单面/非流形几何体无法很好地处理体积追踪或光线介质堆叠。双面材质能够提供精确的结果,在使用光线追踪半透明时,推荐将它用于所有的半透明材质。
- 将 光照模式(Lighting Mode) 设置为 表面半透明体积(Surface Translucency Volume) 或者 表面正向渲染(Surface Forward Shading)。
- 使用 折射(Refraction) 输入来控制折射指数。
后期处理体积渲染特性设置:
- 在 半透明(Translucency) 分类下,将 类型(Type) 设置成 光线追踪(Ray Tracing)。
- 在 光线追踪半透明(Ray Tracing Translucency) 分类中,设置如下参数:
- 折射(Refraction): 启用
- 最大折射光线(Max Refraction Rays): 设置要使用的最大光线数。这个值应该足够高,足以让光线通过另一边。
使用材质实例来控制高光值,以便轻松控制IOR。
控制折射量
使用材质中的 高光度(Specular) 输入并使用后期处理体积的 最大折射光线数(Max Refraction Rays) 和 折射(Refraction) 属性来控制发生的折射量和光传输。
下列半透明材质使用0.04的高光度值,并使用最多6束折射光线来让光线穿过材质。下列对比显示了半透明材料在启用和禁用折射时的差异。
应用于高光度输入的不同值会影响半透明材质的折射率。
如果后期处理体积的最大折射光线数属性值不同,则也会影响光线穿过材质。只有一束光线时,没有足够的光线脱离材质,这让材质看起来很暗。随着光线数量的增加,则可透过玻璃折射看到物体。然而,视使用的光线数量而定,部分区域可能仍看起来很暗。增加光线可确保光线脱离体积。
单面材质折射
尽管可使用单面材质进行光线追踪折射,但结果只是类似与而不等同于使用双面材质的结果,后者可显示物理上精确的结果。
后期处理体积的 最大折射光线数(Max Refraction Rays) 属性适用于单面和双面材质,以允许光线穿过体积传输。但是,请注意,只有双面材质能提供正确结果,因此它是使用光线追踪功能处理 所有(All) 半透明材质的推荐方法。
次表面轮廓材质的光透射
光源启用 透射(Transmission) 属性后,次表面轮廓材质上可以产生光透射。
在计算光线追踪阴影期间,系统将运行较小散射模拟,以计算透过介质到阴影投射光源的预期体积散射距离。散射距离用于在光照期间计算散射内贡献。
天空光照
如无需要,应禁用天空光照贡献的捕捉远距离对象(如天穹)。此设置可节省性能并优化场景。对于UE4自带的 BP_SkySphere,此选项默认禁用,将导致与预期不同的天空反射。启用或禁用 细节(Details) 面板属性中的 在光线追踪中可见(Visible in Ray Tracing) 复选框,可控制对象贡献。
光线追踪功能优化
- 设置反射和半透明最大粗糙度(Setting Reflections and Translucency Maximum Roughness)
- 使用 最大粗糙度(Max Roughness) 在材质上设置光线追踪反射的阈值。可在后期处理体积内,或使用控制台命令r.RayTracing.Reflections.MaxRoughness完成此操作。
- 设置全局照明、反射和半透明的最大光线距离(Setting a Maximum Ray Distance for Global Illumination, Reflections, and Translucency)
- 这项将设置此类功能的最大光线距离,以降低其在场景中的开销和贡献。
- 使用控制台设置此类光线追踪功能的 MaxRayDistance 控制台变量。这些功能位于r.RayTracing.*下。
-
RTGI优化(RTGI Optimizations)
- 现在,屏幕百分比和逐像素采样分别默认为 50 和 4。如需将其设为其他值,默认使用其控制台命令进行设置:
r.RayTracing.GlobalIllumination.ScreenPercentage
和r.RayTracing.GlobalIllumination.SamplesPerPixel
。 - 可使用光源的 影响全局照明(Affect Global Illumination) 属性启用/禁用GI的光照贡献。
- 现在,屏幕百分比和逐像素采样分别默认为 50 和 4。如需将其设为其他值,默认使用其控制台命令进行设置:
光线追踪的几何体考虑事项
-
带小孔或大量小细节的几何体将影响性能,如植被和栅栏。
-
室内环境的渲染慢于室外。
- 比如,光线从外部射入时,直接光照区域渲染的比间接光照区域快。
- 此外还须考虑其他使用中的光线追踪功能,比如反射和半透明
光线追踪立体角和基于距离的剔除
在采用光线追踪的场景中,摄像机视锥体之外的对象也会出现在场景中,特别是一些高反射表面——这些表面会加大渲染开销。剔除那些不可见或不需要的对象有助于优化并节省一些性能开销。
光线追踪提供了两种方法来剔除场景对象:基于摄像机距离进行判断,或者在摄像机后面投射一个区域,然后检测每个对象的边界来决定它们是否应该被剔除。默认情况下,所有光追和几何体都使用投影区域(立体角)剔除方法。
光追控制台变量(r.RayTracing.*
)使用两个命令来设置立体角剔除:Angle 和 Radius。例如,r.RayTracing.Culling.Angle
和 r.RayTracing.Geometry.InstancedStaticMeshes.CullClusterRadius
以及 r.RayTracing.StaticMeshes.WPO.CullingRadius
。
- Angle 设置摄像机后面的投影区域角度(单位:度)。该区域用于检测对象边界,确定它们是否应被剔除。增加角度对剔除数量的增加影响很大。
- Radius 剔除任何在指定半径之外的物体。默认情况下,半径被设置为100米(或10000厘米/虚幻单位)。
如果需要使用基于距离的剔除方法,可以将 Radius 设置为 -1。
支持的光线追踪功能
此列表旨在提供当前支持功能的概念,并未完整列出 虚幻引擎4.23 支持的光线追踪功能。
功能 | 支持(是/否/部分) | 其他注释 |
---|---|---|
Rendering Path | ||
Deferred | Y | |
Forward | N | |
光源类型 | ||
定向光源(Directional Light) | 是 | |
天空光照(Sky Light) | 是 | |
点光源(Point Light) | 是 | |
聚光源(Spot Light) | 是 | |
矩形光源(Rect Light) | 是 | |
光照功能 | ||
自发光表面(Emissive Surfaces) | 部分 | 支持表面反射,但不发射光线或投射阴影。 |
光透射(Light Transmission) | 否 | 半透明阴影视为不透明,表示无彩色阴影或光线穿透材料。 |
Area Shadowing(区域阴影) | 是 | |
IES Profiles(IES描述文件) | 是 | |
Light Functions(光照函数) | 否 | |
Volumetric Fog(体积雾) | 否 | |
基于图像的照明(IBL)(Image Based Lighting (IBL)) | 是 | HDRI和天空光照支持此功能。 |
材质:混合模式 | ||
不透明(Opaque) | 是 | |
遮罩(Masked) | 是 | |
半透明(Translucent) | 是 | |
各向异性(Anisotropic) | 是 | |
材质:着色模型 | ||
默认光照(Default Lit) | 是 | |
无光照(Unlit) | 部分 | |
遮罩(Masked) | 部分 | 支持投射遮罩阴影。 |
次表面和次表面轮廓(SubSurface and SubSurface Profile) | 是 | |
预整合皮肤(Preintegrated Skin) | 部分 | 可运行,但未正确光线追踪结果。其使用栅格化流程。 |
透明涂层(Clear Coat) | 是 | UE 4.25对透明图层着色模型进行了显著改善。 |
双面植被(TwoSided Foliage) | 是 | |
头发(Hair) | 部分 | 可运行,但未正确光线追踪结果。其使用栅格化流程。 |
布料(Cloth) | 部分 | 可运行,但未正确光线追踪结果。其使用栅格化流程。 |
材质函数(Material Functions) | 是 | |
双面(Two-Sided) | 是 | |
场景位置偏移(World Position Offset) | 是 | 逐Actor启用静态网格体。 |
几何体类型 | ||
骨架网格体(Skeletal Mesh) | 是 | |
静态网格体(Static Mesh) | 是 | |
几何体缓存(Alembic)(Geometry Cache (Alembic)) | 是 | |
地形(Landscape) | 是 | |
层级实例化静态网格体(HISM)(Hierarchical Instanced Static Mesh (HISM)) | 是 | |
实例化静态网格体(ISM)(Instanced Static Mesh (ISM)) | 是 | |
样条(Splines) | 否 | |
程序网格体(Procedural Mesh) | 是 | 在光线追踪中渲染此类几何体的开销较高。 |
BSP笔刷(BSP Brushes) | 否 | |
细节等级(LOD)(Levels of Detail) | 是 | 尚不支持颤动LOD过渡。 |
视觉效果(VFX) | ||
Niagara | 部分 | 目前仅支持Sprite、条带(Ribbon)和网格体发射器。 |
级联(Cascade) | 否 | |
平台支持 | ||
多视图(VR和分屏)(Multi-View (VR and Split-Screen)) | 是 |