zoukankan      html  css  js  c++  java
  • Normal Map Compress with DXT5

    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,所以图片看起来是蓝色,而不是绿色:

     
     

  • 相关阅读:
    读取Java文件到byte数组的三种方式
    https://blog.csdn.net/eguid_1/article/category/6270094
    JavaCV 学习(一):JavaCV 初体验
    WebService服务发布与使用(JDK自带WebService)
    SourceTree 免登录跳过初始设置
    Owin password
    IIS并发
    压力测试
    nginx
    消息队列MSMQ
  • 原文地址:https://www.cnblogs.com/clayman/p/1864533.html
Copyright © 2011-2022 走看看