UE 5.8美术向指南|Megalights
来源:UE 5.8美术向指南|Megalights - 哔哩哔哩(虚幻引擎官方)
提取时间:2026-09-23 10:41:44
📋 内容概述
本次演讲围绕UE 5.8中新增的Megalights技术展开,重点介绍了其工作原理、性能优化策略以及如何在保持高质量光照效果的同时提升渲染效率。演讲内容涵盖了光照选择、阴影计算、降噪处理和着色补偿等多个关键环节。
🔑 核心技术要点
- 光照选择机制:Megalights通过智能选择少量关键灯(默认4盏)进行渲染,避免了传统光照逐灯计算的线性性能下降。
- 分块与筛灯策略:将屏幕划分为多个块(tile),根据材质复杂度和光照影响进行初步筛选,减少后续计算量。
- 降噪处理:采用时间(temporal)和空间(spatial)双重降噪策略,减少因光照选择不精确带来的噪点问题。
- 补偿系数机制:在着色阶段引入亮度补偿,以弥补因只选择部分灯导致的亮度偏差。
- 阴影优化:支持光线追踪(RT)和虚拟阴影贴图(VSM)两种方式,并对面光源和点光源进行不同的优化处理。
- 采样与合并:对同一盏灯的多次采样进行合并,减少冗余计算,提升性能。
💡 研发经验与教训
- 光照选择的权衡:虽然选择少量灯能显著提升性能,但会导致光照精度下降,需通过降噪和补偿机制进行弥补。
- 筛灯阶段的参数敏感性:筛灯的两个阈值(亮度和材质基准)对性能和质量影响显著,需根据项目需求精细调整。
- 打分阶段的重要性:筛灯后的打分阶段需进行完整的光照计算,以确保后续选灯的准确性,避免因简单筛选导致的错误剔除。
- 降噪的副作用:时间降噪可能导致拖影,空间降噪可能导致模糊,需根据场景动态调整降噪强度,避免过度降噪影响画质。
- 面光源与点光源的差异:面光源无法进行射线合并,导致追踪阶段更耗资源,需在光照设计时合理使用。
📊 关键数据与结论
- 光照选择数量:默认选择4盏灯进行渲染,可显著降低计算开销,但需通过降噪和补偿机制弥补精度损失。
- 筛灯阶段的效率提升:通过分块和筛灯策略,大幅减少后续光照计算的灯数量,提升整体渲染效率。
- 降噪参数:时间降噪默认累积帧数为12,空间降噪可通过滤波强度调整,影响画质与性能的平衡。
- 补偿系数封顶机制:防止低概率灯因补偿过高导致的“萤火虫”瑕疵,提升最终画面质量。
🎯 可借鉴的方法论
- 分块与筛灯策略:将屏幕划分为多个块,根据材质复杂度和光照影响进行初步筛选,减少后续计算量。
- 动态降噪机制:根据像素的“着色可信度”(shading confidence)动态调整降噪强度,避免全局降噪带来的画质损失。
- 采样合并优化:对同一盏灯的多次采样进行合并,减少冗余计算,提升性能。
- 光照选择与补偿机制:通过智能选择少量关键灯进行渲染,并在着色阶段引入亮度补偿,以保持画面质量。
- 参数调优建议:筛灯阶段的亮度和材质基准阈值需根据项目需求精细调整,以平衡性能与画质。
Slide 1 — 00:00:00

📌 要点汇总
- Megalights 的核心目标是提升光照计算效率,同时保持高质量视觉效果
- 采用光照贴图智能生成、动态光照优化和复杂场景高效管理等技术手段
- 引入新算法和优化策略,解决光照在不同材质和表面反射时的不一致问题
- 提升性能的同时显著改进视觉质量,为开发者提供更高效灵活的光照工具
大家好,我是李文磊,来自Epic Games。今天跟大家分享的内容是Megalights主要分三块,就是如何工作,或者说工作原理怎么能够更快、更省,还有就是一些效果的问题怎么解决。
Megalights的核心目标是提升光照计算的效率,同时保持高质量的视觉效果。它通过优化光照计算流程,减少不必要的计算开销,从而提高渲染性能。
在实现上,Megalights采用了多种技术手段,包括光照贴图的智能生成、动态光照的优化处理以及对复杂场景的高效管理。这些技术手段共同作用,使得Megalights能够在不同类型的项目中都表现出色。
针对效果问题,Megalights引入了一些新的算法和优化策略,以解决光照在不同材质和表面反射时可能出现的不一致或不真实的情况。这些改进使得最终的渲染结果更加自然、逼真。
总的来说,Megalights不仅在性能上有所提升,也在视觉质量上做出了显著的改进。它为开发者提供了更强大的工具,使得在创建高质量的光照效果时,能够更加高效和灵活。
Slide 2 — 00:00:19

📌 要点汇总
- 传统灯光渲染中,每个像素需计算所有灯光的着色和投影,性能随灯光数量线性下降
- Megalights 仅选择固定数量(默认4盏)灯光进行渲染,性能提升显著
- 灯光选择过程带来额外开销,是 Megalights 的主要性能瓶颈
- 仅使用部分灯光导致渲染结果不精确,需后续降噪算法修正
- 可通过 Debug 模式查看某像素连接的灯光,辅助理解灯光选择过程
先是它怎么工作的,或者是工作原理。先简单看一下它和以前的灯有什么不一样,有大概的了解。对于老的灯,我们一个像素如果有很多灯影响到它,每盏灯都会去计算,一个是着色,一个是投影。灯越多的话就越慢,它是线性的成比例的减慢的。
对于Megalights,它只会挑所有灯当中的固定的几盏来做渲染。这个n的话,默认是四,也就是说,从所有灯当中只选择四盏进行它的着色和阴影的一个计算。所以,随着灯的增加,这个开销并不是线性增长,或者说变化非常的小。
但是在选择哪四盏灯去做渲染?这个选择灯的过程会带来一个额外的开销,相对于以前的灯而言。而且这个过程是Megalights开销的主要来源。当然,在质量上它也会有一些代价,因为它只选择了其中几盏,所以最终的结果是不精确的,是估出来的。天生会带一些噪点,需要后面的一些降噪的算法把它补回来。
接下来在编辑里我们看一下,这样能更好理解它的工作原理。首先这个Megalights Enable打开,这里有个环境,现在的话已经打开了,所有的灯都是走的Megalights。然后这边有个命令行是Debug的Megalights,把它打开。那看到我鼠标放的这个点的像素的时候,有很多射线连着这个像素和这个灯,而且不停的在闪。这个我们可以简单的理解成,它挑了哪几盏灯。这边用抓屏的方式。
Slide 3 — 00:02:41

📌 要点汇总
- 该帧画面固定显示四条射线,代表四盏灯被选中进行渲染
- 渲染选择依据未明确说明,需进一步分析参数设置
把这一帧固定下来,大家可以看到有四条射线,也就是说这一帧它选了这四盏灯来进行渲染。这个数字的话,是由。
Slide 4 — 00:02:53

📌 要点汇总
- 设置 number samples pixel 参数用于控制特征点数量
- 示例中将参数设为 2,仅保留两个特征点
- 参数调整影响后续处理精度与计算效率
这个 number samples pixel 是来设置的,比如说我只挑两点的特征,把它设置成二,这个时候再把它。
Slide 5 — 00:03:07

📌 要点汇总
- (内容过短,无关键要点)
固定下来,这一针的话,每一针就只有两条射线,选择了两个灯。
Slide 6 — 00:03:14

📌 要点汇总
- Megalights 对同一盏灯的射线进行了合并优化
- 合并减少了射线数量,提升渲染效率
- 合并逻辑基于射线目标灯的重复性判断
有的返回四,但在有的时候,它的射线的数量有可能,比如说这一帧,有三条射线。这是因为Megalights对同一盏灯的射线做了一些合并的优化。虽然是四条射线,但是有两条射线是选中了同一盏灯,所以这两条射线就合并来进行优化,另外。
Slide 7 — 00:03:48

📌 要点汇总
on_sample_mode控制选灯和追踪阶段是否降采样,默认为 2×2 像素作为一个单位- 挑灯阶段根据灯对像素亮度的影响概率决定是否选中,亮度影响越大概率越高
- 挑灯阶段会计算补偿系数,以弥补未被选中灯的亮度缺失
- 打阴影阶段对挑中的灯发射射线测试遮挡,并进行降噪处理
- 降噪分为时间降噪(与前帧混合)和空间降噪(与邻近像素混合)
- 着色阶段使用传统光照计算,并乘上补偿系数以提升亮度准确性
on_sample_mode仅对挑灯和打阴影阶段起作用,不影响降噪和着色阶段- 挑灯过程分为四步:挑灯、打阴影、降噪、着色
- 分块用于指导后续光照计算复杂度,按材质和光源类型划分不同区域
- 分块结果可通过编辑器可视化,不同颜色代表不同复杂度的区域
- 分块的降采样力度可通过参数调整,影响分块的精细程度
还有个参数叫
on_sample_mode,这个就是来决定,一个是选灯,它这个过程;还有就是后面的追踪,也就是投影这个过程,它的计算是否需要降采样或者说降分辨率。默认是二,也就是二乘二四个像素作为一个单位来选灯和追踪。零的话是一个像素,一的话就是一乘二两个像素。接下来,具体看它怎么工作的。这边我把每个Light根据它的渲染管线分成了四步:挑灯、打阴影、去噪和着色。我们一个个来看。首先是挑灯也就是挑选哪些灯进行接下来的渲染。它基本的一个原则就是根据这盏灯对当前像素的亮度的影响。大小来决定它是否被挑中的概率亮度影响越大,概率越高。比如说这边,我这个像素黄色的这盏灯离它近的时候,这根线就是出现的概率比较高;远的话概率就低。面光源的话会选择面上的点。另外,挑灯阶段最后还会有一个补偿系数,因为灯很多,只挑中几盏渲染,它的亮度肯定是。欠缺的或者不够的,它会根据它的概率反计算出一个补偿系数,最终着色它的亮度,就是接近所有灯都影响到这个像素这个亮度。第二步打阴影,对挑中的灯,它的每一盏会发一条射线去测试阴影或者遮挡。完了以后就是对。结果做一些降噪处理。第三步。 降噪的话分两个层面,一个是时间上,也就是跟之前的帧,它的结果混一混;然后空间上的话,跟旁边的帧混一混,旁边的像素,也就是temporal的那个降噪和spatial的降噪,把这个噪点压下去。第四步是着色,着色的话,基本的计算和。传统的灯是一样的但是它会乘上一个刚才说的一个补偿系数,还有就是它有些,它有一些独特性,这个在后面我会具体提到。还有一个要注意的就是刚才提到downsample它只对挑灯和打印一阶段会降采样,对,在降噪和着色阶段它并不起效。跳灯是一个四步的筛子,我这边分了五步。我这边快速过一下,后面的话会具体的聊到。它最终的目的就是为了抽出这n盏灯,比如说四盏灯。但是为了抽出这四盏灯,它前面有很多工作要做,就评估所有的灯哪四盏灯会有更高的权重被抽中。这个评估的过程包括。一些部分,一个是分块,它会把屏幕分成很多小块按材质的复杂度,有没有面光等等,它主要是为了指导后面打分以及着色阶段它的一个复杂度的一个算法。它本身很便宜二三是最主要的一个筛灯分两步是因为它有两个力度,就是先按格子为单位去筛一遍,然后再按像素为单位。这个像素的话是降采样以后的像素把不。 符合要求的灯全都扔掉,大大减少后面打分剪短灯的数量。打分就是把筛下来的灯、留下来的灯,基本做一次完整的光照计算,根据它对这个像素的亮度的贡献值打一个权重。权重越高的,后面抽中的几率越高;反之的话越低。关于分块,我们编辑器来看一下。我这边有一些不同的灯,这个是给了一个面光源,给了个贴图。这个只是个面光源,这是普通的点光。还有这个球是给了一个复杂的材质,shading model是subsurface。那个地面是普通材质。这边有一个命令行我们这边把它打开,可以可视化这个分块的结果。大家可以看到不同的颜色在不同。复杂的灯光或者材质,这个颜色的标记就不一样。然后每个格子以格子为单位,标记出这个使用什么样的算法,为后面的计算做准备。这边tile的classification这个十二的话是降采样以后的一个尺度的力度,就是每个lights的unsampled。比如说,我把它变成零,大家可以看到这个力度就变细了。二的话,这个力度变大。把它关掉。还有就是,Metalas Debug里面也可以看到这个当前像素的一个Tile分块的一个结果。如果把像素放在普通的Tile上面,大家可以看到这里有一个左上角这里。它要type simple,就最简单。
Slide 8 — 00:09:55

📌 要点汇总
- 使用 simple texture regular lights 作为基础光照,未添加复杂贴图
- 筛灯是关键步骤,影响后续计算效能,分两步进行筛选
- 第二步使用格子划分三维空间,进行粗筛后再以像素为单位进一步筛选
- 每个格子容纳的灯数有上限,由显存决定,空间共享该上限
- 可通过 debug 模式查看格子中灯光影响分布,红色表示影响较多,蓝色较少
- 命令行参数
max col col lights per cell控制每个格子最大灯光数量 - 可通过勾选 Midnight 模式下的选项查看左上角区域的灯光影响情况
这边是simple的简单的texture regular lights,就是加贴图的面光,但是是简单。如果把它放到这个球上面,因为这个球是个次表面复杂的texture,这边是simple的没有加贴图。大家可以也可以从这个debug模式看出一些渲染上或者之后着色的一个复杂度的一个信息。第二步是筛灯,这也是很重要的一步,它决定了有多少灯会被留下来,然后进行后续的计算,对效能的影响大。这边我分了二三两步因为用到了不同的一个力度来进行筛选。第二步是使用了。格子把这个三维空间分成很多格子,以格子为单位,先进行一次粗筛,然后保留下来的灯,然后再进行以像素为单位,再做一次筛选。 这边有个命令行,forward,打开debug,我们看一下这个格子长什么样。打开以后,我们可以看到屏幕上不同的数字,它代表这个格子里面受到了多少灯影响。红色的比较多,蓝色比较少。每个格子。它容纳的灯数是有一个上限的,这边有个命令行,max col col的lights per cell,这个上限其实是一个显存的值吧,它是整个空间共享的。一般来说的话,每个格子可以到超过一百盏,但如果你别的格子少的话,这个格子就可以更多,因为它是共享。在这个可视化模式下注意一下,这边有三个选项如果看Midnight的话,把中间这个选项给勾了,就是左上角这边。
Slide 9 — 00:12:27

📌 要点汇总
- (过渡内容,无关键要点)
圈一下,isolate那个lights,它意思就是只看那个lights,因为。
Slide 10 — 00:12:33

