规格化的深度值和颜色值都在[0,1]区间内, 但是大多Z-BUUFER中的深度值都有24位的精度,而每个颜色分量都只有8位精度,所以需要将深度值分拆,分别放入多个颜色通道中。
可以简单将一个24位的深度值分别放入3个8位的通道中,即R,G,B
需取小数(二进制) 前8位放入R中,方法为:
color.r = floor( depth * 256 ) / 256 即将深度值左移8位取整,再右移8位规格化到[0,1]区间内。
接下来是将中间8位放入G中:
color.g = floor( (depth - color.r) * 256 * 256 ) / 256
最后将后8位放入B中:
color.b = floor( (depth - color.r - color.g / 256) * 256 * 256 * 256 ) / 256
使用时应该将深度值还原:
depth = color.r + color.g / 256 + color.b / ( 256 * 256 )
这个方法针对一些不支持浮点纹理的硬件,比如本人的硬件,对于现在大多数支持浮点纹理的硬件,则不必进行这样的转换。
这个方法的一个缺点是,任何对压缩进RGB通道中的深度分量进行插值的操作都会使最后的结果不正确,所以不要在VS中进行压缩操作。
第二个要注意的是,保存压缩后深度的RGB纹理不能进行过滤,否则结果也会不正确。