前言
先简单记录一下,在cesium中看见一个函数czm_unpackDepth,原码中对于其解释是 ,czm_unpackDepth:将 vec4 深度值解包为 [0, 1) 范围内的浮点数。并给出了一篇博客地址Encoding floats to RGBA - the final?
正文
1. 如何实现编码到RGBA中
inline float4 EncodeFloatRGBA( float v ) {
float4 enc = float4(1.0, 255.0, 65025.0, 16581375.0) * v;
enc = frac(enc);
enc -= enc.yzww * float4(1.0/255.0,1.0/255.0,1.0/255.0,0.0);
return enc;
}
inline float DecodeFloatRGBA( float4 rgba ) {
return dot( rgba, float4(1.0, 1/255.0, 1/65025.0, 1/16581375.0) );
}
2. 为什么要编码到RGBA中
单通道的float为32-bit,
不总是支持浮点纹理格式,要在这些系统上存储深度,必须将它们转换为定点并打包到传统无符号归一化 (UNORM) 纹理的 4 个通道中。
Why encode floats in RGBA?
把float编码到RGBA8