📌 要点汇总
- 使用格子单位筛选灯光,提升筛选精度和效率
- 灯光筛选依据亮度阈值,不考虑材质和法线
- 材质基准亮度为0.18,影响灯光剔除判断
- 调整亮度阈值影响灯光保留数量和渲染质量
- 筛灯阶段不考虑遮挡,打分阶段也不考虑阴影
- 打分阶段进行完整光照计算,决定灯光权重
- 权重高的灯光优先渲染,权重零的灯光不参与后续处理
- 打分阶段未考虑材质影响的灯光可能权重为零
- 调整筛灯阈值可减少打分阶段零权重灯光数量
- 抽签阶段根据权重选择n盏灯进行后续渲染计算
因为这个可视化模式不仅对Miglaze有效,对Forward来讲也是有效的。再听一下。另外,在Miglaze Debug里面,先把这个关了。也有一个叫做Number Lights in Grid Cell,就当前这个像素所在的。Cell里面有多少Light?把这个也打开吧。比如说这里显示的是五盏,这个格子,大家可以看到左上角的这个这个地方显示的也是五盏,这边显示是十盏,也是十。所以从这两个Debug View Mode都可以观察。第二步用格子为单位。筛完以后它会保存这些灯有哪些灯一个列表,然后在以上所有灯位去精筛它,也就是格子里涵盖到的这些像素,会去查询格子里这些已经有的灯,而不会把所有的灯再去遍历一遍。这样的话会更精准,也会更快。然后。在筛灯阶段,它是怎么来筛选的,或者依据是什么?一个是他可以评估一个亮度,然后跟一个门槛或者说一个阈值进行比较。这个亮度高于这个阈值,它就会被留下来。它的亮度计算的一个考虑因素,在这个阶段是比较简单的,它不会去计算材质、法线这些。材质的话,会一个很简单的零点一八的亮度作为基准,根据灯光的它的一个朝向。 还有它的半径衰减的范围来进行简单的一个剔除。这边对,还有曝光,这边有一些灯,大家可以看一下。首先一个聚光灯,如果我转这个聚光灯的一个方向的话,我改变它的一个不同格子里的数字,代表它是聚光灯的。朝向会有一个剔除,这边还有一个面光源,也是面光源也会有一个平面剔除,也就是朝向。还有衰减的范围,我选中了这家面光源,把它衰减范围调小,范围剔除。还有曝光,对,刚才提到了,比如说这是人为的把曝光。变暗一点,它整个的一个剔除范围就更加的集锦。计算出来的一个亮度有两个门槛来把控,也就是比如说这个亮度高于这个门槛它就会被保留下来;低了就会被剔除掉。这边有两个参数,这边大概调一下。这个的意思大概是可以把它理解成。一个亮度吧,就是计算出来的亮度高于这个亮度的会被保留下来。现在是这么一个值。如果我把这个值调的大一点,也就是高于这个亮度的像素会更少,我的格子会更少,所以被剔除掉的灯会更多。这个时候当然会有很大的问题。调回这里,它会被。不正确的剔除掉很多噪点,还有个阈值是。 这个这个的意思是把这个材质理解成一个0.18的base color,也就以这个亮度的base color来计算。如果把这个值调高一点比如说一,就是以白色来计算,那它会更亮。更亮的意思也就是更少的灯会被剔除掉。这个调高,然后。大家可以比较一下,如果调的更低的话,会被更多的灯会被包括进来。这两个值的话,是用来过滤灯光的一个非常敏感的值,它关系到一个是质量,另外一个是效率,就是两头,一边偏质量,一边偏效率。接下来是打分阶段,也就是。是把刚才筛灯筛出来的那些灯做一个更加精细的亮亮度计算,基本上是完整的跑一遍一个光照计算这是比较费的一步,然后给出一个权重,也就是打分,然后后面的话挑灯的话,哪些灯需要被渲染,是根据这个权重的高低,参考这个权重高低来选择的。这边有一个要注意的是。打分阶段并不会考虑遮挡,也就是没有阴影因为我们这边还在调灯。根据刚才的渲染管线,打印是在调灯完了以后才会做的,所以即使被墙挡住的灯,它可能也会有一个很高的权重,只要它的亮度、距离、衰减等等但后续的话会有一定的处理,对这些灯,后面会提到。我们也。可以用Mega Lights的Debug来看一下打分的情况。打开以后,左上角的打印里面,这边就是。 是显示了当前鼠标所在像素的所有正在被打分的灯的一个列表,有灯的ID,还有权重,权重有高有低,也有零。越高权重的,在后续的选灯当中就会被选择渲染,零的话后面就不会被选中。这里有零,也就是没有贡献或者权重非常低的灯,它的原因是。之前筛灯的时候,它的计算的算法非常简单,只考虑它的距离还有方向,还有一些简单的一些明度的判断。不像打分阶段会有非非常复杂的一个着色的计算,因此有一些材质和法线的朝向引起的让这个像素并没有那么亮的一些因素。是不会被考虑进去的,所以筛灯没有把它筛掉,但是在打分阶段,经过材质的计算,最终的亮度非常暗,导致它的权重是零。但如果这边零比较多的话,就可以回到筛灯阶段看一下,就是能够调整一些参数,比如说刚才提到的这这两个阈值能够把。这些权重为零的灯,在筛灯阶段尽量提早的给去掉,因为打分是很贵的。在打分阶段,灯越少,每个light的渲染效率就越高。分完了以后是抽签根据打分的结果权重抽出n盏灯这个n的话是可以由这个number samples per pixel来调整的。然后进行后续的计算,比如说这边我们的DevDev工具包的上面做。
Slide 11 — 00:20:53

📌 要点汇总
- 选中灯的数量(N)影响后续着色和追踪计算,但不影响挑灯阶段的开销
- 每盏灯需记录ID、权重、UV坐标、补偿系数及是否需要追踪
- 面光源UV随机,点光源UV为(0.5, 0.5)
- 简化几何体用于光线追踪,可减少计算开销
- 点光源支持射线合并,面光源无法合并,增加计算负担
- 半影区域易产生噪点,因遮挡判断非黑即白
- Meg Lights支持两种阴影方式:光线追踪与VSM虚拟阴影贴图
- VSM方式需为每盏灯生成阴影贴图,增加额外渲染开销
- 近处阴影可使用屏幕追踪弥补几何体不匹配问题
- 远距离阴影可启用远距离屏幕追踪或far field追踪
- 未选中所有灯,需通过补偿系数还原整体亮度,可能导致结果波动
上角这一列就是被选出的灯的一个列表。这边有四盏。如果我把这个n变成二的话,就是两盏。这边要记录一些信息,一个是挑中了哪盏灯,然后或者说面光的话,灯上的哪个点以及一个补偿系数。之前提到过,因为只取了所有灯当中的几盏。所以需要一个亮度的补偿,在着色当中把它还原原来的亮度。这里N主要是贵在选中了多少灯,采样了多少灯,从而影响后续有多少灯会进行着色和追踪的计算。它对之前挑灯阶段并不会等比放大它的开销。还有,我们这边来看一下。这些被选中的灯的一些打印的数值的意义,一个是灯的ID,灯的它的权重是多少?这边九号灯被选中了三次,这个九号灯应该就是这个面光源。大家可以看到,面光源它的UV是随机的或者不同的,它是从面上采样了一个。点,零点五,零点五代表这两灯是一个点光源,点光源。还有trace代表后续是否需要投影或者追踪,是不是可见这一列。调完灯以后是打印,也是比较费的一步。它对每个像素像被选中的灯发。 送一个射线来判断它是否被遮挡,这种判断非黑即白,也就是要么挡住,要么没挡住。没有百分之三十五挡住,或者百分之六十没被挡住这种判断。对于完全的阴影当中,或者完全没有阴影的地方,这容易判断;但是对于半影,它可能就会产生不断的在这两种状态之间跳动、变化。这么一个结果,这也是造成噪点的一个主要原因之一。Meg Lights有两种阴影的方式,一种是追踪光线追踪,这是一个默认的方式是使用简化的一个几何体来追踪。这边我们可以使用Meg Lights的Shadow Cast这个Debug模式来看。这个投射阴影的简化几何点,另外一种是追踪VSM虚拟阴影贴图。这个对于每盏灯来说,它首先得生成虚拟阴影贴图,然后再让每个lights去追踪它。所以除了每个lights,它有对每盏灯都有一个外的渲染VSM的开销。另外,对于language Chinese
点光之前提到过可以射线合并,所以在追踪这块会比较省。大家可以看到,这边零零零一零零零代表这个灯被合并了。虽然是是四次采样,但是其实只采样了一次,被合并到一起。但对于 面光如果给它一点面积,大家可以看到这个射线是没法被合并的,也会导致这个追踪阶段或者打印阶段的更费。还有,Migalights除了基本的这两种印方式,还有一些弥补的印方式,比如说近处的或者说接触印可以用屏幕追踪的方式。来弥补,比如说简化几何体和本身几何体本身它不匹配的一个问题,还有远处非常远的地方,因为光追的几何体它的显示会有一定的距离和范围,没有的话,在很远的距离会丢失掉影子,也可以用远距离的屏幕追踪来弥补,默认是二二应该是开的。然后超远距离那些HILD如果存在的话,也可以使用一个far field的一个追踪来让HILD生成那个D。然后接下去是降噪,之前提到过这个,因为选中了n盏灯,并不是所有灯,所以最终的结果会。忽大忽小,忽明忽暗。虽然说每盏灯它都会有特定的补偿来还原,最终渲染所有的灯类似的。
Slide 12 — 00:24:35

📌 要点汇总
- 时间降噪可能导致拖影,需使用历史帧数据
- 空间降噪可能使图像变糊,通过相邻像素平均处理
- 降噪程度由“shading confidence”决定,高可信度区域降噪少
- “shading confidence”可视化中,亮区域表示高可信度
- 单灯照射时可信度高,多灯或面光源时可信度降低
- 时间降噪默认最多使用12帧历史数据
- 降噪开启与强度可通过Debug视图查看和调整
或者平均的亮度,但是每次补偿,最后得出的结果,可能也有一些偏差,导致在不同的帧,也就是在时间上,这种差差别会不断的在增值的上下波动,在空间上,也就是相邻像素这个差别也会在这个增值的上下这样偏抖。这就引入了需要在时间上进行一个降噪(temporal)的一个 denoise,还有就是 spatial 在空间上的一个降噪,来压低这两种降噪。时间上的话,它的副作用就有可能会拖影,因为它需要一些历史的信息数据。空间上的话,就是相邻的像素可能做一些平均 filter 的,会变糊,这是一系列的副作用。另外,降噪是否启用或者启用多少?引擎有一套机制去判断,而不是全屏应用统一的一个降噪,因为毕竟降噪是有质量损失的,并且有一定外开销。简单的说,它是会根据当前像素的一个灯光的平均中签率,也就是这个灯光稳不稳定吧,来定义这个降噪是否开启或开多少。这边有个专门的名词叫做“shading confidence”,或者叫着色可信度吧。这里有个debug,一个nice visual,如果。 我visualize我们打到六,就可以看这个shading confidence的可视化视图。越亮的话就是越confident,越有可信度;暗的话就是低可信度。可信度高的地方应用的降噪就程度低,或者不用降噪;反之的话降噪就高。这边我只有一个灯,所以在亮的照明照到的地方就可信度非常高。如果我把这个灯……的半径变成一个面光源,这样可信度相对降低,应用的降噪程度也会增加。如果我把这个灯复制几个,多几个灯,同样的像素,它在不停的灯之间选择,它的可信度相对降低,所以 shading confidence 这个视图也变成灰色了,这个可信度相对比较低。应用一定的降噪。在Microsoft Debug一打开以后,这边有两个打印是关于降噪的,一个是时间降噪,一个是空间降噪。大概可以参考几个值,一个是比如说时间降噪,这里累积的帧数大概多少?默认最高是十二,这十二是一个最高值,这里的值代表了它大概应用了多少比例的降噪。空间降噪的话,是否开?这边开了以后,这个filter应用多少?我们可以通过这些信息,对当前降噪应用大概有个了解。
Slide 13 — 00:29:36

📌 要点汇总
- 去噪后需进行着色和光照计算,与传统灯差异主要体现在补偿系数、采样策略和瑕疵控制
- 补偿系数用于调整随机选中基站灯的亮度,但设有封顶值防止低概率灯产生过亮或萤火虫瑕疵
- 着色时并非每盏灯都单独计算,采用采样策略提升效率,例如四个 sample 对应四盏灯
去噪以后是着色、光照计算,和传统的灯没有太大区别,除了三件事情,它是独有的。一个是它需要一个补偿系数,刚才提到的,因为它是随机选中的基站灯,所以要补偿亮度。但是这个补偿系数有个封顶值,这个封顶值的目的是为了不让一些非常低概率的灯被选中以后,它会有一个非常大的补偿系数,因为概率低,代表了它亮度肯定很低,所以要这个补偿系数很高。这个补偿系数会做一个封顶裁切,在不影响最终亮度太多的情况下,防止这些灯被拉爆或者产生像萤火虫亮点这种瑕疵。
第二就是,着色的时候,并不是每盏灯都去跑一次。比如说,我四个 sample,这里有四盏灯。
Slide 14 — 00:30:44

📌 要点汇总
- 同一盏灯被多次选中时,仅进行一次着色操作
- 色线合并后避免重复着色,提升渲染效率
- 着色次数与选中次数不一致,优化了渲染逻辑
选中,如果同一盏灯被选中多次,比如说这里红色的是我选中的这盏灯,事实上在这个像素中,这盏灯四次都选中了这盏灯,然后色线也进行了合并,这个时候的着色就是一次,而并不是对同一个灯着四次。
Slide 15 — 00:31:05

