1、光追是什么
基本概念
屏幕的每个像素往场景发出射线,碰撞到场景物体后,会展示出不同的颜色,然后对应调整该像素的颜色表现。
BVH算法,让光追效率极大增强;(检测碰撞三角面 → 检测碰撞模型包围盒)
光追与光栅化的区别
光追 | 光栅化 |
---|---|
从像素和射线开始; | 从物体和三角面开始; |
渲染慢,但真实; | 渲染块,但不够真实; |
真实的物理灯光; | 使用一些技巧来模拟灯光行为; |
开启简单; | 需要一些开发尝试来达到真实效果; |
2、混合渲染
基本概念
- 因为光追很昂贵,所以我们会在需要的地方使用光追。
应用
漫射(Diffuse light):我们会用光栅化实现;
反射:模糊表面的反射使用光栅化,光滑表面反射使用光追;
环境遮蔽(AO):看情况选择SSAO,或者光追;
阴影:核心灯光的阴影选择使用光追;
全局光(GI):消耗很高,使用时,考虑关闭其他光追;
3、光追的使用
1)场景基础设置
项目设置
打开光追与贴图LOD;
平台中设置为DirectX 12;
设置成功后重启引擎
会在右上角看到图形计算切换到了DirectX 12;
显示中多出光追Dug的分栏;
2)环境遮蔽-AO
概念
- 一种计算环境光是否被周围物体遮挡的算法;
两种方案
光追AO
- 屏幕射线与模型表面碰撞,能计算出真实的遮挡关系;
光栅化AO:SSAO
基于现成的深度数据,运算快;
最大弊端是无法区分前景和背景,物体被遮挡时,背景物体会被剔除,这部分的AO会被忽略;
AO的开启与设置
红框启用时,使用光追AO。非启用时,使用SSAO;
逐像素是AO的精度;半径是光追射线的长度;这两个值都直接影响性能;
3)反射-Reflection
三种方案
光追反射
表面越粗糙,反射喇叭口越大,消耗越大;
屏幕空间反射:属于图像的后期处理
无法识别屏幕以外的物体,所以画面边界和一些特殊的地方会失真;
反射距离也会受画面距离影响,局限大;
反射探针
- 环境捕获或者HDR贴图;
反射的开启与设置
反射中选择类型;
最大粗糙度:超过数值的表面使用SSR,这个阈值对性能影响大,推荐值0.2;
最大反弹次数:反射的反射,次数越多,性能消耗越大;
逐像素:控制精度,影响性能;
阴影设置和半透物体设置,同样影响性能,按需开启;
4)阴影-Shadow
两种方案
光追阴影:会匹配光源的半径,出现真实的虚影;
光栅化阴影:用的是瀑布流的阴影贴图(Shadow map)
开启与设置
给主光源开启光追阴影
光追阴影的采样精度
5)全局光-GI
两种方案
光追GI:环境物体散射真实的次级光;
光栅化GI:用构建+光照贴图的方式;
开启与设置
类型中选择是否开启;
反弹次数和逐像素对精度影响都很大;
6)半透-Translucent
两种方案
光追半透:产生真实的反射和折射;
光栅化半透:配合SSR或反射探针使用;
开启与设置
场景无透射时,选择光栅化,能节省几帧性能
半透材质
使用光栅化时,通常会有排序纹理,最好关闭双面;
折射率的计算(近似值):空气到玻璃,为两者折射率相除;
材质事例
4、性能优化
1)材质上的优化
原理:光追时,关闭反射中的一些的材质运算,来增加运行性能;
核心节点:RayTracingQualitySwitchReplace
Normal:正常渲染时,shader调用的数据;
RayTraced:光追反射中,shader调用的数据;
2)全局指令优化
指令1:r.RayTracing.Reflections.TestPathRoughness 1
原理:光追测试的反射度阈值,阈值为1时,测试都用SSR;
指令2:r.RayTracing.Reflections.MaxRayDistance 100
原理:射线的最远距离,默认为-1(无限远)。降低时,性能提高,反射会不完全;
指令3:r.RayTracing.Reflections.ScreenPercentage 50
原理:设置反射的分辨率百分比。降低时,性能提升,反射会产生抖动;
指令4:r.RayTracing.Reflections.Hybrid 1
原理:打开反射的混合算法。打开时,性能提升,第二次反射开始会用SSR代替光追反射;
指令5:r.RayTracing.Reflections.ReflectionCaptures 1
原理:光追反射的基础上叠加探针反射。打开时,可以把所有反射都设置为1次,原本2次以上的黑暗区域会被探针反射替代。
3)全局光GI优化
模式从“强力”改成“最终聚集”
降低天光的采样精度
指令:r.RayTracing.GlobalIllumination.NextEventEstimationSamples 1
- 原理:采样次数降低
- 原理:采样次数降低
4)GPU查看器-visualizer
快捷键:Ctrl+Shift+
界面及操作
点击时,会定位到这个块的消耗