From 80a2d7366a346b4c94fc2bacf52b2db984681d3e Mon Sep 17 00:00:00 2001 From: BlueRose <378100977@qq.com> Date: Sun, 11 Aug 2024 15:31:28 +0800 Subject: [PATCH] vault backup: 2024-08-11 15:31:28 --- .../RenderingPipeline/UE5大世界坐标转换.md | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 03-UnrealEngine/Rendering/RenderingPipeline/UE5大世界坐标转换.md diff --git a/03-UnrealEngine/Rendering/RenderingPipeline/UE5大世界坐标转换.md b/03-UnrealEngine/Rendering/RenderingPipeline/UE5大世界坐标转换.md new file mode 100644 index 0000000..f0a7556 --- /dev/null +++ b/03-UnrealEngine/Rendering/RenderingPipeline/UE5大世界坐标转换.md @@ -0,0 +1,58 @@ +--- +title: Untitled +date: 2024-08-11 14:30:00 +excerpt: +tags: +rating: ⭐ +--- +# 前言 +- 官方文档:https://dev.epicgames.com/documentation/zh-cn/unreal-engine/large-world-coordinates-rendering-in-unreal-engine-5 +- 相关代码文件: + - LargeWorldCoordinates.ush + - Math/DoubleFloat.ush(UE5.3不存在) + - DoubleFloat.h(UE5.3不存在) + +## 相关HLSL类型 + +| HLSL类型 | 说明 | +| ---------------------------- | ---------------------------------------------------------------------------------------------------------------------------- | +| `FDFScalar` `FDFVector2/3/4` | 这些类型是float1/2/3/4的更高精度对应项。在内部由两个floatN矢量构成:High和Low。 | +| `FDFMatrix` | 类似于float4x4,但包含一个额外的float3 PreTranslation坐标。将矢量乘以此类型时,该矢量会首先使用PreTranslation进行转译,然后再应用float4x4矩阵。此类型适合变换为世界空间(LocalToWorld)。 | +| `FDFInverseMatrix` | 类似于float4x4,但包含一个额外的float3 PostTranslation坐标。将矢量乘以此类型时,该矢量会在应用float4x4矩阵之后使用PostTranslation进行转译。此类型适合变换为世界空间(LocalToWorld)。 | + +运算符带有前缀"DF",并有多种变体,可平衡精度和性能。变体在函数名称中用前缀或后缀来标记。例如: +- `DFFast*` 是一个后缀。例如, `DFFastAdd` 是一个后缀变体。此函数更快,但精度更低。使用此变体可获得最高速度,但会牺牲精度。对于基础运算符,每个函数的文档中都提供了论文参考资料,给出了关于其精度极限的详细说明。 +- `DF*Demote` 是一个前缀。例如,DFFastAddDemote是一个前缀变体。此变体会返回32位结果,而不是双精度值。`DF*Demote` 的函数可用,且类似于 `LWCToFloat` 函数。使用 `DF*Demote` 函数可免除不必要的计算,效率更高。这是首选的截断方法。 + +# FLWCVector及相关类型 +在虚幻引擎中,有多个复合类型使用专用于大型世界坐标的不同底层数学类型结构。 这些类型带有"FLWC"前缀,可在 `LargeWorldCoordinates.ush` 源文件中找到。大部分着色器现在使用DoubleFloat类型。但是,一些系统仍使用FLWC类型。 +可用的HLSL类型有: + +|HLSL类型|说明| +|---|---| +|`FLWCScalar` `FLWCVector2/3/4`|这些类型类似于float1/2/3/4,但是,它们包含额外的图块坐标。因此,FLWCVector2由float2图块和float2偏移组成。表示的值由以下公式计算:图块 * TileSize + 偏移,其中TileSize表示一个被定义为256k的常量值。| +|`FLWCMatrix` `FLWCInverseMatrix`|这些类型类似于float4x4,但是,它们都包含额外的float3图块坐标。| +|`FLWCMatrix`|乘以矩阵后将图块坐标添加到结果。| +|`FLWCInverseMatrix`|在乘以矩阵之前添加图块坐标。| +|`FLWCMatrix`|此类型适合变换为世界空间(LocalToWorld)。| +|`FLWCInverseMatrix`|此类型适合从世界空间进行变换(WorldToLocal)。| +`LWCAdd` 或 `LWCRsqrt` 等运算可以在这些类型上执行。接受LWC输入值的运算将返回LWC输出( `LWCAdd` ),而其他运算会返回常规浮点输出( `LWCRsqrt` )。将坐标变小的运算提供了返回常规浮点的途径。 + +>FLWC类型提供的精度相较于DoubleFloat库更低。对于靠近图块边缘的矢量,固定图块大小意味着 **图块(Tile)** 组件中的位不被使用,而 **偏移(Offset)** 只能存储截断的坐标。在虚幻引擎5.4之前,这会导致物体在世界中移动时精度时高时低,主要表现为物体抖动和振动。DoubleFloat数学类型通过删除固定大小解决了该问题,因为无论值的量级如何,这两个组件始终会存储尽可能高的精度。这在概念上类似于定点与浮点算术之间的差异。 + +# 材质 +**基于坐标的世界空间位置**节点(例如WorldPosition、Object、Camera、Actor和Particle)以及TransformPosition节点会使用LWC类型的输出,因此这些Input节点输出类型改变后续计算节点类型。 +可以考虑将这些节点的 **世界位置原点类型(World Position Origin Type)** 属性设置为使用 **摄像机相对世界位置(Camera Relative World Position)** 实现最优精度和性能。(LWC => float) + +# 从UE4到UE5的转换指南 +View & ResolvedView =>`PrimaryView` + +着色器代码中的许多变量已被切换为LWC变体。以下似乎一些重要的示例: +- `SceneData.ush` 、 `FPrimitiveSceneData` 和 `FInstanceSceneData` 有各种更新的矩阵和位置矢量。 +- 光源位置和反射捕获位置。 +- 全局摄像机统一数据更改了各种矩阵和偏移(例如PreViewTranslation)。例如,在SceneView和FNaniteView中。 + +TranslatedWorldSpace是虚幻引擎着色器中使用的现有引擎概念。它在之前旨在通过相对于摄像机原点工作来提高精度。但是,此行为对LWC很有用,因为在TranslatedWorldSpace中运行时,可以使用浮点数。我们建议不要将WorldPosition转换为双精度值,而是重构函数以改用转译的世界空间,这会带来出色的性能,同时保留高精度。例如: +```cpp + float3 TranslatedWorldPosition = mul(Input.LocalPosition, PrimaryView.LocalToTranslatedWorld); +``` \ No newline at end of file