📌 要点汇总
- MegaLights通过固定整灯数采样、着色和追踪,显著提升重叠投影灯多时的效率
- 重叠投影灯数量、投影功能开启、灯数量多三者同时满足时,效率提升最明显
- MegaLights在四盏灯时合并同一盏灯的射线,减少追踪像素数量,节省计算资源
- 开启MegaLights后,重叠投影灯多的场景帧率显著提升,关闭后帧率大幅下降
- 重叠投影灯数量是影响效率的关键,灯数量本身并非主要因素
- 在灯数量少或影响小的场景中,MegaLights的固定开销可能超过其优势,反而更慢
- MegaLights在高密度灯光环境(如室内、城市夜景)中表现最佳,需开启投影功能
- 方向光不建议开启MegaLights,因其性能提升不明显,且影响其他局部光的权重和质量
- MegaLights对方向光的投影效果会因降采样而降低,且光锥场景存在距离和实例的局限
- MegaLights的效率优势主要体现在打印环节,其他环节如挑灯、着色等可能有额外开销
- 材质复杂度和灯光类型(如面光、点光)会影响分块和后续步骤的效率,需合理选择
第三就是去调制,它的意思是降噪是把材质的颜色先去掉,然后再降噪,然后再还原。这样的话,对材质或者贴图纹理等等,它不会被降噪,保持更高的一个精度。工作原理大概讲这些,接下去看一下怎么能更省或者提高效率。
首先和传统的灯到底谁快,也就是在什么情况下,Megalights可以带来更大的提升?这边我大概总结了一下。首先一个最重要的就是重叠的投影灯的数量。这里的有三个,一个是重叠,也就是可能范围比较大,影响某个像素的灯很多。第二是投影,第三就是数量,这三个是需要同时满足的情况下,对每个灯对整个的效率的提升是最明显的。
在这种情况下,省得多的原因,刚才原理介绍时都提到了,就是它只对固定的整灯数做采样、着色和摄影追踪。比如说四盏,相对于传统灯,所有灯都要做一遍一遍的做,要省得多。还有就是,即使在做四盏的时候,它如果有射线是选中同一盏的,它也会进行合并。另外就是可以在单盏灯下做这个追踪和追追踪,比如说二乘二、一乘二像素,这样也可以大大节省这个需要追踪的一个像素的数量。
这边在编辑器里我来对比一下,还原这这些条件重叠的很多投影灯数量,然后对比一下两者的一个区别。这边有很多的灯,范围非常大,然后照了很多很多的植被。现在是Make Lights在开启的状况下的一个开销,十三毫秒左右。关掉。现在的毫秒数非常高,也就是帧率大大降低了。
在所有这三个条件满足的情况下,我现在把一个一个条件给屏蔽掉,看一下两者的区别。首先把这个半径减小,也就是把这个重叠的数量给减少。这个时候。在关闭Mega Light的时候,大概九个毫秒;如果开启Mega Light,八点几,有一点点的差别,但是这个差距非常非常小,不像刚才灯数量那么多的时候的差距那么大。
然后把这个半径变大,这个因素去掉,然后把投影关掉,看一下两者的区别。在开启的情况下是十一到十二个毫秒,如果我把它关掉,这个时候大概是十三个毫秒左右。也就是说,即使重叠的灯的数量非常多的情况下,如果不投影,传统的灯和Mega Lights它之间的差距也比较小。可能这现在的差别主要来自于着色,毕竟着色还是所有的一个一个,但着色的速度要远远快于投影的计算。
然后我现在把半径调小了,也就是把重叠数量减少,cast shadow投影也关掉,然后比较一下两者。现在打开是八点八,关闭Mega Lights大概七点几到八左右,反而更快了。所以灯的数量,其实整片灯的数量其实并不是问题,而是重叠的投影的灯的数量,才是一个大的一个区别。
最后再做个测试,就是把数量本身给降下来。这里保留了两盏范围非常大的投影灯。看一下,打开那个灯的时候大概是十一个毫秒,把它关掉,大概十点几,十一不到,差不多。也就是说,在非常大重叠的投影的当中,如果把纯粹的数量降下来也可以缩小两者的差距。当数量非常少,比如只有两盏的时候,这个灯的优势就不明显。
但是,相对于传统的灯,每个灯有个基础的固定开销,它不管灯多少,它都会需要走一遍管线中的选灯、降噪,还有对除了Surface以外其他的,比如说体积类的对象、雾、半透这一块的影响等等。这块固定开销会随着分辨率的增加而增加,比如说一些参数,Downsample的Factor,还有就是每次的采样的数量,那个n,它会有涨落,但是它是一直存在的。
这里有一个场景,只要有一盏灯,比如说这里只有一盏灯,即使它的亮度非常非常低,视觉上根本影响不到当前的像素,但是事实上,它这个Make Lights这里还有一点二几个毫秒是一直在跑的。所以当这个灯的数量非常少的时候,或者影响非常小的时候,有可能每个那一次的固定开销就会超过它所带来的一个优势,比传统的灯会更慢。
所以最佳的使用环境就是这种重叠投影灯数量很多的环境,相对于传统的灯会快很多。比如说室内的高密度的灯光环境,还有就是城市夜景,还有很多很多的光源。另外,它的范围也很大,并且开了投影。不过有一点要注意的就是,重叠投影灯的数量一多,对于Megalights本身也会带来更多的开销,还有就是在品质上,特别是噪点上会更加的明显。
接下来一个值得讨论的是,方向光要不要开Megalights?默认是不开的。开的走的是BSM,我们可以通过这个命令行把它开启。目前我个人觉得还是不开为好,主要这边有三个原因,一个是性能上面,因为Megalights对于很多灯,它可以选中其中几盏来渲染来提升速度,但是方向光只有一盏,它在这方面并没有多灯摊薄的这个优势,性能提升不明显。
第二个也是最重要的,就是方向光其实对品质的要求挺高的,但是它一旦加入Make Lights,它就跟别的局部光来抢名了。虽然我们可以用这个命令行来调整方向光的一个权重,但是调大就会压低其他的局部光的一个权重,从而降低其他局部光的一个效果。如果调低的话,方向光本身的权重降低,就会导致它的品质降低。
第三的话,就是如果加入Make Lights,因为Make Lights刚才提到了会做Downsample以后降采样以后做投影,对方向光的一个投影效果也会降低。还有的话,就是如果走光锥的一个Make Lights,也有一些局限,比如说光锥场景的一个距离是有局限的,还有对于hierarchical的instance,它的WPO光锥也有一些局限。
接下来我在编辑器里演示一下大概的效果。目前的环境是有两盏局部光加上一个方向光,方向光没有开Make Lights。Shadow的质量是大概这样,然后效率是大概九点几十个毫秒。我把方向光的Make Light打开,大家可以看到,效率的话差不多也是九点几,但是它的效果差很多,因为这个时候方向光和这两盏Make Light抢名了,抢四个sample的名,它的权重的话,目前被设定在0.5。
如果我们把这个权重提高,方向光的效果会好一些,因为它会更加稳定。但是这也意味着两盏其他灯的它们的权重降低,品质也会降低。我这个权重调回去,默认0.5。还有一个就刚提到的,因为Shadow在Make Light里面做了,default默认是二,导致这个噪点变高。你可以减少这个default,比如零不做default,有效果就好很多,跟没有开那个Lights差不多。但是大家可以看到这个效率变成十二毫秒。如果把它关掉,十个毫秒。
接下来我想根据渲染管线来看优化,这样比较有条理一些。刚才提到了渲染管线分调灯、打印、去噪、着色这四步,分别看一下在这四步哪些是有开销,哪些是可以优化。
对于Mega Lights来说,简单的说,它的红利主要是在打印这一个环节,因为它跟灯数已经无关了。另外,其他的环节其实基本上都是为这一步而付出代价的,也就是相对于传统的灯,它可能会有外的开销。比如说挑灯阶段它主要相关的就是灯数,当然这里的灯不是同频的灯数,而是同一个像素影响到的一个灯的数量。
打阴影的话,跟灯数或者同一个像素被多少灯影响是无关了,因为最终还是采样n嘛,采样四只对这四个采样做射线。当然,面光的话,它不能合并射线,它实打实的四。点光的话,如果合并射线的话,就会更省。
剧照的话,基本开销是固定的,跟灯数和n也无关,对分辨率有关,它是主像素去去噪的。着色的话其实也能省,因为它只对采样的做着色,并且有可能会合并受限。当然它跟材质复杂度是有关的,另外也跟n的数量有关。
接下去我们分头来看,首先是跳灯,跳灯是Mega Lights跟普通灯光呢主要区分的关键步骤。刚才原理当中我提到了,就是把它分成了五步,我们这边再把它拆开来一步步看,哪些是可以优化的。
首先是分块,它本身的话没有什么可省的,它主要就是根据把屏幕上的像素分成不同的tile,这些tile里面就是存储或定义了当前的像素,这个tile里的像素,它的需要着色的一个复杂度吧。它会根据当前灯光的一个复杂度,比如说是面光还是点光,是否有贴图,还有本身材质的复杂度,是否是普通的simple的材质,还是比如说次表面散等等。这些信息为后面的步骤,比如说四打分,以及在这个跳灯之后的着色提供这些信息,让他们来分别调用相应的这种不同的算法。
因为后面这些步骤会做完整的光照计算,所以这些复杂还是简单的算法,直接关系到这个计算的一个效率。接下来我在编辑里给大家演示一下材质的复杂度和灯光的类型对,这部分分的影响,特别是打分、micro lights选灯的影响、效能的。
这边有个环境,有很多很多灯影响这个地面。然后现在的可以看一下这个micro lights的效能,大概三个毫秒。我现在把这个地面换成一个复杂材质,就是次表面离散的。现在变成三点九,接近四个毫
Slide 16 — 00:47:31

📌 要点汇总
- 通过减少灯的半径、使用聚光灯和灯光通道来缩短像素影响灯列表
- 灯光通道可有效剔除隔壁房间灯光影响,提升GPU效率
- 提高阈值可能影响视觉效果,需根据情况微调
- 降低灯光亮度可被阈值过滤,减少计算负担
- 大范围低亮度补光适合GI,对性能影响小
- 打分阶段优化有限,主要依赖筛灯阶段缩短列表
- 面光源材质复杂度高会增加打分开销
- sample像素数量影响打分成本,需权衡效果与性能
就是这个表,就是当前像素所有被打分的一个列表。我们的目标就是要把通过筛灯把这个表缩短,从而提升效率。缩短这个表的大致思路有两个方向,一个就是减少影响这个像素的灯的数量,另外一个就是提高一些阈值,让即使影响到这个像素的那些灯,如果它的亮度非常低的情况下,能够被尽快或尽早地排除掉。
具体的方法,一个是减少它的半径,灯的半径,这个很好理解,就是影响灯的这个像素灯的数量,当然会减少。还有就是比如说用聚光灯,因为聚光灯是有方向性的,在刚才提到过,就是在筛灯阶段,它会根据聚光灯的方向或者面光源的它的这个面平面的朝向,直接把它给剔掉,而不是用点光。还有就是灯光通道,这个也是很高效的,特别是对有很多房间周围、旁边房间的那些,用灯光通道把它直接可以剔除掉。
这两个阈值的话,刚才我也提到过了,但是要小心一点,提高这些阈值的话,在视觉效果上可能会有一点点的损失。如果这个值提高的比较多的话,这个需要根据情况来微调,不断的尝试。这边我在编辑器里演示一下其中用灯光通道来做优化的一个例子。
这边有个环境,有两个房间,一个房间有很多很多灯,另外一个房间就这么一盏。然后目前我分了灯光通道,这个房间是二,这个房间是一。然后我们看这个房间,它的效能。现在的先看这个GPU的开销,Megabytes大概在二点三毫秒左右,然后。这边debug打开以后,大家可以看到这个列表也不是很长,在这个后面不是很明显,但是大家可以看到没有这个就这一盏灯。然后现在把这所有的灯的灯光通道一打开,就是隔壁房间的,对效果完全没有影响,因为被墙挡住了嘛。但是这个列表就很长很长,因为它会追踪隔壁的灯。之前原理里面已经提到过了,在选灯或者筛灯阶段这个不考虑遮挡,所以即使在墙后面也会被计算,这是一个。
另外一个,MegLight的开销,这里到了六点几个毫秒,这个差距是非常非常大的。我把这个再关掉就有非常大的提升。这一点可能大家需要注意的。
对于这个例子,还有一种情况就是,我即使没有分灯光通道,我现在两边的灯光通道都是一样的,所以都穿过来了。这么多的灯在做计算。如果我把旁边的灯的亮度改的低一点,比如说减小十倍,大家可以看到,这个旁边灯也不会被计算到了。这个是因为这边被这个阈值给卡掉了,因为它的灯光的亮度对这个当前房间,即使没有遮挡情况下,它的亮度的影响也非常小,然后过不了这个门槛,所以被卡掉了。
但在日常或者实际的使用中,有可能有一些比较大的灯,也就是比较亮的灯,很容易穿过来,所以大家看情况,如果有这样的情况产生,最好用灯光通道来分,这样更加干净一些。
另外在提一下,如果有一些补光的需求,用很大的半径的一个直接光来做补光的这种需求,亮度也比较低,这个尽量避免嘛,因为这种大范围低亮度的补光往往是造成同一个像素受到非常非常多的灯的影响的一个因素。这种其实GI是非常擅长的,因为GI它喜欢比较均匀的、比较低亮度的这种灯光的光源,它的质量对于这种情况也比较高,不像非常亮的小的那种光源。这种如果用GI这发光来做的话,质量会非常差。这种适合用直接光来做,但是大范围的低亮度的这个GI是比较擅长的,而且多一盏少一盏对性能的影响几乎是零,几乎不会增加。
接下去是打分这个阶段,它是对当前的像素或者当sample以后的像素做一个完整的光照计算,然后给出一个权重,也就是影响有多大。然后为后面的选灯作为参考,它本身的话其实没有太多可以优化的。要说优化的话,就是你计算的时候,这个材质的复杂度,刚才提到了,就分块的时候尽量的少用这个面光源材质的复杂度尽量低等等,可以减少打分的一个开销。它主要的优化就是全靠前面筛灯的阶段,能够把这个列表给缩短。刚才已经提到过了。
另外一个就是当sample它对打分也是有影响,因为它是逐像素的嘛。当sample以后的逐像素,所以它像素越少的话,打分也越便宜。当然,这个会影响效果。还有一个minimal sample weight对打分阶段也是有影响的,但它影响的并不是打分的一个计算的一个成本,因为毕竟它只是个阈值,毕竟打分还是要计算完了整体的亮度以后,再跟这个阈值去比较,它会影响它这个权重,就是这边这个。
Slide 17 — 00:53:59

📌 要点汇总
- 权重设为零可避免被抽中,影响打分但不降低效率
- 打分阶段优化空间有限,主要在材质、灯光类型和筛灯参数
- 灯光半径、朝向、聚光灯和通道影响抽签结果
- 抽签阶段从候选灯光中随机选取四盏进行后续处理
权重就比较以后哪些权重我直接可以卡成零,而这个权重的改变会影响到后面抽签,把零的权重它后面就不会抽中,所以这个参数是有影响打分,但是不影响打分的效率。所以总结一下,打分阶段我们能做什么去优化呢?其实我们做不了什么,优化就在前面,材质、灯光的类型还有就是筛灯的时候。
后灯光的半径、朝向、用聚光灯、灯光通道这些,真正在打分本身这个阶段,我们其实做不了什么,就是计算一遍它的光照。接下去是抽签,也就是从这一篮子的灯光里面抽出四盏,也就是。
Slide 18 — 00:54:48

📌 要点汇总
- “四”的定义基于 number sample pixel 的数量,如两盏、四盏
- 后续计算依赖于该定义进行数据处理
是这个列表,这个“四”的话是 number sample pixel 这个来定义的,两盏、四盏,然后做接下来的计算。
Slide 19 — 00:54:57

📌 要点汇总
- 抽签操作基于像素级计算,采样模式影响性能
- 高采样率(如 2x2)会增加计算负担
- 抽签结果影响后续射线合并效率
抽签本身的优化其实没多少,就是一个当 sample mode,因为它是基于像素的每个像素来做一次抽签,它本身计算你当 sample 如果高的话,二乘二,那需要计算抽签,本身这步操作就更加结实。
但是它抽出来以后影响之后计算有几个因素,一个是比如说它这个射线能不能合并,这边。
Slide 20 — 00:55:26

📌 要点汇总
- 同一盏灯的射线被合并以提升后续着色和追踪效率
- 灯光合并优化了渲染性能,减少重复计算
大家可以看到,都抽中了同一个灯,就是当前这个灯。同一个灯的话,它的射线就做了合并。合并了以后,后面的着色还有那个追踪这些就会加快。
但这是对后。
Slide 21 — 00:55:41

