58 lines
5.5 KiB
Markdown
58 lines
5.5 KiB
Markdown
|
---
|
|||
|
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);
|
|||
|
```
|