在HLSL中对浮点数和整数之间进行转换
以下是逐行注释和详细说明的Unity Shader代码分析:
1. 打包整数函数 PackInt float PackInt(uint i, uint numBits) // 打包整数 { uint maxInt = (1u << numBits) - 1u; // 计算最大整数值 return saturate(i * rcp(maxInt)); // 将整数归一化到[0, 1]范围 } 功能说明 该函数将一个无符号整数 i 打包为一个浮点数,范围在 [0, 1] 之间。 通过将整数 i 除以最大整数值 maxInt,将其归一化到 [0, 1] 范围。 参数说明 i:需要打包的无符号整数。 numBits:整数的位数,用于计算最大整数值。 关键点 1u << numBits:通过左移操作计算 2^numBits,即最大整数值加1。 maxInt = (1u << numBits) - 1u:计算最大整数值。例如,numBits = 8 时,maxInt = 255。 rcp(maxInt):计算 1.0 / maxInt,用于归一化。 saturate:将结果限制在 [0, 1] 范围内,防止溢出。 示例 输入:i = 128, numBits = 8 计算: maxInt = (1u << 8) - 1u = 255 rcp(maxInt) = 1.