📌 要点汇总
- 抽签效能主要受每个像素抽签次数和像素数量影响
- 调灯阶段开销可通过可视化工具和减少打分阶段灯数量优化
- 单sample模式和阈值对质量影响显著,需权衡效果与效能
- 暗景更省资源,因筛灯阶段大量灯被剔除,权重多为零
- 手动曝光或有限自动曝光可提升尼康莱卡在夜景中的效能
- 金属材质或低roughness材质减少灯参与计算,优化抽签阶段
- 筛灯阶段的两个阈值对夜景效果影响显著,需谨慎调整
- 暗场景中合理设置阈值可加速Megalights性能,避免自动曝光过亮
- 优化灯设置,缩小灯范围并调整衰减方式可减少像素受影响灯数量
面的影响对本身挑灯这块,或者对抽签这块,就是没有多大影响。还有一个影响抽签本身效能的,就是这个number samples per pixel就是你要抽四次、抽两次还是抽一次对这个效能影响当然是显而易见的。所以总结下来,抽签本身的效能就这两块:一个是每个像素每帧抽几次,还有有多少像素,就这两个。产生影响。对于调灯阶段的一个开销目前加了一个可视化,我觉得挺方便的。就在MikaliteLighting Complexity它的复杂度上做一个Opaque,因为现在是对不透明的对象大家可以看一下,越红就是越费它不是着色是那个调灯或者说Mikalite本身的一个开销。比如说我把这个灯的Channel给关掉。或者你屏蔽掉,这就大大减少这个选灯阶段的一个开销。然后第八个里面,我们可以也可以通过这张列表来查看它的一个调灯阶段的一个开销。列表越长,调灯越费。调灯的话,主要就是打分阶段的开销。所以优化的手段的话,主要就是减少打分阶段灯的数量。就通过前前面几步,特别是筛灯阶段,所以最后还是从内容上来做这个优化。刚才说到单张单sample的mode,这个对这几步都会有非常大的一个影响,因为都是基于像素来做这些计算的嘛。还有就是这个阈值也会有很大影响,这些都是影响质量的。在不得已的情况下,或者不考虑效果,就做scalability的时候,只考虑效能的。情况下,或者降级的情况下,可以适当的来调整这些参数。分析一些具体的环境,一个是为什么暗井更深?因为暗井呢,在筛灯街。 阶段对像素影响亮度很小,所以被筛掉了,从而更少的灯进入后续的计算,比如打分阶段计算,所以更是。所谓的暗景,并不是说故意把它压暗,而是它本身就需要欠曝光。所谓的欠曝光,就是比自动曝光要更压暗一些。比如说这个环境嘛,夜景,它一般都是欠曝光的。我如果自动曝光的话,就是这么亮。我们可以看一下它的开销。这种曝光下的话,Megalites是三点五、三点六个毫秒。如果使用手动曝光,这边三个毫秒,三点一。如果我再把它变暗,就变成二点五。也就更暗的话,更多的像素会被这个预。值给给筛除掉,也就更少的灯会做后续的计算。大家可以看一下这边的自动曝光,它的一个负补偿,默认的计算出来,这个环境应该是三个EV,自动曝光会很亮。然后这边其实负补偿了一点六,也就是我如果是用五点五的EV来曝光的话,负补偿一点六。所以在夜景情况下,就是在需要负补偿的。欠曝的这种环境下,视觉效果可以接受的环境,尼康莱卡的效能会会更高。因此,在这种环境最好能够控制好曝光手动曝光或者说使用有范围限制的自动曝光,不然它自己曝的太亮。这样的话,一个可以控制它的效果,另外在尼康莱卡的效能上面也能够更加的优化。环境非常暗,也有可能来自材质比如说这个环境,我给了非常多的灯地面是一个粗糙度非常低的金属的材质,这就会导致就是亮的地。 方仅来自于一些高光点,在没有高光的地方,金属几乎是黑色的,所以在这些区域就没有灯会被选中,也不会进入后续的一个追踪和着色的计算。比如我这边接一帧,大家可以看到这里有很多灯被打分的权重虽都是零,在这个地方但是这边这个list里面是没有任何灯被选中的,所以在。最终和着色阶段是非常省的。在这种金属材质或者 roughness 很低的情况下,大部分 diffuse 比较暗造成的这种暗场景,其实对抽签阶段的优化也是很大的。抽签的话,前面的这页提到,它是对所有的打过分的灯抽四盏。如果这些打过分的灯的权重大部分是零,这个抽签就不。需要有外的计算,抽签阶段的计算就非常快。反之的话,如果权重是各式各样的,抽签的计算会相对比较慢一些。比如现在 roughness 是零,大家可以看到大部分权重这边都是零,相对会快一些。如果我把这个 roughness 改大一些,现在的权重是各式各样的。我比较一下 performance,又打开。目前 roughness 比较高的情况下,大概是十四个毫秒,十三点几。如果我把 roughness 改成零就变成十二,会快不少。这边的开销主要节省是在抽签阶段。在比较暗的环境当中,这两个参数就是刚才上一页提到的门槛在筛灯阶段。多少单能够过这个门槛进入下面的一些计算?这两个门槛的参数是比较敏感的,因为它对效果的影响在业绩当中特别明显。比如说。 这个参数,它是为了快速的筛灯,它用一个简单的一个0.18的一个diffuse作为它筛的那个亮度的一个基值。我把这个如果改小一点,卡掉很多的一个效果,灯的影响范围,特别是高光,有些情况下,特别是夜景,比如说在路灯,要需要非常远的距离它的高光都能够影响到地面。这在夜景,特别是雨。雨天的时候是经常用到的。如果用比较小的一个值,比较大的一个值会对效果非常大的影响。同样这个minimum的sample weight,它不仅对高光,对所有都会有影响。比如说我把它调大一点,大一点大十倍,这两个值的话,在白天可能不太看得出来,但是在夜景的话会非常的敏感,所以。对于比较暗的场景如果你为了省效能,在筛灯阶段把这两个阈值提得很高,那对效果的话影响会比较大,这个可能要注意一下。接下去我们在实际的环境当中看一下这两个值、这两个参数或者门槛对最终效果的影响,尤其是这种特别依赖高光的夜景比如说地面是潮湿的,还有很多泼漆这种。比如说,我这两个参数,这个参数调低一点,大家可以看到会失去很多高光,尤其是直接光的高光。这一块是Lumen的,大家可以看到,比如红绿灯,这个直接光的高光会被很大程度的削弱。其实,在实际环境当中,真实世界当中这种红绿灯在很远的地方,在积水的地方就能被看得到,所以这个要小心。同样,这个参数也是会。大大的减弱一个最终的效果,所以在夜景当中的话,我们要根据实际情况,不要因为为了优化去把这个阈值调的特别高。 总结一下,为什么暗的场景对于挑灯阶段会更省?因为不管是因为曝光原因、材质原因,还是灯光本身的原因,暗的像素,它在这个挑灯的筛灯阶段,会根据这两个阈值,很多灯会被先筛掉了。然后,即使留下来的那些灯打分,很多权重可能是零,比较暗的像素,有很多权重是零的灯的情况下在其中。抽签抽四盏,本身的这个抽签的计算也会比较快。另外就是这两个阈值的权重的阈值对夜景它的视觉效果的影响是比较大的,所以要比较小心的去调整。还有就是要充分利用好这种暗的环境对Megalights性能的一个所谓的加速吧,就是曝光这些要控制好,不要。自动曝光变得太亮,从而影响性能。在调灯阶段,虽然我们可以对这些阈值做设置,但是对效果影响是蛮大的,特别是夜景。刚才已经也试过了,所以我觉得最主要的优化还是要从灯的设置,尤其是一些大范围的灯尽量的缩小它的范围,从而让某个像素同时被影响到,灯的数量降下来。这是一个主要的一个优化的方向但是有些灯的半径把它缩小以后,它的照明效果会会改变。这个时候的话,可以通过改变这个灯的一个衰减的方式并且调整一些亮度等等来模拟大范围的反平方衰减的一个效果。比如说这里我有一些灯,一个主灯,两个补光的副。辅灯,现在这个像素的地方,现在这个像素的地方,可以看到被三盏灯影响到了。这个射线,三盏灯里,在这个列表的地方,我们。
Slide 22 — 01:06:39

📌 要点汇总
- 反平方衰减对亮度影响显著,调整灯范围和亮度可减少计算开销
- 灯范围影响高光效果,diffuse补光可调弱specular贡献
- 阴影阶段优化主要涉及射线复杂度、合并和几何体数量
- 屏幕空间追踪解决光追与渲染不匹配问题,关闭会导致自阴影问题
- 光锥几何体超出场景范围时,可通过距离场和HLOD阴影弥补
- HLOD阴影由HIOD投射,需生成HLOD以确保影子正确显示
- 原厂光锥阴影默认关闭,仅在极远距离点光源投影时开启
- 射线合并和减少灯数量可提升性能,但需权衡对效果的影响
- 光锥是否合并、半影设置影响射线合并效率和最终渲染质量
也可以看,这个里边有三盏灯打的,但是因为反平方的衰减是非常强的衰减,在这个点,其实这左边两盏灯,它对这个亮度的影响极小,但是有影响的,所以这个时候就不是很合算。尝试把这两盏灯的范围缩的比较小,然后通过调整它的亮度。亮度也调小了,然后反平方关掉light fall就是衰减的一个曲线的参数也调整了一下,所以让这些像素没有受到这些这两盏灯影响,从而减少这个打分的列表,从而加快速度,同时也保证这个效果跟之前反平方方式的效果尽量的接近。另外一个注意的是,灯的范围它对高光也有影响。如果这个高光是特别明显的,它在这个范围之外就会有一个突然被卡掉的这种效果。在这些,比如说雨夜的地面上,所以在这种情况下,只能调到这个灯的范围,或者说这个灯只是作为一个diffuse的补光,我们也可以把它的specular的贡献给调弱一点。比如说我这边把它关掉,那这个效果就不明显,只有只有diffuse的一个效果。这仅限于对于一个diffuse的补光吧。specular的补光的话只能用比较大的范围去呈现。接下去看一下打阴影阶段的优化。阴影阶段的开销主要是这个射线的开销,分几部分。一个是射线的一个复杂度或者种类,它有几种射线综合的产生一个最终的结果。第二就是射线是否可以合并,射线的多了,然后有些可以合并的话,就可以加快速度。还有就是射线最终的几何体的数量和它的复杂度这三块。 射线的追踪就分级接力、中近远,哎,不同的射线的长度来表现不同的效果,效能的话也不太一样。近距离的话,通过屏幕空间的追踪,主要是解决光追环境和这个渲染的结合力不匹配的问题。比如说这个球,我把screen trace关掉,大家可以看到这个阴影就有自阴影的问题。我们可以通过
Make Light Shadow Cast来显示这个投影的光锥几何体,它跟原始的几何体是有比较大的差别的。所以,如果屏幕空间的追踪被关掉的话,这种差别就会表现出来。我打开的话就会好很多。然后,射线从屏幕空间追踪结束处,然后接着就会去追踪世界空间的光锥几何体。比如说,我直接把它放到屏幕外,我们可以看到还是有阴影的。如果是没有追踪世界空间的光锥几何体,除了屏幕就没有影子。在接下来,当光锥超出光锥几何体场景的范围的时候就会失去影子。这个时候有两种影子可以来弥补,一个是距离上的屏幕空间阴影,还有是原厂的。光追影,我们这边来看一下,在远距离的山其实已经失去影子了。我们可以在一个Light的阴影投射几何体的视图下看,这些山在这个视图里是没有了。我这边的话,通过开启距离场的屏幕空间影,可以产生一定的影子,因为是屏幕空间的影。这些影子并不是特别的精确,所以我们还还可以开启,通过开启原原场的光锥阴影,能够产生精确的原场几何体产生的影子。这些影子是由HIOD来投射的。 所以,首先要生成HLOD。我们可以在这个视图下面看一下HLOD。如果把它隐藏掉,就没有这个影子。对于光锥的射线的分级接力这块,哪些开或者开到多远,我个人感觉考量还是以效果为主,因为这些对效果的影响是挺大的。包括远距离的,而且像这个远距离发虚的是投的HLD的影子,那本身已经减过面,效能那一项也还好。另外补充一下原厂因为是HLD投影,它是非常远距离才会有的一个效果默认情况下是关闭掉的,因为这么远的距离需要投影,往往是太阳。但刚才也提到了,太阳的话,一般来说不建议。开 big lights,还是用的传统的 VSM,所以这么远的距离除非你有很远很远很大范围的一个点光源,在非常远的距离需要投影,可能需要开启这个,默认是关掉的。第二块打印的一个块就是射线合并或者减少 trace 的灯的数量在内容上我们关闭阴影,当然会减少这个 trace 的数量,但是可能会影响效果。我个人是不建议去关影的,有灯必有影。在代码层面会做一些射线合并的操作。这边我们看一下,我有四盏灯,这边打印一栏里面,这四个就选中的四盏灯,然后trace这一栏代表当前的这四盏灯是否投影,一是投影,零是不投影。这里虽然有个上限,就四四盏,但是如果这四盏里面越少是零的越少是一。就速度越快,影响这个一和零的有两方面,一个是本身这个光光锥是否做了合并,或者射线是否做了合并;第二就是半影。下面在编辑里看一下,首先这个merge race它是怎么工作或者节省的。目前我们这个像素点有四条。
Slide 23 — 01:13:40

