2007-04-21

Normal map[壓縮]

現在的3D遊戲幾乎都使用DDS的壓縮材質,主要原因是壓縮效率品質都不錯。可是normal map直接壓縮為DXT1~5這些格式, 效果都很不好。於是研究了一下目前一般常用的技術。


大致上目前使用的技術都是只儲存X/Y值,而Z值都在pixel shader裡面計算..

Z = sqrt( 1 – x*x – y*y)

這樣的方式有些限制:

  • 必須是tangent space normal map。因為在world/object space下,Z有可能是正值或是負值,這個做法只能取正值(或是只取負值)
  • normal必須是normalize 的。一般我們會希望normal 都是normalize,所以不算很大的限制。
  • pixel shader版本必須是1.4以上。

這個方式下有幾個常用的normal map格式:

  • 使用V8U8/CxV8U8格式:效果和R8G8B8normal map一樣好。但壓縮率還不夠好,只能壓縮到2/3
  • 使用Swizzled DXT5格式:基本上還是DXT5格式,但是把X值放到A,把Y值放到GR/B channel可忽略,理由是DXT5壓縮特性使得A/G channel壓縮品質比較高。品質會比直接把DXT5XYZ的方式好很多。
  • 使用3Dc:這目前只有AMD(ATI)GPU支援。效果應該比Swizzled DXT5好。(由於手邊沒有ATI的卡,所以無從比較)

下圖是測試比較圖,可以看出Swizzled DXT5效果還不錯說

簡單說明一下如何使用NVIDIA Photoshop plugin製作這些壓縮格式的方式:

  • V8U8/CxV8U8格式:選擇V8U8/CxV8U8格式輸出。
  • Swizzled DXT5:選擇DXT5_NM格式輸出。
  • 3Dc:無法輸出。目前只有ATI支援,所以只能透過AMD(ATI)的工具The Compressornator輸出。