DXT5 的法線壓縮方法

2021-07-05 16:00:39 字數 800 閱讀 4538

這應該是常識性的知識,不過大部分介紹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的*****中偷來的圖,可以看到雖然同為有失真壓縮,但apha+green通道的dxt壓縮效果要比普通直接dxt壓縮效果好一些。

下面是神界2中的用此技術壓縮的normal map,由於blue通道值都為1而不是0,所以看起來是藍色,而不是綠色:

pcl中法線不能顯示問題的解決方法

針對法線顯示的問題 一開始報如下錯誤 在cpp檔案中加入下面四句話 include vtkautoinit.h vtk module init vtkrenderingopengl vtk module init vtkinteractionstyle vtk module init vtkrend...

法線對映基本原理和相關的頂點資料壓縮

法線對映我也是剛學會的,呵呵 輸入到固定渲染管線的頂點結構雖然可以定製,但也不是完全自由的,比如頂點位置必須是float3,紋理座標float2,法線float3等等。如果使用可程式設計管線,由於vs的輸入可以自由解析,所以相對來說就增加了很多靈活性。在使用切線空間的法線對映 normalmap 時...

Unix下常用壓縮格式的壓縮與解壓縮方法(轉

解包 tar xvf filename.tar 打包 tar cvf filename.tar dirname 解壓1 gunzip filename.gz 解壓2 gzip d filename.gz 壓縮 gzip filename 解壓 tar zxvf filename.tar.gz 壓縮 ...