📌 要点汇总
- 控制灯光亮度差异可提升射线合并效率,减少 trace 数量
- 灯光面积增加会导致半影区域扩大,增加无法优化的像素数量
- 开启屏幕空间追踪可提升效果,但需调整分辨率和质量参数优化性能
- 使用 Retracing Proxy 可优化阴影匹配,需注意投影体与模型的差异
- 光追阴影与 VSM 影响不同,VSM 适用于特定场景但带来额外缓存开销
- 减少灯光数量、优化材质复杂度、调整采样数量可有效降低着色开销
- 使用
Mark Page命令行可优化 VSM 缓存开销,减少不必要的页面使用 - 美术制作中应尽量减少 VSM 的使用,仅在必要时开启一两盏灯
首先,因为四个样本选中了不同的灯,所以每灯做了一个 trace,这个省不下来。要省下来的话,只能说某个灯它的权重特别高,在选选选灯的时候,始终选中了那盏灯。比如说,我把另外三盏灯的亮度改得很低,这个时候在选灯的时候,就给大概率的选择我现在选中的这盏灯。事实上也是都选中了这盏灯。这个时候做了 merge rays。所以确实只做一次,这个提升效率。所以给我们的洞见就是,打光的时候尽量不要很均匀的,每个灯都类似的亮度,影响影响同一个像素。如果有灯的亮度有差别的话会有更高几率的对射线进行合并,对阴影的开销也会也会有提升。另一个影响这个trace数量的是半影或者灯光的面积。当灯光有。一定的面积的时候,比如说我这边给它一定的面积在半影当中的像素,它的确实是没法做优化的。大家可以看到,这边确实虽然都选中了同一个灯,这个确确实四次,但完全在灯光下或者完全在影子当中,这个确实还是做了优化。所以这里给我们的洞见就是,当灯光的面积增加,这个半影的面积也是增加的,它的半影的。像素的数量也增加,也就是有更多的像素,它的确实是没法做优化的,所以要尽量控制好这个灯光的一个面积的大小,从而减少这个射线的数量。这边还有一个跟最终状态相关的debug,我们可以把它打开,这里就多一个trace的status显示了屏幕空间的世界空间的追踪的一个数量,trace的数量,还有volume是针对。体积物这些,大家可以看到,现在大概是十八万。当我们比如说把这个灯的面积打开的时候,给一点面积,这个射线数量就大大增加了。这个印证了,就是半会大大增加这个trace的一个一个数量。还有这个volume呢,我们不需要的话,可以把它关掉,就是megabytes volume,可以看一下,如果把它零的话。这边。 这样的话,体积物就写或者半透就没有Mega Lights的投影了。关于屏幕空间的追踪刚才提到过了,它要不要开?我觉得要开,因为它会非常影响效果。但要优化的话,可以在Screen Trace Quality这个命令行有两个值可以去调整它的一个质量,主要是调整它的一个分辨率。的计算分辨率,还有一些参数也可以做调整。然后我们可以从这个trace的status也可以看到,当然屏幕空间的很多像素走的直走屏幕空间的trace的时候,这两个差值就很大,也就同一条射线,四十四四十四万根射线有一半的大概在这个view当中直走屏幕空间的射线。这样的话可以减少世界空间的一个trace,但是开关屏幕空间的追踪是否有收益,这也取决于世界空间的它的一个它的BVH的复杂程度。如果非常复杂的话,这样可以的确可以省;如果很简单的话,有的时候甚至关掉了会更慢。阴影到世界空间追踪的时候,这个。这种模型的复杂度可以优化。这个需要注意一下设置,有几种,一个是静态网格物体,我们一般奈纳的话用生成的专门的Retracing的Proxy。就有一点就是,如果它的投影体跟它的模型有比较大差异的时候,阴影会不匹配。你可以用这个新加的Meg Lights的Shadow Cast Quality。看。如果有蓝色这种,是它这个投影体;白色是渲染模型。如果整屏的话,有很多这种蓝色的,就说明这个retracing的proxy可能需要调整一下。VineNet的话就是没有proxy mesh,是随着LD切换来做这个retracing。骨骼物体的话,一般我们会给它一个专门的最小的LD用来做retracing的proxy。但是要注意,他如果有。 布料的话,这里需要做一定的设置。它有几种模式,默认的模式的话,只能布料用它的渲染模型来做它的Retracing的Proxy。如果需要能够使用布料的LOD,所以说需要用后面的几种,这个需要注意一下,否则的话渲染上会有一定的问题。另外一个就是对光追场景进行优化,可以优化阴影。除了刚才说的对象的面数以外,就是减少对象的数量,还有一个就是不会动,因为会动的话,这个关键场景需要每帧去重建,也开销比较大。主要的优化手段就剔除这里的卡里,默认是三,它是可以通过一个半径,就距离上的,以及angle,angle就是在屏幕上的尺寸。摄像机为中心,一个视野上的一个角度,也就屏幕上的尺寸来做一个货的判断,就是大于三百米或者小于一度都会被剔除掉。比如说这里两度,那就有一部分比较接近的剔除。另外,即使是大于一度的,但是我这个范围减小会被。剔除掉。对于被剔除掉的这些对象,一个是看它影子有没有,还有就是,Meg Lights的Shadow Cast Quality其实也是用颜色可以很好、很清晰的表明哪些东西是在Meg Lights被cast掉、开了掉了。这边我们可以打开这些远距离的Screen Trace,弥补一些影子。虽然说不是很精确,但有的时候比没有要好。另外,顺便提一下,这个远距离的屏幕空间阴影是跟这个radius相关的,也就是这个radius radius之外的远距离screen space跟这个angle就它的大小是没有关系。比如说,我把这个大小设大一点,这些都被卡零掉,但是这个的开关对它是没有影响。另外一个是光。 对场景会不会动?它影响到重建,影响效能。比如说有WPO的材质,默认情况下是不动的。我们如果需要阴影动,就会开启Evaluate WPO in Ray Tracing,然后这个阴影就动了。但通常为了优化,我们会对WPO在一定的距离做关闭,比如说我设置三千的距离。大家可以看到,在三千个距离以外,对象是不动了,但是影子还在动。就是因为这边的距离的设置跟Ray Tracing里面的是分开的。Ray Tracing有专门一个WPO的Culling Radius,默认是一百二十米,这边把它设置成匹配这个WPO Disable的。现在的话,影子和对象的动画就能够。匹配上。另外,在打印阶段比较费的就是是否要评估材质。材质里的话,主要一个mask效果。如果retraction去评估这个材质的话,这个mask的效果就可以在阴影当中反映出来。目前我这边有一个calmask有纸杯的材质,这个阴影在没有evaluate material的情况下,这个阴影是比较low的。现在效能是。十三点几个毫秒,Mikulicz是五点几个毫秒。我如果把这个评估材质打开,这个mask效果就在一里面显示出来。但是Mikulicz变成七点八,接近八个毫秒,所以还是非常费的。因此,在平时制制作这个模型的时候,尽量能够沿着这个mask的透明的边缘去卡线。也就是多几个面,然后在评估材质里把它关掉。这样的话,因为多几个面,这个阴影也不至于太漏,并且我们又可以不评估这个阴影。这样的话,效能会比较高一些。另外,MegaLight选择使用光锥还是使用最终BSM,对效能也是有比较大的影响。简单的说绝大部分情况最好使用。 光追影,除非是某些特殊情况要想清楚使用VSM它需要解决什么样的问题比如说光追阴影它可能带来阴影和几何体不匹配的问题需要非常精确的影子,那可能不得不使用VSM。另外还有一个特殊情况就是方向光,用的是VSM,还有就是VSM对于半半透。或者逐灯的去评估mask材质等等,这个是比较有优势的否则的话都选择光追因为VSM的话,它的每一张开了VSM的灯,它都会有一个外的阴影贴图生成的开销以及缓存的开销。虽然说采样只有四个灯,它缓存的开销会比不开make lights的。VVSM的灯要小一些,但是它这个外开销还是要的。另外说一下VSM Maglights的Mark Page这个命令行,它默认是开启的,它可以优化缓存的开销,它只标记真正用到的硬页,比常规的VSM也就是没有开Maglights时或者VSM更加省。如果把它这个关掉的话,会使用更多的。缓存页,比如说这边有个环境有五盏灯,现在开启的情况下用了三百十几个需求的Page,如果把它关掉的话就是三百五十几个。这个Mark Page优化这个缓存的VSM缓存开销的大小,其实取决于当前像素或者这个View里面在选灯的抽签阶段抽到的。灯的数量,我把点八给打开。那意思就是,在这个列表当中,大家可以看到选的四盏灯嘛。它如果灯的权重对这个像素亮度权重贡献比较接近的情况下就会在不停的灯之间跳动。如果其中一个灯权重特别大,它可能就只选中了其中一盏灯。这些射线就可以合并,这个trace就可以合并。然后,这个配角的。 优化就比较明显,比如说我这边刚才是三百多个配酒,大家也可以看这个柱状,这是缓存液的大小。我如果把其他的灯的亮度降低,来让一个灯的权重特别强,比如说我降到一,大家看到这个配酒的数量就大大降低了,两百多。如果把它再降低。只剩七十一了。这个时候,如果看这个灯,基本上是全都同一盏灯。当然,目前的优化主要是因为这个列表上面这个筛灯阶段的列表,就把所有其他的很低亮度灯筛掉了,所以在选灯阶段,四个 lamp 只能选中其中的。我把这个灯的亮度,其他灯的亮度再提高一点,让。筛灯阶段不把其他灯筛掉,在选灯的时候因为权重的差异,还是主要选中了同一盏灯。这个时候我们可以观察一下这个缓存页大小开销这个柱状,并且开关这个mark pages的命令行差异还是非常明显的。对于美术同学其实要记得没那么复杂,就是在实。实际应用当中,尽量少用VSM的Megalight,除非是非常必要的,需要解决一些问题的时候开个一两盏,这样也就没有很多灯的VSM的配置需要缓存的一个开销问题。下面看一下着色的开销着色主要来自于三方面,这个开销,一个是多少像素要做着色,当然跟屏幕分辨率有关,但是对于Megalight的话。是跟当前跑的 mode,然后是每个像素它着色的复杂度,这个跟材质的复杂度相关;还有就是每个像素它需要做几次的这种反复的着色的计算,这跟抽到了几盏不同的灯的这个灯的数量有关。编辑器里看一下着色的开销,我们可以参考在 GPU 里面 render deferred lighting 这一项的开销。具体的话,如果是language Chinese
Profile GPU,可以看。 这个Render Default Lighting下有个Meg Lights下面的这个Shader Light Samples,这个左侧看一下。然后我们分别看一下这几个因素的影响,一个材质复杂度我们可以看一下现在Render Default Lighting是1.5左右。我把这个地板改成一个次表面离散的材质,相当复杂明显复杂很多。然后Render。二点几,所以这个是影响着色的一个主要的因素。然后是 downsample,这个会对多少像素影响?现在我们看一下,render lighting 二点二左右。我把 downsample 关掉变成三三左右了,就是明显上升了。还有一个因素就是。渲染几次,也就是抽到了几盏不同灯,这个越少,当然着色就越省。这边最直接的方式就是减少这个 number samples per pixel,也就是这个 debug 打开以后,这个列表里的灯的数量目前是四。你看 GPU 它的 render deferred lighting 是三点二,然后把它降到一。它就变成二了,这是非常明显的。我把这个调到调回四。另外,减少这个灯的数量,就是刚才提到,就是让这个灯变得更加集中,而不是那么分散,也就是影响这个像素的灯的权重更集中,倾向于一盏灯,而不是每个灯的权重比较平均。哎,面光源的话,就是它无法合并。如果比较。平均的话也无法合并这个射线,一旦合并的话,这个左侧阶段也可以合并。所以我们可以做个测试,这边的话,目前灯的亮度都一致,也就是比较平均情况下。刚才看了三点几,然后把这几盏灯只留一盏灯,其他灯的所有都降得暗一点,让它权重降低。这很明显变成二点二了。如果我把这关掉,减八个里面。大家可以看到,也是因为这边。
Slide 24 — 01:31:01

📌 要点汇总
- (内容过短,无关键要点)
选灯的时候只选了一盏,合并着色阶段也是受益的。
Slide 25 — 01:31:09

📌 要点汇总
- 着色对灯数量不敏感,但选灯开销与Mig Lights相关
- 面光源面积大时,筛灯、打分、渲染阶段开销显著增加
- 提高sample weight门槛可减少低权重灯影响,但需谨慎调整
- 面光源应控制范围和朝向,避免重叠和过大影响效率
- 降采样和sample per pixel数量减少会增加噪点,影响画质
- 低端设备可通过降低sample per pixel、关闭volumetric等参数实现scalability
- 噪点主要由挑灯阶段灯权重方差大、阴影区半影检测不稳定、降噪失效引起
- 减少灯数量、集中布置、调整衰减曲线是缓解噪点的关键方法
- 大量分散或亮度差异大的灯会导致方差大,增加噪点风险
- Tn(每帧sample数量)增加可缓解噪点,但会提升计算开销
着色对灯的数量不敏感我这边可以给大家验证一下,目前是三点一左右的开销。选中,复制,复制,复制,复制,复制,大家可以看到,选灯列表越来越长但是这个 random default lighting 增加了一点点,因为这这一项下面还有别的开销,在 mig mig lights 下面是增加了非常多,这个 mig lights,这是选灯开销的增加。因为着色的话,最多也就四盏,就下面这个备选灯等,跟上面这个列表多少是,没有多大关系的。对于美术来说,这几个因素我们能做什么呢?一个是降采样,这个是有质量损失的做不了什么,顶多是向下兼容,在不同平台在能够接受质量损失情况下,向向下调一些,包括这个。sample的数量,number sam number sample per pixel,这个也是对质量有损失。材质的复杂度其实也做不了什么,因为你该多复杂就得多复杂,而该什么shading mode就什么shading mode。这边的话就是能够意识到这一点,不要随意的去很大面积使用复杂材质,因为它会关系到着色的一个开销。至于着色几次,选中几盏灯,除了刚才说的。权重比较平均,这个不太友好以外,还有就是面光源尽量能够减少面光源的一个大小,这样的话有更多的射线可以合并。还有就是它这个灯的朝向,比如说spot light,还有它的一个范围,之前都提到过,就是以这种内容上的调整,灯的参数上调整来减少这个影响同一像素。灯的一个数量,还有一个就是提高门槛,门禁门的sample weight,这个在筛灯阶段是有用的,它是一个门槛,在着色阶段它也会作用,它用在三个地方:筛灯阶段、打分阶段,还有这里着色阶段。这个门槛提高了,就消。 相当于让这个选灯的灯的数量更加单一,把一些非常低权重的灯就就给屏蔽掉了,从而提高着色的一个效率。但是它对效果的影响也是蛮大,特别是夜景的时候,所以需要比较小心的去调整这个参数。接下去专门聊一下面光,因为这个对成本或者效率影响还挺大的,在各个阶段都是。一个是选能阶段,还有就是后面追踪阶段。这边列了一下它的开销都在哪里。之前提到过,一个是在分块阶段,我把这个打开给你,大家可以看到这个分块就是哪些块需要多复杂的一个时间的计算。它其实是以块为单位来做计算的,所以其实这块里面的很多像素可能并没有受到。这个面光的影响,但是因为这个尺度或者力度比较大,所以有可能会误伤到,所以它会感染或传染周边像素的运算的效率。第二就是筛灯阶段因为面光的面积比较大它很难被剔除掉或者筛掉因为只要面光上的某个UV或者某个点被某个像素采样到,这个面光就没法被。剔除掉,还有打分阶段,因为面光的计算的话会更加复杂,甚至有贴图的采样等等,所以它的计算的复杂度会倍增,比普通的点光。所以在打分阶段,包括后面的渲染阶段,类似都会比较复杂。在打阴影的阶段,我这边加个影子进去,因为它有半影。所以半影当中的这些射线都没法被合并。刚才提之前提到过了。所以对效能,包括后面没法合并的话,射线的着色的效能都会有影响。所以对于美术来说的话,最佳实践就是这个面光。 不要太大,然后范围同时范围也很大,会有比较多,但是你控制好范围,控制好它的朝向比较多,那问题也不是很大。比如说我这个面光,通过它的张角、张角对,这里,然后它的面积等等,这几个参数能够像spot light一样。控制好它的范围,多放几个也无所谓,但是不要非常巨大,范围又非常广,然后影响又重重叠叠,好多面光一起,这个时候就会不仅在效能上面,在效果上面,效果我后面会提到都不是非常友好。下面聊一下低端设备该降什么,也就是scalability。所谓scalability,就是默认是能够接受质量损失。情况下的降级,而不是所谓的优化。优化的话是要保证质量的情况下提升效率降级或者说scalability的话,我可以接受效果的损失,但是尽量的能够减少效果损失吧。所以我这边提到一些参数哪些是对效果影响比较大的?一个是number sample per pixel和downsample mode,这个在默认的scalability里面都有这两个参数的降级,但我个人。觉得这两个参数对效果影响还是蛮大的,表现主要是噪点增多。比如说我这把这个降低这两个参数,可以产生非常多的一个噪点。所以我个人偏向就是是否可以在它的阈值这两个参数上面做一些文章,能够让表现的确是有一点不一样,但是。至少质量上是可以接受的。它的阈值的降低或者抬高,它是改变这个列表的多少的,从而去改变这个miglex开销。比如说,我这边把这个抬高一点点,零点零零二,大家可以看到这个列表就减少了。 缩短了零点零零一,这个列表就增加了。包括这个,默认是零点一八,列表会增加零点一三,这个列表就会缩短。列表缩短就代表着这个micro lights的本身的筛灯阶段的开销是降低的,所以提升了效率。但是对效果上的话,的确是有点不同。但是相同的地方还是质量有保证的。另外,对低端设备也可以考虑关闭volumetric的megalights的映像,也就对体积物这些,这是一块开销。还有就是screen trace的质量关闭或者半精度或者全精度的一个计算。另外,这边也提供了一个表,列了这些参数在不同配置机器上大概是多少比较合适。这些数值的话,作为一个参考。接下去看一下效果问题或者美术上的一些问题,以及分析一下这个问题产生的原因和缓解的方法。最终的话,希望能够干净稳定,也不会增加太多的开销。首先是噪点,也是最主要的一个问题,因为之前介绍过MegLight。是重点的随机采样,它只固定渲染几盏灯,不是所有的灯老老实实都渲染,所以亮度是估出来,在时间上或者在空间上都会有一些不稳定。同时,它也做了降采样,还有如果这个采样的数量比较低的情况下,会加重这种噪点。接下来的话,我列了几种产生这种噪点问题的原因以及。及一系列和这个原因相关的例子,我们一起看一下。原因一是在挑灯阶段,如果对同一像素影响的灯很多,并且它们的权重差别非常大的情况下,各盏灯这边叫做方差。 就会很大,会造成一个不稳定,这是非影区产生噪点的主要原因。第二个原因是在阴影区,主要是半影区域它需要去检测或者trace是否被遮挡,在不同的时间这个遮挡没被遮挡,在零和一之间跳动,会产生不稳定,这是半影产生噪点。原因三是降噪,它。工作不是很好,主要表现在或者在那些像素之前没有被渲染、新进入屏幕的,比如摄像机移动或者对象移动,这些像素的地方没有历史的数据,导致一些降噪的算法发很好的工作而产生的噪点。接下去的话,我会通过一些例子,我们具体来看各个原因造成的问题的表现以及。缓解的方法。第一个例子就是原因一造成的非阴影区域的一个,因为方差大而造成的,哎,噪点。这边我有个环境放了很多灯,它呢,它们的亮度都是一样的。把那个denoise先关掉了,我更好的观察噪点。这边有很多噪点它引起的原因就是刚才说的方差大。这边的情况是很多大半径的,有很范围很大的灯,比较分散。虽然它们的灯的亮度都是差不多的,但是因为分散,所以对同一个像素,因为距离的关系相差很大,所以亮度的影响相差也很大,所以每个灯的权重也不一样,方差就很大,这是一种情况。另外一种情况我这边创造了个环境,就是放了很多灯,但是它们都放在了同一个点,所以距离上每个像素离它的距离都是一样,但这个灯的亮度非常的随机,大家可以从这个明。自看到后面的数值是每个灯的不同亮度,这种亮度差别就也同样造成了对同一个像素的亮度的影响的差别,也就是方差非常大。所以,要么就分得很散,亮度接近;,要么就是即使非常集中,但是每个灯的亮度差别比较大。第二种情况呢,比如说在。 一个房间里面有大量亮度各异的灯,这个时候可能会造成比较大的噪点。这边有两张图来解释为什么这种情况下会产生比较多的噪点。当灯比较多、方差比较大的时候,每一帧或者相邻像素的亮度值在随机取样的时候,它离这个真值的距离会比较远。虽然说都有补偿去。让亮度去接近接近所有灯一盏一盏都老老实实渲染以后的一个亮度,接近这个亮度。但是这种补偿还是会有大的差别,方差越大,这种差别越大。所以在这种情况下就会有比较多的噪点。反之的话,权重接近,方差比较小,它的离真值的距离比较近,相对比较干净。这边我还可以给大家验证一。下效果,这边有两组灯,比较分散。第一组灯噪点多,因为方差大。然后我把这些灯数量不变,集中到同一个区域。这个时候,同一个像素到这个灯的距离也类似,然后亮度有类似,也就方差很小,所以噪点就大大减少了。然后是怎么解决,或者说打光的时候怎么去避免这种噪点产生?从刚才的原理。就两个方向,一个是减少灯的数量,或者如果数量多的话,对同一个像素,它每盏灯的权重的影响尽量接近。这里面列了一些具体方法。减少灯的数量是最关键的,因为第二个权重的接近这个非常难控制,因为灯要什么亮度,摆什么位置,这个是根据效果来的,不能根据效率去调整这些,非常难。所以减少灯的数量是主要的方式。这之前提到过一些方式,就是一个是spot light或者面光,它的朝向,这个在前期来张角就可以cutting掉不少灯,然后收半径,把它范围变小。之前也提到过,怎么样在收半径的同时,能够保持灯的一个照射的。 范围就是通过调整它的一个衰减,而灯光通道也是一个非常好的高效的方式。还有就是Tn,也就是这个每帧sample的数量,这个可以很大的缓解噪点,但是同样也会增加开销。但是如果有很多点光源,它对它的亮度对某个像素的差别比较大,也就方差比较大的时候。很有可能在某一帧选中同一个灯的几率会很高,所以射线会合并。所以这个,如果对于点光源来说的话,可能Tn它对效能开销的增加并不是特别的明显。还有就是,downsample采样的分辨率的提升,当然也会减少噪点,但是这个只是噪点变得。更细,但并不代表这个噪点消失。更细的话,就并不可见,更不可见而已。但是对效能影响挺大的。第一个原因产生噪点的原因的第二个例子,例子B就是墙后有一堆亮灯。这个例子之前有看过,就在这个房间的墙后面有很多比较亮的灯。什么意思呢?就是这个灯在隔壁,但是它还是会对这个房间产生影响,因为在打分的时候之前提到过,它是看不见墙的,不做trace的。打分是选灯阶段做trace或者投影的检测,是在选灯之后了,所以在考虑,我这边打开,它的这个打分的时候,它是会考虑到旁边的灯的影响。为什么是亮的呢?因为旁边的灯越亮,它的影响就越大。当前房间的灯它的权重可能就会被降低。如果当前房间的灯的权重被降低到一定程度的时候它被选中的几率也就是。
Slide 26 — 01:47:26

📌 要点汇总
- (内容过短,无关键要点)
这边被选中的几率非常低的情况下,就会产生很多噪点。
Slide 27 — 01:47:32

📌 要点汇总
- 调暗灯光可降低其在图像处理中的权重
- 增加曝光可使噪点更明显,便于观察
- 选灯列表中目标灯被选中的概率较低
- 实际选中的灯可能为周围灯光而非目标灯
当前噪点不是很明显,因为这个灯比较亮。我可以把这个灯调暗一点,那它的权重就低了。我曝光调亮一点,大家就可以看到产生大量的噪点。
从这个选灯的列表看,它被选中的几率也很低。很多这三盏其实是旁边的灯。
Slide 28 — 01:47:48

(该幻灯片时间段内未检测到语音内容)
Slide 29 — 01:47:58

📌 要点汇总
- 着色无法解决噪点问题,因为当前灯光抢不到名造成帧间方差大
- 解决方案是通过灯光通道控制灯光影响范围和方向
- 使用聚光灯控制张角和方向,减少对当前房间的干扰
- 引擎优化功能 Guide by History 利用历史帧遮挡信息调整权重
- 默认 Guide by History 系数为 0.1,降低被遮挡灯的权重以减少噪点
- 降低 Guide by History 系数可使被遮挡灯不贡献权重,噪点进一步减少
这种情况着色阶段为什么救不了?着色不是已经有阴影、缺失的信息了吗?为什么救不了?因为当前闪的并不是旁边的灯,而是这盏灯,也就是这盏灯它抢不到名造成它的每帧的方差就很大,所以闪。所以着色是救不了这种噪点。如何解决这个问题?简单的说。就是让旁边的灯不要影响这个房间。我觉得最有效的方式是通过灯光通道,之前已经介绍过。另外就是旁边房间的灯的通过调整范围、半径或者使用聚光灯控制它的张角、方向等等自然的不影响这个房间从而提高这个房间的灯的一个权重,减少噪点。还有一个引擎做了优化,就是Guide by History这个功能。顾名思义因为在当前等打权打分打权重的时候是不知道遮挡的。Guide by History就是利用历史的或者上一帧的遮挡信息来指导当前的这个权重的计算。默认情况下会在权重的基础上再乘一个零点一,也就降低。隔壁房间或者被遮挡灯的一个上一帧被遮挡灯的一个权重,从而让当前房间的灯的权重提升,降低噪点。我这边Get by history关闭了,我把它打开,大家可以看到这个噪点就明显降低了。这个系数的话,默认情况下是零点一,如果我把它降低,理论上如果很小的话,这个噪点就会消失。也就是被遮挡的灯,它不贡献权重。大家可以看到,当前选。
Slide 30 — 01:50:03

📌 要点汇总
- 灯的权重参数不应设为零,否则遮挡关系无法更新,导致动画问题
- 半影区域噪点明显,面光源面积越大,噪点虚化区域越广
- 增加采样数量可改善噪点,但会增加计算开销
- 面光源穿透模型内部会导致噪点,需检查灯光放置合理性
- 灯的闪烁动画可能引发噪点,尤其在可见性变化时
- 灯光可见性动画的延迟会导致 shading confidence 误判,引发噪点
- 降低灯光亮度可减少 shading confidence 的剧烈变化,降低噪点
- 使用 intensity 变化代替可见性动画,可有效减少噪点
- 降噪参数调整需平衡,过强可能导致拖影,过弱则噪点明显
- 灯光布置和内容制作应尽量减少噪点产生,降低对降噪的依赖
- 摄像机运动可能引发拖影噪点,与灯光权重和 Gamma 曲线有关
- 阴影区域的时域降噪强度过高可能导致拖影,需调试降噪参数
中的这个灯,它是百分之百的权重,所以就没有噪点。为什么这个参数默认不是零,而是有一定的系数呢?因为如果是零的话,它就永远认为被遮挡,上一帧被遮挡,那些灯一直被遮挡,不会再做更新。这个时候,如果这种遮挡物有动画,比如说隐藏了,大家可以看到就会产生问题。如果有一定系数的话,这种隐藏关系灯的被遮挡关系就会被更新。所以这个参数不要调得太小,调太小可能会有问题,更别设成零。另外的话,旁边的灯一亮或者一多,这个功能也是挡不住的。所以最终还是最好能从刚才提到的这个内容制作上去规避这些产生这种噪点的原因。
另外一个产生噪点主要原因是半影,就在面光源下这个阴影虚化的这部分。这个面光源的面积越大的话,它的噪点的这部分虚化面积越大,这个噪点越明显。解决方法主要一个是采样的数量增加,但这个也会同时增加开销,这改善还是很明显的。Downsample如果不做Downsample,也会大大改善效果。它可以让噪点的颗粒变得更细,从而不明显,但是也会增加开销。另外一种,在这种原因下容易被忽视的形态,就是面光源穿到模型里面而产生噪点。这个穿下去了,噪点很强。这个是没有穿下。没有,几乎没有掉。它其实是有部分在下面的面被这个模型挡住,并没有对亮度产生贡献。但是它在做采样的时候,大家可以看到下面的这个面也会被采到,所以上半部做贡献、亮度贡献的面,它的权重其实被稀释掉了。如果上半部留的越小,它的权重稀释的越多,噪点就会越明显。
这就相当于这个像素是在半影里面,一会儿踩到有照明的这些点,一会儿踩到没有照明的那些点,从而产生一个不稳定的情况。这个穿插的这种情况,还有个问题就是它可能会比正常的亮度暗。我把这个car shadow关掉,大家可以看到亮很多。denoise要打开,可以,就是ca shade打开情况下,然后关掉情况下,它会暗一些。暗的原因这边大概解释一下,就是它其实算了两遍遮蔽,一遍是在着色的过程当中,因为着色它是会考虑法线的朝向的,所以背面下面的这部分对这个着色亮度是被排除掉了。然后在做阴影的时候,可见可见性的时候,下面这些又被剔除了一遍,所以被剔除两倍。当阴影打开的时候,就会比正常情况下要暗。
在真实地图里面,有可能是穿墙,就一个窗户,比如说放了一盏面光源来模拟室外照室内,或者室内照室外。这个时候,如果随意放置,装到墙里面或窗框里面,会产生非常多的噪点。如果调整一些采样的参数,当然步的精度的确也能改善,但是这会大大的增加开销,而且这是全局的。所以,我认为首先检查一下这个灯的放置是否合理吧,从内容上来解决这个问题。我这边把一个灯设置成跟这个窗户差不多大小或者小一些,这个噪点的问题就大大降低了。
甚至在这些参数比较低的时候,另一个引起噪点原因,是灯的闪烁,尤其是灯的可见性变化做的闪烁动画会引起噪点。比如说我这边有个环境,有两盏灯,一盏是Spot light,一点是point light。也照亮暗部,然后对Spotlight做了一个Visibility的动画,然后我们可以观察一下暗部在切换或者闪烁的时候,有明显的噪点。还有这个灯,就Spotlight投影这个灯的亮度会影响噪点的明显程度。现在比较亮,我把比较调比较暗,比如说调到五,噪点就不是特别明显。如果再往下调的话,噪点更加不明显。
产生这个问题的主要原因是降噪工作没有被很好启用,或者在那切换的瞬间它被骗了。之前提到过,降噪的启用的量或者强度,它取决于一个叫shading confidence。也就是shading的可信度,可信度越高,降噪启用的越少;可信度越低的地方,降噪启用越多。由于这个灯的开关,它反复的这个可信度在变换,但是可见性的判定,它会有一帧的延迟,就会导致这个灯它亮回来的时候,第一帧,它这个shading confidence是假的。也就是他欺骗了降噪工作,在内切换的那一帧,降噪工作没有被很好的执行,导致那一帧的噪点比较多。但是随着时间的累积,慢慢的就会变平滑,所以会噪一下,然后又变好,产生这种效果。
在编辑器里,我们看一下如何来理解灯亮回来的第一帧给了一个假的高可信度,从而产生噪点。我们可以观察这个,注意一下这个区域,现在是现在是暗的我把它亮回来。第一帧这个区会有一波噪点,然后慢慢收敛。再来一次,这部曲。我把Shading Confidence的View Mode打开,看一下Confidence的View Mode下,在灯暗的时候非常Confident,就是说它的可信度很高,降噪应用的非常少。这没问题。再量回来以。后,shadow里的confidence就非常低了。这个时候就会应用比较多的降噪来降低shadow的噪点。但是在从暗到亮的那一瞬间,因为可见性灯的可见性判断,它会延缓一帧会导致那一瞬间第一帧它的confidence还是应用了之前白色的或者很高的confidence,并没有应用足够的降噪,导致有比较多的噪点,但之后的话会应用正确的confidence,慢慢的就会收敛。
但反过来就不会有问题,也就是从低confidence突然切换到高confidence就不会有一瞬间的噪点问题。之前还提到这个spotlight它的亮度对shining confidence的变化的幅度是有影响的,因为它会影响所有灯对这个像素的亮度的影响权重。打个比方,比如说这盏灯非常亮的时候,它对这个像素权重是非常大的,所以它的开关之前前后的这个变化是非常强烈的。如果这盏灯比较暗,大部分的权重是来自来自于这盏point来的,那这盏灯的开关对最终这个像素对所有灯的权重是影响并不大,所以它之前之后的变化也不会这么明显。
如果把它调低,它的 shading confidence 的 view model 下也反映出来。它一旦调的非常低的时候大部分的权重都是来自于这个 point light,所以这盏灯的开关或者隐藏不隐藏,对这部分是几乎是影响极弱的,所以也不会产生大的一个 shading confidence 的变化,从而产生大的一个降噪的一个误判。解决方法的话,根据刚才我们分析的产生机制,其实最根本的原因是可见性判断的延迟,然后它造成了confidence的误判,然后造成降噪的不合理。所以,如果在最源头,我们把可见性这个动画去掉,或者不用可见性的动画,用intensity的强弱变化来表现闪烁,应该就能避免掉这个问题。
这边我可见性的这个动画track,我把它关掉,然后用强弱变化来模拟,这个问题噪点就大大减少了。还有一些其他的产生噪点的原因,无法很好的用降噪来抑制的,比如这里列了一些,主要是一些动画引起的,尤其是在shading confidence比较低的区域。降噪它本身是有一定的局限性的,参数调整有两面性,调的太强的话,它可能会产生拖影、变糊;如果是空间降噪,它会变;如果调的太低的话,它可能噪点比较多或者闪烁。所以我觉得最根本的解决方法就是在,因为降噪首先它需要有噪点,也就是在最开始如果在灯光的布置、使用上,能够尽量少的产生噪点,或者说,在这个 view mode 下,大家去看 shading confidence,尽量的白,尽量的少有非常暗的区域。在这种情况下,噪点本身就少了,那对降噪的需求也就少了。
我这边演示几个这种情况。首先是一个摄像机的运动导致的有些像。新进入这个屏幕,比如说我们可以观察这边屏幕最下缘,大家可以看到有这种拖影、拉伸的这种噪点。这种噪点产生的原因是因为这盏被遮挡的灯它使用了Gamma的白历史曲以后它有不同的进入屏幕、刚进入屏幕和已经在屏幕里的像素有不同的一个权重的Scale的值。导致它们之间会有一个差别。另外一个,比如说这种在阴影当中的刚进入阴影的shadow的这种拖影,拖影是因为这边shadow里的降噪强度非常强,尤其是时域降噪。我把这个debug打开大家可以看到。在这个十月。
Slide 31 — 02:02:31

