着色器Encoding floats to RGBA

前言

先简单记录一下,在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) );
}

着色器Encoding floats to RGBA_第1张图片
参考文章

2. 为什么要编码到RGBA中

单通道的float为32-bit,
不总是支持浮点纹理格式,要在这些系统上存储深度,必须将它们转换为定点并打包到传统无符号归一化 (UNORM) 纹理的 4 个通道中。
Why encode floats in RGBA?
把float编码到RGBA8

你可能感兴趣的:(计算机图形学,shader,cesium)