關於 normal map
normal map是目前3D繪圖最常使用的技術之一。
( normal map )
以下分成幾部分做個歸納整理:
Normal map[規格制定]
normal map是使用RGB來儲存normal 的XYZ向量值,所以必須定義normal儲存的座標系。
座標系就包括了world/object/tangent space,其中還分成左/右手系統。
不同的座標系統在處理lighting計算時候會需要不同的處理方式, 因此程式人員需要制定normal map所在的座標系,才能夠正確的處理normal map效果。
目前最常使用到是tangent space的normal map.它的優缺點如下:
優處:
normal map是使用RGB來儲存normal 的XYZ向量值,所以必須定義normal儲存的座標系。
座標系就包括了world/object/tangent space,其中還分成左/右手系統。
不同的座標系統在處理lighting計算時候會需要不同的處理方式, 因此程式人員需要制定normal map所在的座標系,才能夠正確的處理normal map效果。
目前最常使用到是tangent space的normal map.它的優缺點如下:
優處:
- 可以共用normal map貼圖(不同物件間的共用或是mirror物件共用)。
- 目前一些normal map壓縮技術也只能使用tangent space的normal map (這部分在normal map壓縮會詳細說明) 。
缺點:
- 需要 vertex normal/tangent的資料, 在計算lighting時候, 需要多處理一些座標轉換.處理。
World space/object space的優缺點和tangent space正好相反,所以某些狀況下或許使用world/object space的normal map 會比較好。
對object space下的normal map有興趣的可看http://www.3dkingdoms.com/tutorial.htm
選定了tangent space, 接下來是要使用左手還是右手系統呢?
下圖是目前常見的兩種 tangent space 座標系統的圖示, X軸都面向右邊, Z軸都往螢幕外方向, 而Y軸向上或是向下.
下圖是兩個系統下normal map的比較.
可以發現左手系統XYZ(0, 1, 0) 或是#80ff80是指向下方,右手系統是指向上方。
這只是一個規格制定時的選擇,重點還是在於產生normal map工具的設定是否可以輸出符合規格的normal map。
Normal map[製作]
對object space下的normal map有興趣的可看http://www.3dkingdoms.com/tutorial.htm
選定了tangent space, 接下來是要使用左手還是右手系統呢?
下圖是目前常見的兩種 tangent space 座標系統的圖示, X軸都面向右邊, Z軸都往螢幕外方向, 而Y軸向上或是向下.
下圖是兩個系統下normal map的比較.
可以發現左手系統XYZ(0, 1, 0) 或是#80ff80是指向下方,右手系統是指向上方。
這只是一個規格制定時的選擇,重點還是在於產生normal map工具的設定是否可以輸出符合規格的normal map。
Normal map[製作]
normal map的座標系確定後,接下來整理一下normal map的製作方式。 一般製作normal map的方式大概有以下幾種:
製作bump map轉normal map 製作bump灰階高低圖透過轉換工具產生normal map。這個方法只適合產生tangent space的normal map。製作的流程如下:
|
紅色框的Invert-Y一要勾選, Wrap建議勾選
Scale看情況調整
以下是試做bump map轉normal map的試做結果
製作高面數物件以及低面數物件來產生 normal map:
這個做法就是製作高面數的物件, 把高面數的normal 儲存成normal map。
目前美術人員常使用的 3ds max, Maya, XSI等軟體都有內建高面轉低面數的工具,所以都可以使用這些工具製作高面數模型來轉換輸出。
不過現在 Zbrush/Mudbox 這類 3D建模軟體的出現,使得 normal map 的製作更有效率。以下說明的是使用Zbrush/Mudbox軟體轉normal map的製作方式.。
使用ZBrush
製作的流程如下:
先用3DS max、Maya、XSI等等製作遊戲使用的低面模型,並把UV拆好。ZBrush會使用同樣的UV資料來產生normal map。
輸出OBJ格式。
在ZBrush 使用Tool->import 載入OBJ檔案。
使用ZBrush 製作物件細節。
使用ZMapper工具產生normal map:
產生Y-up的normal map設定方式如下圖所示:
注意圖中紅色框框:
Tangent space N.Map 必須勾選,才能產生tangent space的normal map。
Flip Image Vertically 必須勾選。
Interpolate/RayTrace : 計算normal map的方式, Interpolate 比較快,Ray Trace會比較慢。理論上ray trace品質應該會比較好才是。
其他參數使用預設值。
直接開啟ATI/Maya/NVIDIA tangent space設定檔也可以產生Y-up的normal map。
在Texture介面export normal map輸出檔案。
以下是使用ZBrush製作normal map試做的結果:
使用Mudbox
製作方式與Zbrush差不多,也是製作低面模型輸出OBJ檔案到mudbox製作細節。
不過目前測試的結果發現mudbox產生normal map的 Texture Baking工具 效果不是很理想,所以看到網路上一些美術好手的做法是將高面數的物件匯出OBJ檔案,
再使用3DS MAX/Maya/XSI透過高低面產生normal map的工具來產生normal map。
3DS MAX/Maya/XSI 產生Y-up 的normal map設定可參考http://sd-art.wikispaces.com/normalMapping
Normal map[壓縮]
現在的3D遊戲幾乎都使用DDS的壓縮材質,主要原因是壓縮效率品質都不錯。
可是normal map直接壓縮為DXT1~5這些格式, 效果都很不好。於是研究了一下目前一般常用的技術。
大致上目前使用的技術都是只儲存X/Y值,而Z值都在pixel shader裡面計算..
Z = sqrt( 1 – x*x – y*y)
這樣的方式有些限制:
使用Mudbox
製作方式與Zbrush差不多,也是製作低面模型輸出OBJ檔案到mudbox製作細節。
不過目前測試的結果發現mudbox產生normal map的 Texture Baking工具 效果不是很理想,所以看到網路上一些美術好手的做法是將高面數的物件匯出OBJ檔案,
再使用3DS MAX/Maya/XSI透過高低面產生normal map的工具來產生normal map。
3DS MAX/Maya/XSI 產生Y-up 的normal map設定可參考http://sd-art.wikispaces.com/normalMapping
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格式:效果和R8G8B8的normal map一樣好。但壓縮率還不夠好,只能壓縮到2/3。
使用Swizzled DXT5格式:基本上還是DXT5格式,但是把X值放到A,把Y值放到G,R/B channel可忽略,理由是DXT5壓縮特性使得A/G channel壓縮品質比較高。
品質會比直接把DXT5存XYZ的方式好很多。
品質會比直接把DXT5存XYZ的方式好很多。
使用3Dc:這目前只有AMD(ATI)的GPU支援。效果應該比Swizzled DXT5好。
(由於手邊沒有ATI的卡,所以無從比較)
(由於手邊沒有ATI的卡,所以無從比較)
V8U8/CxV8U8格式:選擇V8U8/CxV8U8格式輸出。
Swizzled DXT5:選擇DXT5_NM格式輸出。
技術文件
相關工具
Mudbox
有完整功能15天試用版本供下載。
有完整功能15天試用版本供下載。
ATI the Compressornator (DDS& 3Dc generator)
normal map製作