单通道的float是32-bit,RGBA8也是,因此按说把float编码到RGBA8的纹理中应该没啥问题。很惋惜的是,不支持浮点纹理的硬件每每也不支持整数指令和位运算操做。因此在这里须要有些限制。在网上搜了一下,最靠谱的应该是大牛Aras Pranckevičius(aras-p)多年前的帖子。他的作法能够把[0, 1)范围内的浮点数,仅仅用shader model 2的指令,就编码到RGBA8。其实[0, 1)基本就够用了,其余的只要除个常数,读取后乘回去就能够了。编码和解码的函数很简单:函数
float4 EncodeFloatRGBA(float v)这里的65025和16581375其实就是255的平方和立方。(aras-p的原文有一处笔误,把16581375写成了160581375。)post
长啥样编码
用途spa
这个东西能用在什么地方呢?流水线中目前有三处可能能够用到的:3d
在HDR post process里面,经过统计图像来产生自适应亮度调整的时候,只用到了单通道的float16和float32纹理,因此这里能够用这个方法进行编码。code
在Pre-depth的时候,也能够把32-bit的depth编码后存到RGBA8。blog
Exponential shadow map只须要用到一个通道,也能顺利使用这个技巧。get
这些应用我之后都会有专门的帖子展开讨论。it