Normal Map Compress with DXT5
作者:clayman
仅供个人学习使用,请勿转载,勿用于任何商业用途。
这应该是常识性的知识,不过大部分介绍normal map技术的文章似乎都忽略了这一点。众所周知,DirectX 9下,直接用DXT 5保存normal map,精度损失是很大的,效果也不好。ATI最早推出了3DC格式来解决这个问题(DirectX 10下有BC5),虽然目前所有a卡和n卡都支持3DC,但有些早期的n卡并不支持3DC,此外,对于xna程序来说,无法使用3DC格式,如何用DXT5保存normal map,并减少精度损失呢? 首先,noraml都为单位矢量,各分量平方和为1,因此,通过2个分量就能计算出第三个分量的值,这样,在保存normal map时只需保存两个通道。对于tangent space normal map来说,可以选择在shader中重建z值:z = sqrt(1 - (x*x + y*y))。对DXT5来说alpha通道精度最高(16bit),其编码方式其实和3DC/BC5中的通道是一样的,所以,可以把normal的x或者y值储存到alpha通道中。最后,DXT5以5.6.5的格式保存普通颜色通道,绿色通道精度稍高于其他两个,剩下的一个法线分量应该放到G通道中。
下面是我从Nvdia的paper中偷来的图,可以看到虽然同为有损压缩,但apha+green通道的DXT压缩效果要比普通直接DXT压缩效果好一些。
下面是神界2中的用此技术压缩的normal map,由于blue通道值都为1而不是0,所以图片看起来是蓝色,而不是绿色: