针对虚幻引擎4中光线追踪内容兼容性的实用解决方案

摘要

尽管现代图形硬件提供了实时光线追踪的特性和性能,但像游戏这样的消费级应用必须面向老旧硬件,以服务庞大的安装用户基础。本章讨论了在处理此类旧内容时进行光线追踪所面临的一些挑战和解决方案。特别地,它演示了一种混合光栅化和光线追踪半透明效果的解决方案,以及一套针对动态植被的解决方案。

图 50-1. 在虚幻引擎4(UE4)中使用动态植被渲染的森林场景。该场景使用光线追踪来呈现阴影和反射。该场景由 Richard Cowgill 使用 Nature Manufacture 出品的 Forest - Environment Set 制作,该资源集可通过 UE4 市场获得 4

50.1 引言

光线追踪为一系列以前对于实时应用(如游戏)来说具有挑战性或不切实际的图形效果开辟了道路。然而,所有面向消费者的应用(如游戏)都承担着沉重的旧版支持负担。游戏在发布时,其效果和美术资产必须能在代表绝大多数用户安装基数的平台上良好运行。这个限制条件要求开发工作的主要重点放在能够很好地适应光栅化的内容上。当前优先考虑光栅化以满足市场的需求,限制了专门针对光线追踪进行优化的周期。

由于修改耗费多人年开发的资产存在实际限制,在实时游戏中启用光线追踪效果的当前路径是让光线追踪效果适应已经存在的、以光栅化为核心的内容。本章介绍了解决两种常见渲染机制中挑战的技术:半透明和植被。这些技术已成功应用于已发布的游戏中,以启用光线追踪效果。虽然这些算法是在虚幻引擎的背景下实现的,但它们具有广泛的适用性。NVIDIA 的 UE4 自定义 NvRTX 分支(可通过 GitHub 向任何注册了虚幻引擎访问权限的用户获取:https://github.com/NvRTX/UnrealEngine)演示了这些技术及其他几种技术的实现。

50.2 混合半透明

游戏中的半透明通常指任何不透明以外的物体。对于光栅化而言,这意味着在其他几何体上进行 Alpha 混合。这一类别涵盖了常见的物体,如玻璃和水,也包括粒子效果,如烟雾和火焰。重要的是,由于半透明物体表面大量重叠,它们给光栅图形带来了特殊的着色和合成挑战。

50.2.1 动机

虚幻引擎4(UE4)中光线追踪半透明的标准实现是在一个单独的通道中处理所有半透明效果。从观察者视角发射主光线,追踪到离最近的不透明表面前方一点的位置。深度缓冲区提供了这个最大光线距离。光线对最近的命中点进行着色,包括一次反射反弹和任何必要的阴影光线,然后发射一条继续光线。

(a) 光线追踪半透明 (b) 光栅化半透明

图 50-2. 光线追踪半透明在着色方面提供了显著的提升。然而,美术师通常是以光栅化为目标来创作内容的。此场景是 Amazon Lumberyard Bistro 1 的一个变体。

根据设置和材质类型的不同,继续光线可能会产生折射。在正确的设置和内容下,该算法能产生高质量的结果。半透明交互被完美排序,着色效果较光栅半透明所用的着色有实质性提升(图 50-2),并且折射效果得到原生支持。重要的是,要实现这一结果,需要将内容进行适当的配置。如果没有适当的调整,通常会遇到性能挑战和图形伪影。

全光线追踪半透明最直接的性能挑战来自为光栅化而创作的粒子效果。粒子系统通常会创建多个精灵(sprite)重叠在一个像素上的体积效果。要使用全光线追踪半透明捕捉每一层,需要追踪一条额外的光线和一次额外的着色调用。尽管这可能会产生高质量的体积效果,但其性能缩放与美术师最初预期的方式大相径庭。例如,即使是八层光线追踪交互,也不足以渲染一个简单的火焰和烟雾粒子系统,而不会因为光线过早终止而产生明显的空洞伪影。更重要的是,以这种重叠程度对粒子系统进行光线追踪,其成本大约是光栅化成本的10倍。尽管粒子系统是最常遇到此性能问题的例子,但性能挑战并不仅限于它们。美术师可能会在餐厅里放置数十个小玻璃杯,但他们从未打算让这些杯子对场景视觉产生巨大影响。由于合成顺序的依赖性,不能混合搭配半透明的渲染方法。

全光线追踪半透明的质量挑战比性能问题更加多样化。粒子再次成为首要关注点。在 UE4 中,粒子挑战的首要问题之一是,许多旧内容依赖于一个名为 Cascade 的粒子系统,而不是一个名为 Niagara 的新系统。较旧的 Cascade 系统完全缺乏光线追踪支持,因此启用全光线追踪半透明会导致所有来自 Cascade 的粒子完全消失。这迫使使用旧版粒子系统的开发者要么重新制作这些系统,要么放弃光线追踪半透明。即使所有粒子系统都得到支持,将它们作为屏幕对齐公告板(billboard)的美术制作过程,在新的渲染方法下未必能保持良好效果。

全光线追踪半透明的下一个挑战来自折射和扭曲。光栅半透明通常仅将扭曲作为一种精心放置在场景中的特殊效果。光线追踪半透明则通过自然的折射来实现这种扭曲。这就要求么禁用折射,要么正确配置所有材质的折射率。结果是,要么没有扭曲/折射,要么需要编辑可能数百种材质以及几何体,以确保折射属性都已正确配置。在并非从一开始就打算支持光线追踪的开发内容中,配置错误的折射参数非常常见。一个简单的例子是窗户。游戏通常会使用一个双面四边形作为窗户。即使折射率正确,能够驱动引擎使用的基于物理的渲染,但由于缺少代表玻璃背面的第二个四边形,会导致扭曲。光线会沿着折射方向继续传播,就像在看一块实心玻璃一样。最后,全光线追踪半透明的最佳性能调优参数本身也会带来图像伪影挑战。光线追踪半透明要求用户限制追踪的层数。虽然这在深度复杂度高的情况下极大地帮助了性能,但超出限制的半透明表面根本不会被渲染。尽管前一两层对图像的影响最重要,但物体完全消失是令人遗憾的(图 50-3)。

(a) 多层光线追踪半透明 (b) 单层光线追踪半透明

图 50-3. 只有单层半透明时,重叠的玻璃杯会导致离观察者较远的玻璃杯在重叠部分消失。

50.2.2 我们的混合方法

这里描述的混合半透明解决方案弥合了光线追踪半透明和光栅半透明之间的差距。最适合光栅化的效果可以使用光栅化,而光线追踪着色则应用于更重要的表面,如窗玻璃。混合半透明通过让光线追踪通道将其结果存储在一个屏幕外的缓存中,解决了前面提到的排序问题。该缓存独立地捕捉半透明层的辐射度,而不是将它们合成。这使得光栅化阶段的半透明可以在缓存中查找着色结果,并将其替换为通过光栅化产生的着色值。重要的是,所有希望接收光线追踪效果的半透明图元都需要渲染两次(一次通过光线追踪,一次通过光栅化)。由于使用光栅化来合成所有东西,混合半透明无法提供全光线追踪半透明所带来的顺序无关半透明的优势。然而,混合半透明旨在处理已必须应对此挑战的旧内容。此外,混合半透明使用与光栅化相同的折射和扭曲方法。尽管这些效果看起来不会比光栅化时更好,但它们现在可以完美运行,无需美术师专门为光线追踪调整效果。其结果是,该技术以与光栅化系统一致的方式运行和表现,而内容已经针对这些光栅化系统进行了调整,同时在几乎没有资产管线成本的情况下,极大地改善了如窗户等表面的着色效果(图 50-4)。

混合半透明的光线追踪着色缓存通过将样本存储在屏幕空间纹理数组中来工作。帧缓冲区中的每个像素包含最多

(a) 全光线追踪半透明 (b) 具有两层的混合半透明

图 50-4. 混合半透明复制了全光线追踪最重要的视觉增强效果,同时继续支持光栅化元素。

N 层着色的半透明表面(或事件)。每个事件存储反射的辐照度以及到视点的距离。重要的是,它不合成任何透过表面的透射。透射由合成过程中的混合操作来应用。创建缓存是通过对处理光线追踪透明度的标准算法进行简单修改来实现的。每个像素从眼睛发射一条光线进入场景,其最大距离受限于已写入帧缓冲区的不透明几何体。对最近的命中点进行着色并写入缓存的第一层,然后光线向前步进并再次追踪以记录其他事件(如果需要)。清单 50-1 中的伪代码展示了光线生成着色器的基本算法。

一旦创建了着色缓存,就必须将光线追踪结果与光栅透明度合成到场景中。合成以标准光栅化顺序执行。半透明材质的着色器被增强,加入了检查着色缓存的代码。检查首先查看第0层,看是否有为该像素写入的光线追踪数据。如果有,它将到视点的距离与缓存中存储的距离进行比较。如果距离在阈值内匹配,则使用缓存中的着色数据。为了避免为每个半透明像素支付搜索的成本,不支持光线追踪的物体通过使用统一分支跳过搜索。清单 50-2 包含了应用缓存数据的代码。

重要的是,混合半透明的合成通道保留了本来会应用的着色功能。这允许无论存在多少层半透明,都能产生合理的结果

cpp 复制代码
//清单 50-1. 光线生成伪代码。

GBufferData OpaqueData = ReadGBufferForPixel();

FarPosition = ReconstructionPosition(OpaqueData);

RayDescription Ray;
Ray.Origin = ViewerPosition;
Ray.Direction = normalize(FarPosition - ViewerPosition);
Ray.MinT = 0.0;
Ray.MaxT = length(FarPosition - ViewerPosition) - Epsilon;

for(int Event = 0; Event < MaxEvents; Event++)
{
	Payload HitData = Trace(Ray);
	if(!HitData.IsHit)
	{
		Break;
	}
	else
	{
		Color = ShadeHit(HitData);
		Distance = HitData.Distance;
		RecordLayer(Event, Color, Distance);
	}
	
	// 为下一次搜索向前步进。
	Ray.MinT += HitData.Distance + Epsilon;
}
cpp 复制代码
//清单 50-2. 半透明缓存搜索伪代码。

Color = ComputeShadingForTranslucentPixel();

if (SupportRayTracing)
{
	// 检查是否有任何层被捕获。
	if (Layers[pixel][0].Distance > 0)
	{
		Distance = Length(WorldPosition - ViewPosition);
	
		for(Layer = 0 : NumLayers - 1)
		{
			LayerDist = Layers[Pixel][Layer].Distance;
			Delta = abs(Distance - LayerDistance);
			
			if (Delta/Distance < Threshold)
			{
			// 表面与缓存数据匹配。
			Color = Layers[pixel][Layer].Color;
			break; // 退出循环。
			}
		}
	}
 }

(a) 双层混合半透明 (b) 单层混合半透明

图 50-5. 混合半透明优雅地回退到光栅效果,而内容已经需要依赖光栅效果来实现大多数系统。

(图 50-5)。顶部的 N 层将获得光线追踪着色,而更深的层将简单地回退到光栅化时的效果。由于最顶层对图像的贡献最大,通常只对单层半透明进行光线追踪就足够了。

50.2.3 与顺序无关透明度的关系

本章描述的混合半透明方法明确避免了解决半透明表面顺序的问题,但它确实有一些相似之处。深度剥离 3 将半透明转换为层,以便按深度顺序合成,而 A-buffer 2 生成每个像素的已排序透明表面列表。这些概念与本混合半透明算法使用的有序样本缓存相关。与这些顺序无关透明度(OIT)算法相比,该结构仅用于确保捕获了最近的事件并优化缓存查找。重要的是,这种混合算法在合成过程中并不排除使用 OIT 方法。它依赖于用于合成标准光栅透明度的任何一种方法,关键要求是使用单一方法来对光栅和光线追踪组件进行排序。

50.2.4 性能

与所有高级视觉效果一样,管理和缩放性能对于混合半透明也很重要。如前所述,混合半透明可以通过减少考虑进行半透明光线追踪的对象以及限制捕获的层数来大幅削减着色量。

(a) 具有两次折射事件的光线追踪半透明:

16.2 毫秒

(b) 仅追踪顶层的半分辨率混合半透明:

4 毫秒 + 1.5 毫秒

图 50-6. 在此场景中,混合半透明以三分之一的成本产生了整体更好的图像质量。请注意,由于耗尽了折射事件计数,在纯光线追踪版本中,许多玻璃器皿并未完全可见。所有计时均在 RTX 3090 上以 1920 × 1080 分辨率测得。

在比较相等数量的事件着色时,混合半透明的追踪通道与标准光线追踪半透明的成本实际上相同。在一个复杂的测试场景中对两层折射光线进行着色显示,纯光线追踪的成本为 16.1 毫秒,而混合光线追踪的成本为 16.2 毫秒(图 50-6a)。混合方法还需要额外的 1.5 毫秒来光栅化半透明。(所有测试均在 RTX 3090 上以 1920 × 1080 分辨率执行。)然而,即使有两层事件,光线追踪场景中的半透明物体也会消失。而混合场景中没有物体消失,并且可以将成本降低到单层事件而几乎不影响视觉效果,将其成本降低到 7.9 毫秒。此外,混合半透明的着色缓存层可以以一半分辨率(使用棋盘格或交错样式)进行渲染,并在合成时进行上采样。正如预期的那样,将样本数量减半使光线追踪成本减半,在此测试用例中成本降低到 4 毫秒(图 50-6b)。

最后,所有光线追踪半透明都可以受益于使用光栅化来计算屏幕上潜在的半透明像素掩码。针对深度缓冲区快速光栅化少数参与光线追踪的半透明物体,可以标记出哪些像素可能产生半透明命中。这允许光线生成着色器在没有覆盖区域的像素上终止,而不必发射光线。对于大多数场景,这节省了数十万条光线的发射,而成本通常不到十分之一毫秒。然而,其收益取决于场景中半透明的数量,因此该技术的实用性会有所不同。

50.3 植被

植被是几乎所有游戏中户外环境不可或缺的一部分。游戏中的"植被"一词涵盖了从大树到草地的一切。在 UE4 中,与大多数游戏一样,大部分植被是通过某种专门的系统来处理的,以实现通常所需的高密度。该系统复制数十到数百个相同副本(通常称为实例),并对网格体进行不同的变换,以产生丰富的环境。除了各种静态变换之外,植被系统通常还利用某种形式的顶点着色器动画。尽管它可能只是简单的正弦波来使草来回摇摆,但这种环境运动为场景带来了生命力。

50.3.1 表示动态植被

在游戏的光线追踪背景下,数据管理是支持植被的关键问题。利用植被的实例化特性是管理成本的第一步。将植被作为实例放置到顶级加速结构(TLAS)中,并在着色器绑定表中共享条目,为管理与数千个物体相关的成本提供了解决方案。在 UE4 的一个普通森林场景中,如果独立设置光线追踪实例,CPU 设置时间超过 6 毫秒,而使用共享设置仅需 0.6 毫秒。重要的是,甚至可能值得放弃多个细节层次,因为管理多个细节层次相关的成本可能超过其收益。管理实例的一个方面是高效剔除,以确保只处理相关的实例。通常,光线追踪使剔除问题更加困难,因为反射光线更难处理。一个好的解决方案是通过将包围球投影到从视点出发的立体角上来进行剔除。1-2 度的剔除角度可确保物体影响的屏幕区域在所有情况下(除了最极端的情况)都得到尊重。高大的树木将准确投射长长的阴影并在反射中突出,而成千上万的小草丛的影响将最小化。

植被的环境运动极大地加剧了数据管理问题,同时也带来了自身的成本。底层加速结构(BLAS)必须为每种不同的形变唯一创建。这意味着用于为场景中所有植被添加环境运动的简单顶点着色器,从光线追踪的角度来看,正在产生数千个独特的网格体。天真的解决方案需要对每个实例运行计算着色器来更新顶点,然后每帧重新拟合或重建 BLAS。

在 UE4 的一个简单森林场景测试中,即使将每种类型的处理限制在 256 个实例,在 NVIDIA RTX 3090 上的 GPU 处理时间也超过了 50 毫秒。这种解决方案在实时应用中是不可行的。一个更实用的后备方案是直接跳过环境运动,让所有实例保持其静止姿势。仅将静态对象实例化放入 TLAS 中,可以为许多游戏场景提供一个非常合理的表示。它确保了植被在大致位置和尺寸上的准确表示。重要的是,光线追踪表示仅作为次级效果的一部分被观察到。反射将显示正确放置和照明的植被。如果不仔细观察,运动的缺失常常会被忽略,因为完美的大镜面反射并不常见。尽管像阴影和环境光遮蔽这样的遮挡效果(尤其是在投射到移动物体上时)通常可以容忍运动的缺失,但其可接受程度会因内容而异。静止的树叶阴影投射在静态物体上有时会显得明显且令人反感,尤其是当阴影贴图产生的阴影在移动时。重要的是,完全精确的运动(需要前面提到的 50 毫秒成本)通常不是必需的。只要阴影的运动与观察者看到的植被行为大体一致,就可以产生令人信服的效果。

跨多个实例重用动画可以使阴影具有与为植被指定的运动一致的行为,同时无需付出精确匹配动画的成本。在多个实例之间共享动画是对独立变形网格体所用模拟的简单扩展。唯一需要的额外工作是结果必须保持与原始网格体相同的中性坐标框架。实例的平移、旋转和缩放仍然适用,以在世界中生成令人信服的动画实例。最小化模拟实例的数量很重要,因为每个额外的模拟实例都会增加工作量并限制重用。通常,对于森林中的每个不同植被网格体,仅使用单个模拟实例就能获得令人信服的结果。同样,用户永远不会直接观察光线追踪的结果。

50.3.2 不精确遮挡

尽管纯静态植被或复用的动画在反射以及植被投射到其他物体上的阴影方面做得相当不错,但植被的自遮挡效果需要更加小心。因为顶点

(a) 使用精确阴影测试时光栅化和

光线追踪几何体不同步

(b) 使用不精确阴影测试时光栅化和

光线追踪几何体不同步

图 50-7. 精确阴影测试显示出明显的硬阴影伪影,因为用于投射阴影光线的几何体与用于测试阴影光线的几何体不匹配。仅对已知存在此问题的像素应用随机偏移,可以隐藏伪影,同时保留整体外观。

着色器动画无法与边界体积层次结构(BVH)中植被实例使用的动画完全匹配,因此很可能发生不正确的自遮挡。这在用 BVH 中的静态植被测试光栅场景中的动态植被时最容易观察到。结果是条纹状的阴影随着植被与静态表示相交和分离而切割穿过植被(图 50-7a)。

与植被相关的大多数其他挑战一样,一个好的解决方案包括利用已经存在的近似。植被渲染使用多个公告板和叶片卡片来表示典型植物上的叶子体积。由于被渲染的空间可以被视为一个体积,因此遮挡测试也可以如此。统计采样可以近似体积内的阴影结果(图 50-7b)。这种采样可以通过对阴影光线的最小命中距离(TMin)应用随机偏移来实现(图 50-8)。结果就像在光照方向上、植被上方评估了一组样本云一样。显然,随机化会导致噪点较多的阴影结果。然而,阴影已经依赖降噪和时域抗锯齿通道来产生柔和的抗锯齿结果。重要的是,将偏移放在 TMin 上,而不是放在阴影光线的原点上,会增加那些仍然返回阴影结果的光线的报告距离。

(a) 不匹配的几何体 (b) 不精确的阴影光线

图 50-8. 紫色和蓝色表面在逻辑上是相同的,但光线追踪(紫色)和光栅化(蓝色)表示不同。由于不匹配,蓝色表面处于从表面直接追踪光线的阴影中。对光线应用随机偏移允许一些样本避开自遮挡。

这有助于降噪过程,因为降噪的锐度与报告的距离有关。参见清单 50-3 了解此不精确阴影测试的设置。

cpp 复制代码
//清单 50-3. 不精确阴影光线设置。

RayDesc Ray = GenerateOcclusionRay(
LightParameters ,
WorldPosition , WorldNormal ,
RandSample);

// 应用标准偏移以避免深度冲突伪影。
ApplyCameraRelativeDepthBias(Ray, PixelCoord , DeviceZ , WorldNormal ,NormalBias);

// 如果使用不精确遮挡测试,则对 TMin 应用偏移。
if (NeedsInexactOcclusion())
{
	Ray.TMin += GetRandomOffset() * MaxBiasForInexactGeometry;
}

最后,不精确阴影测试仅适用于需要不精确测试的物体和材质。已经部署了两种不同的解决方案来解决这个问题。首先,由于植被是主要用例,来自 G 缓冲区(如着色模型)的属性可用于识别希望接收该效果的几何体。在 UE4 中,只需将其应用于 TWO_SIDED_FOLIAGE 着色模型,即可覆盖最常见的情况。缺点是像树枝这样的物体不会参与。一个更精确的解决方案是显式标记目标几何体。当有空间时,可以通过 G 缓冲区中的额外位来实现。对于更一般的情况,简单地

运行一个额外的仅模板(stencil-only)通道提供了一个很好的解决方案。由于几何体已经存在于深度缓冲区中,该通道可以跳过运行像素着色器来产生 Alpha 混合,并且可以依靠将深度函数设置为等于来处理由 Alpha 测试剔除的像素。

50.4 总结

本章描述的混合半透明和植被技术本身不足以处理在为光栅化创作的内容中添加光线追踪时遇到的所有挑战。然而,它们是完成该任务的方法工具箱的一部分,当与 UE4 等引擎中的其他工具结合使用时,可以实现令人印象深刻的效果。

参考文献

1 Amazon Lumberyard. Amazon Lumberyard Bistro. 开放研究内容档案(ORCA),http://developer.nvidia.com/orca/amazon-lumberyard-bistro,2017.

2 Carpenter, L. The A-buffer, an antialiased hidden surface method. ACM SIGGRAPH Computer Graphics, 18(3):103--108, 1984. DOI: 10.1145/800031.808585.

3 Everitt, C. Interactive order-independent transparency. http://developer.download.nvidia.com/assets/gamedev/docs/OrderIndependentTransparency.pdf,2001.

4 Nature Manufacture. Forest - environment set. Unreal Engine Marketplace,https://www.unrealengine.com/marketplace/en-US/product/forest-environment-set,2019.

总结:光线追踪中半透明与植被的实用解决方案

1. 混合半透明
  • 核心挑战:为光栅化创作的旧内容(如粒子系统、多层玻璃)若直接使用全光线追踪,会面临性能骤降(成本高达光栅化的10倍)、资产兼容性问题(旧粒子系统无光线追踪支持)以及视觉伪影(折射配置错误、层数限制导致物体消失)。

  • 解决方案:采用混合光栅化与光线追踪的方法。

    • 光线追踪缓存:独立计算半透明表面的着色(反射辐照度)并存入屏幕空间缓存,不进行合成。

    • 光栅化合层:仍使用标准光栅化顺序合成所有半透明层,但通过距离匹配查找缓存,用光线追踪结果替换光栅化着色值。

  • 关键优势:

    • 无需修改旧资产,折射/扭曲效果与光栅化一致,避免资产管线成本。

    • 性能可控:仅对最顶层(通常1-2层)进行光线追踪,结合半分辨率渲染和像素掩码优化,成本可从16ms降至4ms。

    • 视觉改善:显著提升玻璃等重要表面的着色质量,同时避免物体因层数限制而消失。

2. 动态植被
  • 核心挑战:植被实例多、顶点动画频繁,若每帧更新加速结构,GPU耗时超过50ms,无法实时;若完全静止,则阴影和反射缺乏动态感。

  • 解决方案:

    • 实例化管理:通过共享TLAS条目和剔除优化(基于立体角投影),将CPU设置时间从6ms降至0.6ms。

    • 运动近似:放弃精确顶点动画,采用静态BVH或复用少量模拟实例,牺牲细微运动以换取性能,因次级效果(反射/阴影)对运动不敏感。

    • 不精确遮挡:对植被阴影光线施加TMin随机偏移,将自阴影从"精确但错误条纹"变为"体积近似噪点",再利用降噪和时域抗锯齿平滑,避免自遮挡条纹伪影。

  • 关键优势:

    • 性能可行(静态或复用实例方案实时)。

    • 视觉可接受:反射和投射阴影位置准确,动态感通过近似动画维持,自遮挡问题通过统计采样解决。

    • 灵活标识:通过着色模型或模板通道标记需处理的植被,避免影响其他几何体。


总体结论:两项技术均遵循"为旧内容适配,而非重制"的原则,通过混合渲染、近似计算和利用已有光栅化流程,在极低的资产修改成本下,实现了光线追踪的性能可控与视觉提升,适合在已发布或开发中的游戏项目中推广。

植被的WPO(世界位置偏移,即顶点动画)在光线追踪中不是"不支持",而是"性能代价极高,因此实际项目中需要放弃或近似处理"。

实践中:采取"放弃精确WPO"策略

方案 说明
完全静态BVH 所有植被实例保持静止姿势放入TLAS,完全忽略WPO。反射和阴影位置准确,但运动缺失。
复用模拟实例 对每种植被类型只模拟1个实例的动画,其他实例共享这个动画结果。运动行为一致,但每个实例仍保持自身的位置/旋转/缩放,视觉上可接受。
不精确阴影偏移 在阴影光线的TMin上增加随机偏移,让自阴影从"精确但错位"变成"近似体积阴影",掩盖WPO与BVH不匹配导致的条纹伪影。
相关推荐
Duo1J11 小时前
【UE】Slate 编辑器工具开发01 - Slate语法 & 常用控件
ue5·编辑器·游戏引擎·ue4
DoomGT8 天前
UE5 - 制作游戏中切换窗口后游戏自动暂停功能
游戏·ue5·ue4·虚幻·虚幻引擎·unreal engine
Yuk丶1 个月前
厌倦了假AI对话?本地 LLM 语音对话 + 口型同步系统 2.0(已开源!)
c++·人工智能·语言模型·开源·ue4·语音识别·游戏开发
归真仙人1 个月前
【UE】LineTraceByProfile
ue5·游戏引擎·ue4·unreal engine
上山老人2 个月前
UE4布娃娃约束修改
ue4
Yuk丶2 个月前
厌倦了假AI对话?用本地大模型给UE注入真智能(已开源!)
c++·人工智能·开源·ue4·游戏程序·ue4客户端开发
emplace_back2 个月前
UE 使用UE4PrereqSetup_x64.exe一键安装依赖
ue4
Yuk丶2 个月前
LPM的AI 角色三大核心技术实现:长效记忆、人格锁定、低延迟口语化
人工智能·ai·ue4·虚幻·ue4客户端开发
归真仙人2 个月前
【UE】Lightmass可执行文件已经过时
ue5·游戏引擎·ue4·虚幻·unreal engine