unpackUnorm2x16
将一个 32 位无符号整数视为由两个 16 位无符号定点数(UNORM16)拼接而成,并将其解包为一个 vec2,返回两个落在 [0,1] 区间的浮点值。
Core Advantages
与 packUnorm2x16 成对使用,可以在缓冲区或纹理中用一个 uint 紧凑存储两路 [0,1] 归一化数据,在需要使用时再一次性解包为 vec2 浮点。底层解码细节由 builder.getFloatUnpackingMethod('unorm') 统一处理,无需手写除以 65535 或复杂 bit 操作,从而保持跨后端的一致性。
Common Uses
在前序 pass 中使用 packUnorm2x16 将 roughness + metallic 等 [0,1] 参数压缩为一个 uint,在后续光照或后处理 pass 中用 unpackUnorm2x16 解包还原为 vec2 继续使用。
从存储缓冲(SSBO)中读取以 UNORM2x16 格式压缩的两路权重、遮罩或强度数据,在 compute shader 中经解包后参与计算。
从自定义贴图或查找表中读取用 UNORM2x16 编码的两个标量通道(例如双通道 mask、双权重混合因子),在采样后直接解包为 [0,1] 浮点值。
与其他 pack/unpack 节点一起构建“压缩 G-Buffer”或参数缓冲,其中部分通道用 half float,部分通道用 UNORM 编码以节省带宽。
How to adjust
unpackUnorm2x16 本身没有可调参数,核心在于“确保输入 uint 的编码方式正确”:1)通常应与 packUnorm2x16 搭配使用,保证打包与解包都遵循 UNORM16 约定(0..65535 对应 0..1);2)如果传入的 uint 实际使用的是其他编码(如 float16 或 SNORM),解包结果会完全错乱;3)UNORM16 是线性定点量化,解包后会带有量化误差,适合用于对细微精度不敏感的 0–1 参数(粗糙度、权重、mask 等);4)在设计管线时建议明确标注哪些 uint 通道使用“UNORM2x16”语义,以免与 half2 或其他 bit 打包格式混用,增加调试难度。
Code Examples
1// 前序 pass:将两个 [0,1] 参数打包为一个 uint(示意)
2const rm = vec2( roughnessNode, metalnessNode );
3const packedRM = packUnorm2x16( rm );
4
5// 当前 pass:从某个 uint 源(缓冲或纹理)中读取
6const loadedPackedRM = packedRM; // 示例中直接复用,同一帧中你可以来自 texture/buffer
7
8// 解包为 vec2,得到两个 [0,1] 浮点值
9const decodedRM = unpackUnorm2x16( loadedPackedRM );
10
11const decodedRoughness = decodedRM.x;
12const decodedMetalness = decodedRM.y;
13
14material.roughnessNode = decodedRoughness;
15material.metalnessNode = decodedMetalness;