58 lines
5.5 KiB
Markdown
Raw Permalink Normal View History

2024-08-11 15:31:28 +08:00
---
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.ushUE5.3不存在)
- DoubleFloat.hUE5.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);
```