(转)各种纹理贴图技术
凹凸貼圖(bump mapping)概念
無論是程序員還是美工人員,幾乎每個游戲開發者都知道一些3D圖形學的知識,因此每個人都或多或少了解 一點bump mapping。Bump mapping是在像素級別擾動物體表面法向量的一種光照技術,它一般采用紋理映射作為輸入表示擾動的大小。在光照 計算時考慮到擾動的法向量,不需要增加額外的幾何信息就可以增強被渲染物體的表面細節。
[原文鏈接]?
1. 浮雕貼圖(Emboss bump mapping)
這種處理方式不用 lighting models,而直接使用貼圖明暗度來產生凸凹效果.
玩過photoshop的都知道可以使用alpha通道對RGB圖像進 行混合,這種透明度直接
混合出來的明暗看起來象平的,為了使用圖像隨燈光看起來有立體感的明暗度,
一種簡單的辦法就是使用 Emboss bumpmapping.
實現如下:
就是將原alpha通道值一分為二,一個是原alpha通道的亮度減 半, 另一個是反轉alpha
通道并將uv偏移燈光一點點,最后將兩個alpha通道加起來再與原RGB圖像進行混合,
這樣看起來明 暗度偏離燈光使看起來立體感較強.
另外這樣的處理方式還可混合頂點色.
優缺點:
CPU使用較多,計算uv偏移 值,可以直接用固定管道實現. 完全用貼圖渲染,只實現了diffuse.
參考:
dx8 sdk中的emboss源碼
2. 環境凹凸貼圖(EMBM: Environment-mapped bump mapping)
這種貼圖保存了du和dv兩個偏差值,最常見的是用在水的反射渲染中對反射圖進行干撓.
使水面看起來產生漣漪的效果. 就是說dv和dv將會加到頂點對應反射圖的uv中. dx中可
以設置bump矩陣對它調整得以實時變化.
?優缺點:
CPU占用少,可以使用固定管道實現.效率問題主要是在反射圖(也就是Environment map)的
渲染占用上,當然也可以采用假的靜態反射圖.
參見:
dx8 sdk中的BumpWaves源碼
以及我的文章:
使用固定管道渲染反射和折射:
http://blog.csdn.net/flipcode/archive/2008/03/03/2143788.aspx??
? dx9反射圖計算參見:
http://flipcode.spaces.live.com/blog/cns%218E578E7901A88369%21363.entry
????
3. 法線圖(Normal mapping)
這種是比較流行的實時凹凸貼圖方法,原理很簡單,就是多邊形上每一象素點如果用不同的
法向量進行光照模型運算,那么就可得到不同的凹凸明暗度.
實現方法:
就是將多邊形的法線保存在高位圖的RGB中.然后程序讀取來在ps中取出RGB作為法線
進行光照模型的計算即可.
法線圖中的法線值一般是以貼圖空間(也就是切線空間,U為tangent向量,V為binormal向量, n為normal向量)
來存放的,所以燈光到頂點的向量要先轉到切線空間后再與法線進行光照運算即可.
優缺點:
CPU使用不多,用點光源效果較好, 需要硬件支持DotProduct, 光照實時變化.
參見:
dx8 sdk中的DotProduct3源碼,使用固定管道來實現:
// Store the light vector, so it can be referenced in D3DTA_TFACTOR
DWORD dwFactor = VectortoRGBA( &m_vLight, 0.0f );?
m_pd3dDevice->SetRenderState( D3DRS_TEXTUREFACTOR, dwFactor );
? // Modulate the texture (the normal map) with the light vector (stored
// above in the texture factor)
m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG1, D3DTA_TEXTURE );
m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLOROP,?? D3DTOP_DOTPRODUCT3 );
m_pd3dDevice->SetTextureStageState( 0, D3DTSS_COLORARG2, D3DTA_TFACTOR );
? 或者這里也有DotProduct3同上dx8的例子:
http://www.two-kings.de/tutorials/dxgraphics/dxgraphics16.html
切線空間的計算參見:
計算切線空間:
http://blog.csdn.net/flipcode/archive/2008/03/03/2143483.aspx?
? 提示, NormalMap制作:
法線圖制作的幾種方法:?
1. 直接使用高位圖(Height map), 再通過D3DXComputeNormalMap函數得到.
2. 使用PhotoShop加載高位圖,然后再用NV的photoshop插件進行生成Normal Map圖像, 詳細
作法可參 見<怎樣用PhotoShop創建Bump Map圖像>:
http://phoenixzz.blogbus.com/logs/1597471.html
3. 通過高模表面采樣得到(polybump),可以使用ATI的3DS Max插 件,參見:
<Normal Mapping Primer>by Gary Pate. http://www.ionization.net/tutsnorm2.htm
4. 置換貼圖(Displacement mapping)
這種需要硬件支持,在vs中真正改變幾何頂點的位置, 由此引起的幾何細分需要處
理大量的多邊形,一般不能實時應用到.
5. 自陰影(Self-shadowing bump maps)
法線圖可以實現陰影動態變化,但實現不了自陰影,也就是說如果有凸塊 遮擋了光線,它不能實現遮擋產生的陰影.
一種叫horizon map的技術可以實現自陰影.
這是一種從特定點向各方向記錄可見水平高度(the elevation of the visible horizon)的紋理。
光源如果低于這個水平高度,就不會照亮對應的特定點。這可在切線空間對光源向量執行這種可見性檢查,
就可以產生自陰影bump maps.
優缺點:
實現自陰影,占用過多紋理內存,計算量很大。
6. 視差映射(Parallax mapping)
Parallax mapping也被稱為"offset mapping"或"virtual displacement mapping"
這種處理是將紋理的坐標向眼睛方向偏移一定的距離來實現立體視角感.
從渲染點出發到眼睛的斜射線上找到表面垂直距離等于渲染點對應的Parallax mapping高度值時,
那么眼睛斜射線上到表面垂直相交的那點就是要偏移到的地方.(可參見前面所附鏈接中的圖示)
優缺點:?
視差映射跟EMBM一樣也是調整貼圖uv坐標的,不過它有兩個約束條件:一是對應視差映射中的高度值
二是到眼睛的射線. 從而隨視角變化而變化,效果效率都很好. 而EMBM一般用正/余弦波來改變du/dv
后再去影響貼圖坐標從而達到水的漣渏效果(這在前面有說)
7. Z-correct bump mapping
這種是在ps中根據視線方向偏移Z值,使物體相交處會隨著表面的凹凸情況發生變化而不僅僅表示為一條直線。
優缺點:
物體相交處通過z偏移表現凹凸變化,在pixel shader中修改Z值會禁止圖形硬件的早期深度測試優化.
注意:?
本文參考了以下文章:
An Overview Of Bump Mapping Techniques
英文版:
http://www.delphi3d.net/articles/viewarticle.php?article=bumpmapping.htm
翻譯版:
http://phoenixzz.blogbus.com/logs/1332892.html
如 果看不懂就看原文吧?
另外還可參考:
http://snowwin.bokee.com/4148760.html
總結
以上是生活随笔為你收集整理的(转)各种纹理贴图技术的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C# HttpRequest基础连接已经
- 下一篇: 【老孙随笔】项目经理要如何看待技术?