📌 要点汇总
- 去降噪累积帧数为12帧,可能导致拖影效果
- 降低spotlight明度可提高confidence,减少降噪需求
去降噪这一栏里面,它的累积的帧数是十二帧,也就是非常多的帧累积数。这么强的降噪就会导致有非常强的拖影效果。如果我把这个 spotlight 明度降低,它的 confidence 就会提高,也就不需要有这么强的降噪。大家可以看到,现在的累积数可能就。
Slide 32 — 02:03:00

📌 要点汇总
- 灯数量过多会导致筛灯阶段被丢弃或被参数限制,影响亮度
- 增加网格格子数量和 max shading weight 可提升亮度,但参数调整影响大
- 低亮度灯会被参数过滤,调整阈值可改善亮度表现
- 灯的剔除顺序按前后顺序,可能导致亮灯被剔除,影响效果
- 细薄物体影子模糊或消失,与 downsample 和屏幕空间阴影衔接有关
- 提高 downsample 值或增加对象厚度可改善影子精度问题
- 屏幕空间阴影衔接问题可通过调整 Max Iteration 和最大距离参数优化
- Meg Lights 渲染机制存在精度硬伤,可通过调整参数或更换方案解决
- 增加 shading pass 数量可提升质量,但对性能要求极高,不推荐常规使用
就两三帧,所以当我移动的时候,也就不会产生太强的。当然也有一些,它会有一些累积,但是没有刚才那么强。包括之前屏幕下缘进出屏幕,它这种噪点的拉伸效果也也减弱了。至于在内容制作上、打灯上如何降低噪点这。之前已经提到过很多了做法,比如说不要穿插呀,然后很多灯不要点影响同一像素通过调范围通过调灯光channel来隔离等等,大家可以参考前面。还有一种效果问题是灯多变暗,在一些极端情况下,比如说很多很多灯范围又很大它相对于不开make lights会更暗。比如说我这边把make lights关掉。会亮很多,打开的话会暗不少。还有一种表现就是灯的跳动,在某些视角会突然的出现或消失,在不同帧还不一样。产生这个问题的原因主要是两个,一个是在筛灯的阶段被丢弃掉了,因为影响同一个像素的灯实在太多。之前提到过它根据格子来筛。时候每个格子容纳的灯的数量是有限的。这里主要有这个命令行来控制,其实是一个内存的量能容纳多少。我这边演示一下,在十六的情况下是这么个亮度。如果把它增加,灯就更加亮了,会更亮,有更多的灯会被涵盖进来。我这边把第八个打开,会更加明显。就是这个列表,左边这个列表的。长度,在筛灯阶段,如果我把它变得比较小的话,你看会被卡掉很多;调大的话,会更多的。 会包括进的,这是一方面。还有是低亮度的灯会被这个命令行给把它卡掉。之前也提到过了,可以演示一下。默认是零点零零一,我把它调成零,也就是完全不用这个参数去卡它,会亮一点点。如果这个参数越高,会越暗。第二部分也是很。重要的原因是,被抽中的灯,它为了要代表所有其余的灯的对这个像素的影响的总体亮度,它会有一个按比例要把它放大回去的一个倍增值。这个倍增系数是有一个封顶的,叫max shading weight。封顶值是二十。它主要是用来防止亮点乱跳,我们叫萤火虫效果。这个值。当然有的时候会限制它整体量,特别是这种极端情况,这么多灯的时候,我们把它放大,就可以把一些损失的亮度给救回来。对了,刚才提到的每个网格格子里面灯的数量的限制,我们可以看那个 output log 里面,如果看到有这个 warning,警告它已经超出限制就说明。在这个剔除阶段,剔除了一些灯。这边剔除的时候,在网格剔除的时候,它是按灯的前后顺序,而不是灯对这个像素亮度贡献值。因此,有可能后加的非常亮的灯会被先剔除掉,而产生非常大的瑕疵,也就是像这里演示的这样。所以,根据刚才的描述,我们如果要。把它调成跟这个那个lights关掉一样亮的话,我们可以把这个cell的数。 数量这边调的很大,max shading weight这边调的很大,这个换成零,最终的话效果跟开关都非常接近。当然,解决问题的方法并不是调这些参数,因为这些参数影响太大了。这里主要是为了演示一下更好的理解。产生这个问题的原因以及和哪些因素相关?引起这个问题主要原因或者最根本的原因就是灯太多了,灯一多就会导致筛灯的阶段可能会被丢弃一些,或者因为一些参数被卡掉了。所以最根本的解决方法就是减少灯的数量。至于如何减少灯的数量在内容测制作上如何去做?之前已经提到过很多了。另外一个问题,效果问题是细的、薄的东西,它的影子可能会糊掉或者消失。这边有个场景,有几根非常细的竖条,它的影子这边左边这几根是消失掉了,右边的话是比较糊。这边有几个因素影响它,一个是downsample,梅格莱斯downsample影响这个影子投影的计算的一个精度。如果是二的话,它在四分之一的像素上做。如果把它改成零,大家可以看到右边的这个改善效果,并且这边的改善效果成二。大家可以看一下,如果把它放大,可能明显一点。这是当sample二的效果。然后我把当sample变成零的时候,所以。好不少,还有一个就是屏幕空间的阴影跟。 那个追踪B V H它的影子的衔接问题,这种问题发生在非常细的,的H Z B并不是特别精确的情况下,即使屏幕空间的影子的质量是高的情况下在内容上的解决方案就是能把这些对象稍微给一点的厚度,这样的话H Z B会更加精准一点,或者说。分辨率会更高一点,衔接会好一点。如果是非常非常薄的情况下,可能需要提前终止这个屏幕空间的影,直接用BPH的投影来做。这边的话有两个参数是来做这个事情,一个是Screen Trace下的Max Iteration的次数以及最大的距离。比如说,我把最大距离改成零,也就是没有屏幕空间,或者我把这个。iteration的次次数降低,这样来改善这个问题。这个问题是Meg Lights的渲染机制,也就是重点随机采样,加上又做了downsample等等这些造成的,所以它是个硬伤。这里提出来是因为可能一些特殊的需求或者精度要求非常高的需求你可以通过这些方法来调整或者降低它的一个瑕疵,或者说你直接把这个灯。我的 meg lights 换掉,这里就完美了,对,强化对比的效果。另外这边提一下有个参数叫做 meg lights 的 reference number of shading pass,这个也可以提升质量,但是这个主要是作为 debug 或者作为参考了,它对性能要求非常高,或者说非常难。所以对于这种要提升的话,当 sample 是。它的首先可以做的事情,它对现在影响并不是特别大。
Slide 33 — 02:11:27

📌 要点汇总
- Meg Lights 的 Stage PU 开销约为 3 毫秒,4K TPSR 占比 50%
- 噪点问题显著,降低采样数量至 1 可更清晰识别噪点分布
- 噪点呈现半影状,可能与大面积投影灯(Spot Light)有关
- 灯光复杂度通过颜色区分:红(复杂)、绿(中等)、蓝(简单)
- View Mode 的复杂度显示与实际状况存在偏差,后续将解释
接下来,在具体的环境里,我们看一下这个Meg Lights,看哪些东西。我想主要两方面,一个是效率,一个效果。效率的话,我们可以先Stage P U看一下大概的开销。这边Meg Lights上有三点几个毫秒,目前是四K T S R百分之五十,三点几毫秒也不少。效果的话,主要看噪点,这是个主要的问题。一般我喜喜欢把这个N,就是采样的数量,先暂时降下来,比如降到一,可以明显的看到哪些地方噪点。这部分的噪点看上去像半影,这里应该有一个投影灯是比较大面积的,这个Spot Light有一定的面积。然后还有一些工具,比如说看效率的,Megalights的灯光复杂度这一项,大家可以看到,红的地方是相对比较复杂的,绿的其次,然后蓝的比较便宜。当然,这个View Mode的话,它反映的。状况其实并不是特别符合实际,后面的话我会可以解释一下,然后效果。
Slide 34 — 02:13:04

📌 要点汇总
- 提到投影体的 quality 和红色部分表示未投影
- 正在检查投影精确度问题
- 通过切换视角分析红色区域原因
方面还有投影的精确度,比如说投影体的 quality。红色部分代表这个投影体没有投影。确定为什么这边有这么多红色?我切换到正。
Slide 35 — 02:13:23

📌 要点汇总
- (过渡内容,无关键要点)
尝试图,或者说切换到 Shadow Cast,就是显示投影体。
Slide 36 — 02:13:30

📌 要点汇总
- 模型在“visible in ray tracing”选项被勾掉,导致无法投影
- 该选项影响Lumen在Lumen Scene中的表现
- 通过Shadow Cast Quality视图可选中模型并显示投影
- 选中“Visible Inclusion”可使投影正确显示
这部分是空的。这边看一下这个模型,不知道为什么在这里“visible in ray tracing”把它勾掉了。如果把它勾上,它就可以投影。当然,这个选项还会影响Lumen是否会在Lumen Scene里面。
这边我在Shadow Cast Quality视图里面把这些红色的模型都选中,它的投影都给显示出来,特别后面还有画,等等。我选这个Visible Inclusion。
Slide 37 — 02:14:16

📌 要点汇总
- (过渡内容,无关键要点)
就都变灰色了。回到这个新家的这个 lighting 照度这个。
Slide 38 — 02:14:26

📌 要点汇总
- 红色区域因多层灯光叠加影响同一像素
- View mode与之前模式存在关联
View mode看一下为什么这个地方这么多或者红色,是因为有很多灯呢,它层层叠叠影响了同一个像素,所以红色。
这个View mode其实是跟那个之前有一个。
Slide 39 — 02:14:43

📌 要点汇总
- (过渡内容,无关键要点)
叫做 Make Full Word Latin Grid Debug,我把这个打开。
Slide 40 — 02:14:53

📌 要点汇总
- 使用 grade 分级显示灯的数量
- 红、绿、蓝灯有不同阈值设置
- 当前阈值为 8,可调整为 32
- 阈值调整影响 lights 显示逻辑
就是类似的,它以 grade 的形式显示了每个 grade 里面有多少灯。当然,这边的红、绿、蓝还有个阈值,这两边的阈值不太一样。这边是八就变红了,下面的 lights 里面是三十二,我们可以把这个调成三十二。
Slide 41 — 02:15:20

📌 要点汇总
- (过渡内容,无关键要点)
那就跟 Big Lights 接近了。我把这个关掉。这边是红色,这边是绿色。我都关掉以后。
Slide 42 — 02:15:30

📌 要点汇总
- 红色与绿色显示用于同步视图,但view mode存在较大误差
- 筛灯阶段分为基于grade和基于像素的两次筛选
- 基于grade的筛选会统计所有被灯影响的grade
- 基于像素的筛选更精细,但计算开销较低
把它显示这个,也是这边红色,这边绿色,这样两边就同步了。这个view mode只能作为参考,因为它是有比较大的误差的。它主要是对筛灯阶段的一个开销基于grade有一个大概的一个可视化。之前也提到过筛灯阶段可以分两。哇,一个是基于 grade,它会筛一次,每个 grade 多少灯,只要里面的像素涵盖到了被某个灯影响,它整个 grade 都会被统计进去。第二个是根据像素再筛一次。我们可以拉近了,因为一个 grade 覆盖的像素少了,所以其实没那么费。
Slide 43 — 02:16:22

📌 要点汇总
- 拉远后一个 grade 覆盖更多像素,但实际灯光影响并未显著增加
- 阴影投射和材质复杂度的开销未被统计到视图结果中
- 左上角显示 27 盏灯影响该 grade,但实际参与打分的灯数量较少
- 权重为零的灯在挑灯阶段可显著提升计算效率
- 选灯阶段的开销较低,灯数量不是主要性能瓶颈
- Render Deferred Lighting 下的 Light 选项耗时 2.9 毫秒,是主要性能开销
- 屏幕空间和世界空间投影是 trace 阶段的主要耗时部分
但拉远以后,一个 grade 覆盖的像素多了,所以涵盖到的灯也多了,就相对看上去比较费。其实事实上没有那么费,这是被高估的一部分。还有一部分是被低估的,就是它不会统计阴影的投射这部分的开销,以及着色,也就材质的复杂度这部分都不被影响到这个视图的一个结果。没有意义的投射的复杂度等等。比如我把鼠标放到这个地方,大家看左上角的打印有二十七盏灯影响到这个grade,但这个像素其实没有那么多。那这个关掉,然后把debug打开,然后把这个鼠标还是放到这里,大家可以看左上角,其实真正打分的就这几盏灯。虽然这里 number lights in grid 也是显示二十七盏,但它真正打分的也就这么几盏,其余像素又滤了一遍,把很多灯给滤掉了。还有一点就是在打分阶段,如果比如这个像素会产生很多的权重是零的灯,这个时候挑灯的时候它的计算会快很多。我这边的权重都很平均。都相对会慢这个信息也没有或者不会在这个 make lights 的这个 lighting complexity 这个 model 上显示出来。有的时候,这个对效率影响其实还挺大的。所以这个视图我们大概作为一个选灯阶段最初。 粗略的一个 performance 的一个参考,然后我们看一下具体哪些是可以优化的。从这个视图,有些红的地方,我们看一下。首先它的灯有多少影响这个地方了?因为这个不是很精确,如果特别红的话,我们可以拉近,这样的会更精确一些。这些地方,其实从左上角这个列表目前来看的话。灯不并不是特别多,目前是十八这个地方,其实没有超过三十几盏的话,这个选灯阶段应该都还是可以接受的。我们也可以通过GPU profile来打开,来验证一下。在这边的话,我们可以看一下这个小那个lights。这是选灯阶段的一个开销是非常便宜的。所以目前来说,选灯的或者灯的数量不是一个特别大的问题。然后我们看一下,在这一项Render Deferred Lighting下面还有个那个Light的选项,这是二点九个毫秒,是个大头。这边包括的内容一个是。trace就是屏幕空间,就是投影以及世界空间的这两个是一个大头。还有是着色,着色的话相对比较便宜吧。我们可以有一个命令行,之前提到过。
Slide 44 — 02:20:04

📌 要点汇总
- 大部分 tile 使用简单着色(green 表示 simple)
- 少量 tile 需要次表面散射处理(如蜡烛)
- 次表面处理计算成本较高但覆盖面积小
就是它的一个着色的一个复杂度的一个 tile,大部分是最简单的,就绿色是 simple 的,有一些蜡烛可能是次表面,美丽一下呢,会费一点,但是面积非常小。
Slide 45 — 02:20:19

📌 要点汇总
- 通过关闭 Volume 的 Big Light 可减少射线数量并提升性能
- 使用 Lighting Function 可模拟体积光投影,减少计算开销
- 面光源半影区域射线无法合并,导致射线数量增加
- 减小光源面积或调整光源张角可优化射线合并效率
- 提高采样数可有效减少半影噪点,但会影响性能
- 优化灯光面积可在不影响效果的前提下减少计算量
- 体积光投影关闭后,可通过 Lighting Function 补偿影子效果
- 灯光数量不是性能瓶颈,灯光对像素的影响列表较短
- 黄色区域在 Tile Classification 中表示材质和灯光复杂度较高
- 降低光源权重差异可减少射线数量,提升合并效率
- 通过调整光源参数可平衡视觉效果与性能表现
所以着色这块也比较省。还有一块是体积类的效果,体积物,它同样也走了Mega Lights,还有半透,有一点点。再一个大头就是降噪。然后我们一个个来看,刚才最多的是一个Trace,就是投影。我们把这个Debug打开。然后还有一个 debug trace 的状态 status,所以 true。这边我们可以看到一个 trace 状态,有一百六十多万根射线,volume 的话是三十几万,目前是四 k,然后内部分辨率百分之五十 t s r,也就是两百多万个像素,然后 trace 是四条线,n 是四,但是当 sample 是二,也就又除以四。所以每个像素理论上是,如果全都有trace的话,是两百多万条。这里有一百六十几万条。根据以往的经验,因为射线是可以合并的。根据以往的经验,这个数值如果在零点五之内是比较优化的,也就是在一百万之内左右。如果大于这个值,现在是一百六十几。是吧?说明是比较废了。如果大于两百多万,也就大于一比一的话,那肯定是需要优化的。说明很多射线是没法被合并的,每个像素都实打实的在做每条射线。降低trace的数量,主要就是通过合并射线。在哪些情况下射线是无法合并的?一个是。面光源的半影里面,这些射线是无法合并的。还有就是特别多的点光源,虽然没有面积,但是它对同一个像素的权重非常接近。这四条射线n都可能选中了不同的灯,那射线也无法合并。如果有其中一个灯的权重特别强,那大部分时候是选中其中一个灯的。虽然是四条射线,但是也可以合并。 对于这个环境,因为之前看到很多噪点是来自于面光的半影,所以我就怀疑是因为半影的地方射线无法合并而导致的射线数量过多。所以我们看一下怎么来优化或者验证一下。这边先看一下,现在一百五十几万个射线,然后microseconds是四毫秒,然后这边洞口有一个灯,我选中了。它是有一定面积的,看一下它的source radius,也就三百个单位的面积。我把它调成零,验证一下。然后全屏回到一个这个视角。这个射线数量是大大减少,就只剩七十几万根射线。megalites是三点四左右,也就三点三四,零点六到零点七个毫秒,这是。一个非常大的一个优化。当然,这边只是为了验证原因,并不是说要去改这个Subs Radiance,把它变成点光源没有面积,这样的话会很大程度影响效果。如何在既能保证这种柔和的影子,又能增加效率?这边尝试改一下其他的参数,比如说这种柔和的效果影子,能够尽量缩小它的。范围或者面积,在屏幕上的像素的面积就会大大减少这个缺失的数量。比如说,这个是个探照灯(spotlight),可以尝试改变它的一个张角来改变它影响的范围。现在是五十七度。目前的Megalite是四点一个毫秒,一百五十多万根射线。我把它改成三十五。它的张角很小,Megalite三点八大大减少。射线一百二也减少了不少,但是暗了很多。这边的话,要调亮点。对,就是通过不断这种调整,在尽量保证效果的情况下,能够很好程度的去降低这个开销。当然,你可以不断调整其他的参数去逼近之前的效果,比如说这边转动一下它的角度,提高一下它的高度。 还有它的内角可以稍微给一点点,等等,哎,不断逼近之前的效果以这种调整内容的方式,在保证效果的情况下,尽量的能够提升效率,这其实是一种最好的方式。这边还有个Volume的开销,大概有三十万个射线如果我们不需要Volume走Big Light的话,把这个Volume的Big Light关掉,可以省不少。效果上的区别是,volume还可以照亮,它会遍历所有的灯,计算它的亮度,但是不会有投影了。但是没有投影灯相对还是比较快的,可以看一下,这边make lights没关掉之前是三点九四个毫秒,我们把make lights volume打成零,现在话是三点五、三点六左右,这边的volume射线就没有了,但是会多出来一个TLV的。这个射线数量,这是半透的。在Volume开启的时候,半透和Volume是共享的一个计算。如果Volume关掉的话,半透会有自己的一个计算,但是会大大减少计算量。如果我们半透也不需要投影的话,可以把半透的Volume这个关掉。现在是三点五,把它关掉的话,大概变成三点三点四左右。三点二左右,又可以省一块。这的话,根据需要,根据效果和效率,我们可以来来有选择性的开关。当然,这是一个全局的设置。对于体积光的投影,刚才提到关掉的话,这边有个场景就没有投影了效果会差到很多。如何来弥补它?其实可以用另一种方式,就是用 Lighting Function。Lighting Function 它是可以走投影的。我给一个材质,给了一些像窗格一样的一个纹理来模拟这样的效果。在这个视图的话,我们可以看一下区别。现在是关掉了 Volume,开了 Lighting Function。大概的 Make Light 是二点八几个毫秒。如果我……开了, volume。 把 lighting function 去掉,每个 light 是三点五毫秒,相差还是蛮大的。所以对于这种关掉 volume 以后的一些效果上的弥补,我们可以对一些需要投射影子的 spotlight 给一些比较匹配当时或者那个效果的一些纹理的 lighting function 来模拟它的一个。影子,这样的话会快不少。下面看一下噪点问题。之前提到这个环境没有太多的灯,也就是说没有太多不同的权重的灯引起方差太大导致噪点,而是半影的噪点,也就是灯光面积比较大引起的半影噪点。这边有,这边也特别明显。这种噪点没有特别好的处理方式,只能够。提高这两个最关键的参数,特别是采样的数量,二的话会好不少。四,或者说在采样比较低的情况下,降低这个当量谱的数值,改善会非常明显。但是,同样,它的,我看一下,它的performance影响大不大?Highlights七点八二降到四了。这里如果是一,如果是四到五点几,当然Pro影响非常大,因为它不仅影响它会影响到选灯、还有着色、打阴影等等,它影响的环环节非常多。大家可以看到,当然Pro如果是。是二的情况下是两百多万条射线,如果把它零,变成九百多万条射线,所以这个要非常小心。五元,那这个把它一,射线数也会降低,所以先提高采样数吧。当然,朋友尽量小心,谨慎使用。当然,如果这边灯光在制作上能够减少它的面积,那就是最好了。 这边不是说要去做一个效果的妥协,而是不要不要浪费,也就是要意识到这个面积会影响很多因素,一个是噪点,一个是刚才已经提到的射线的合并,这个射线的数量,所以不要随意的给一个很大的面积,就是在你效果刚好满足的情况下,给一个最小的面积,就打光的时候要注意到这点。来看一下。这个环境,这是个夜景的街景,然后下了点雨,有很多反射,高光比较,roughness比较低,然后那个路灯的话,范围比较广,非常大的一个范围,包括红绿灯。这边我给很大范围的原因是,希望红绿灯在比较远的距离就能够看到它的反射。类似于真实的环境,还有这个房子给了很多装饰的灯,spot light,也有一些面光源,给出一个比较立体的一个打光的一个环境。我们来看一下这边可以做些什么,对,meg lights。先看一下效率start GPU下面其实还好,两点几。然后看一下它的一个meg lights的。performance view、lighting complexity view,这这一块很红。刚才已经提到过,这个不是很准,我们可以拉近了去确认它是不是真的红。拉近不红,那就OK,就不用去管它。所以总的来说,在选人阶段,也就是灯对于同一个像素,它的一个列表并不会太长就大概就这些。如果走近的话。不会太多,所以灯的多少不是一个重点,在这边优化。而且刚才Stage GPU也不是很高。另外,我们也可以打开这个Tile的Classification,之前提到过,来看一下它的材质和灯光的复杂度,越黄的话越废。这边有不少黄的地方,它主要影响选灯和着色阶段。先把它关掉。这边有一些黄的地方。
Slide 46 — 02:32:40

📌 要点汇总
- Shading Model Clear Coat 材质导致 MegLight 开销较高(约 3.8)
- 改为 Default 后 MegLight 开销降至 3.3,性能提升明显
- 环境 volume 关闭可减少性能影响,效果差异不大
- 半透材质关闭后性能提升明显(从 2.3 降至 1.9)
- 光源过多且未约束朝向,导致地面出现红色光污染
- 使用 Spot Light 的朝向约束可减少光重叠,提升性能
- 优化灯光复杂度和遮光板张角可有效减少渲染开销
应该是玻璃对,然后比如说贴近这块玻璃看一下它的MegLight开销是三点八、三点九左右,三点八左右。我看一下,它玻璃是用了Shading Model Clear Coat,是比较费的。我这边尝试把它改成Default,看能省多少。MegLight这边变成三点三几,省的还蛮多,特别是贴近的省。这边并不是说要把这个改成其他的渲染模式,就是我们要意识到这一点:,这个材质的复杂度是对每个 lights 在不同阶段都有影响,尽量用比较简单的材质来表现需要的效果。还有就是这个环境的 volume 可以尝试关掉看一下对效果的影响以及对跑方面的影响。现在这么个效果,每个 lights 二点九。二点然后把这个光源关掉。原来是二点二相差很多。效果的话,好像没有太大差别。主要是投影投影这块,一个个角度都检查一下。这边的话,我觉得可以关掉。效率带来的收益。要比效果的损失可能更大。还有就是半透,现在二点三个毫秒,我半透也关掉试一下。二个毫秒还剩不少,一点九。这个主要影响半透的shadow,可以根据情况,影响不大的话也可以关掉。再打开trace看一下,trace多不多? 大部分环境都没有超过一百万,大概六七十、八、八、八几万,还好。对,目前不需要做太多工作。另外再提一下,就是在选灯阶段,我们也是可以做一些优化的。这边把Meg Light的灯光复杂度打开。大家可以观察地面的部分是稍微有点红的。这边我把曝光稍微调一下,这边地面部分是红色的。鼠标放上去,从左上角的打印列表里面,我们也可以看到很多的灯是可以做优化的。这边我看一下很大部分原因是因为我打了很多面光,是照这个建筑的,朝上照这个墙的,但是因为范围很大。也没有很好的约束它的朝向,导致对地面有了影响。之前在PPT里也提到过,就是前期阶段最好能够用Spot Light的朝向张角面光的那个约束来,朝向的约束来,尽量的减少光的重叠。这边的话,我选中这些光,然后它的八度,就是它的那个遮光板的这个门的张角,我可以把它收一些,默认八十八。抽到零,就大大减少了这个红色的区。把它返回去,大家可以看到这个比较。近看的话,这些约束就是八八的话就躺平了,这个折光板零的话就是更加聚焦。以这种方式来更加聚焦到我需要区,而不影响不需要的那些区。还有就是在这个太阳模式。
Slide 47 — 02:36:34

📌 要点汇总
- 避免使用大面积面光以减少计算复杂度
- 面光应集中在特定区域使用,避免覆盖整个场景
- 大面积面光如8192会导致像素浪费和性能下降
- 多个面光可复制使用,但需控制覆盖范围
下绿色最简单嘛,尽量少用面光,大面积的面光,因为面光,比如我拖个进去,它会影响其他灯光的一个计算复杂度。所以面光的话,就要集中在某些区域一起用,多复制就一起用也无所谓,但不要非常大面积的,比如说我这个非常大面积的八幺九二,然后照亮整个场景,让整个场景很多的像素都是受到它影响,而造成浪费。
Slide 48 — 02:37:11

📌 要点汇总
- 调大灯光范围可增强地面反射效果,但会增加计算负担
- 默认灯光范围为 0.18,调大后高光显著增加
- 每个 light 的处理时间从 0.18 变为 2.6,效率下降明显
- 通过调整参数可平衡高光与效率,如将参数从 2.3 调至 0.8
- 将灯光范围调至 0.002 可获得较好效果,0.003 会损失部分高光
- 地面反射强、灯光范围大时,建议采用此方法优化高光与效率
- 灯光穿到地下会导致阴影部分出现明显噪点
- 减小灯光半径可显著减少噪点,但需避免过度调整影响效果
- 半影噪点难以通过调整灯光解决,需减少面积或提高采样数量
- 噪点问题在打光阶段未被充分重视,需在多个环节进行优化
然后来看一下效果。对于这种下过雨的夜景的街道,我故意把这些路灯,包括这个红绿灯,它的范围都调得很大,主要是希望在比较远的距离能够看到它的地面的反射。这边看不到了,因为在实际情况当中还是能看到的。
这边有一个另一行,它是在选灯的很早阶段就把这个范围给剔除掉了,默认是 0.18,把它调大一点,那就可以看到很多高光就回来了。当然,这个在选择阶段会有更多的灯会被包括进来去打分,会稍微再费一点。
我们可以看一下效率,每个 light 是 2.6,我刚才的是 0.18,是 2.3。零点三个毫秒,是挺明显的。但是我们可以用另外一个参数,这个是影响比较多的地方,选灯、打分,还有后面的着色都会影响到。稍微调一下这个,去卡这个门槛,来把这个不方面色再拉回来点。目前我们是 2.3,我把它这个调到 0.8,把高光给救回来。
然后把这个稍微再升高一点点,比如 0.002,要比刚才现在这边 2.3,跟刚才差不多了,但是效果要比刚才好一点,甚至我可以再高一点,0.003,会损失一些高光了,但是比刚才用这个会要好很多。现在的曝光门是会更高,2.1 了变成。
尤其是在这种地面反射比较强的,而且灯光范围比较大,需要比较大的范围的高光的这种环境当中可以尝试用这种方式,在保证效果的同时也让效率尽量的快。
另外一块是噪点,尤其是阴影的部分。如果把这个 N 调小,会明显一点。这边有非常明显的噪点,还有这边。我看了一下,主要原因是这个灯呢,我给了面积,radius 比较大,而且是穿到地下去了。之前提到过,穿到地下,这个照明的地方,即使没有阴影的地方,也会产生噪点。解决方法就把它拉上来,当然所有的不能传下去,稍微调小一点,这个时候就大大减少这个噪点数,稍微对比这边很多。
其实这边问题还是比较普遍的,之前打光的时候也没有意识到这个问题会产生这么多噪点,所以需要改的地方挺多的,还有这边也一样。但是有一部分噪点像这种噪点是半影的噪点,并不是因为它穿到下面去了。半影的噪点刚才提到了,就是没什么特别好的方法提高它的,要么就是减少它的面积,要不然就提高它的采样数量。
Slide 49 — 02:40:39

📌 要点汇总
- (过渡内容,无关键要点)
消除瑕疵,当然这边的话,我还是要把它拉出来,稍微减小一点,不要穿,这个时候就会好不少。OK,那Make Lights就讲这些,其实还有一些没涉及到的,或者没有具体讲的,比如说半透的,还有毛发这些。如果大家有什么问题的话,也可以在回复里面留言,一起来讨论,谢谢大家。