(转)各种纹理贴图技术
凹凸貼圖(bump mapping)概念
無論是程序員還是美工人員,幾乎每個游戲開發(fā)者都知道一些3D圖形學(xué)的知識,因此每個人都或多或少了解 一點bump mapping。Bump mapping是在像素級別擾動物體表面法向量的一種光照技術(shù),它一般采用紋理映射作為輸入表示擾動的大小。在光照 計算時考慮到擾動的法向量,不需要增加額外的幾何信息就可以增強被渲染物體的表面細(xì)節(jié)。
[原文鏈接]?
1. 浮雕貼圖(Emboss bump mapping)
這種處理方式不用 lighting models,而直接使用貼圖明暗度來產(chǎn)生凸凹效果.
玩過photoshop的都知道可以使用alpha通道對RGB圖像進(jìn) 行混合,這種透明度直接
混合出來的明暗看起來象平的,為了使用圖像隨燈光看起來有立體感的明暗度,
一種簡單的辦法就是使用 Emboss bumpmapping.
實現(xiàn)如下:
就是將原alpha通道值一分為二,一個是原alpha通道的亮度減 半, 另一個是反轉(zhuǎn)alpha
通道并將uv偏移燈光一點點,最后將兩個alpha通道加起來再與原RGB圖像進(jìn)行混合,
這樣看起來明 暗度偏離燈光使看起來立體感較強.
另外這樣的處理方式還可混合頂點色.
優(yōu)缺點:
CPU使用較多,計算uv偏移 值,可以直接用固定管道實現(xiàn). 完全用貼圖渲染,只實現(xiàn)了diffuse.
參考:
dx8 sdk中的emboss源碼
2. 環(huán)境凹凸貼圖(EMBM: Environment-mapped bump mapping)
這種貼圖保存了du和dv兩個偏差值,最常見的是用在水的反射渲染中對反射圖進(jìn)行干撓.
使水面看起來產(chǎn)生漣漪的效果. 就是說dv和dv將會加到頂點對應(yīng)反射圖的uv中. dx中可
以設(shè)置bump矩陣對它調(diào)整得以實時變化.
?優(yōu)缺點:
CPU占用少,可以使用固定管道實現(xiàn).效率問題主要是在反射圖(也就是Environment map)的
渲染占用上,當(dāng)然也可以采用假的靜態(tài)反射圖.
參見:
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)
這種是比較流行的實時凹凸貼圖方法,原理很簡單,就是多邊形上每一象素點如果用不同的
法向量進(jìn)行光照模型運算,那么就可得到不同的凹凸明暗度.
實現(xiàn)方法:
就是將多邊形的法線保存在高位圖的RGB中.然后程序讀取來在ps中取出RGB作為法線
進(jìn)行光照模型的計算即可.
法線圖中的法線值一般是以貼圖空間(也就是切線空間,U為tangent向量,V為binormal向量, n為normal向量)
來存放的,所以燈光到頂點的向量要先轉(zhuǎn)到切線空間后再與法線進(jìn)行光照運算即可.
優(yōu)缺點:
CPU使用不多,用點光源效果較好, 需要硬件支持DotProduct, 光照實時變化.
參見:
dx8 sdk中的DotProduct3源碼,使用固定管道來實現(xiàn):
// 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函數(shù)得到.
2. 使用PhotoShop加載高位圖,然后再用NV的photoshop插件進(jìn)行生成Normal Map圖像, 詳細(xì)
作法可參 見<怎樣用PhotoShop創(chuàng)建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中真正改變幾何頂點的位置, 由此引起的幾何細(xì)分需要處
理大量的多邊形,一般不能實時應(yīng)用到.
5. 自陰影(Self-shadowing bump maps)
法線圖可以實現(xiàn)陰影動態(tài)變化,但實現(xiàn)不了自陰影,也就是說如果有凸塊 遮擋了光線,它不能實現(xiàn)遮擋產(chǎn)生的陰影.
一種叫horizon map的技術(shù)可以實現(xiàn)自陰影.
這是一種從特定點向各方向記錄可見水平高度(the elevation of the visible horizon)的紋理。
光源如果低于這個水平高度,就不會照亮對應(yīng)的特定點。這可在切線空間對光源向量執(zhí)行這種可見性檢查,
就可以產(chǎn)生自陰影bump maps.
優(yōu)缺點:
實現(xiàn)自陰影,占用過多紋理內(nèi)存,計算量很大。
6. 視差映射(Parallax mapping)
Parallax mapping也被稱為"offset mapping"或"virtual displacement mapping"
這種處理是將紋理的坐標(biāo)向眼睛方向偏移一定的距離來實現(xiàn)立體視角感.
從渲染點出發(fā)到眼睛的斜射線上找到表面垂直距離等于渲染點對應(yīng)的Parallax mapping高度值時,
那么眼睛斜射線上到表面垂直相交的那點就是要偏移到的地方.(可參見前面所附鏈接中的圖示)
優(yōu)缺點:?
視差映射跟EMBM一樣也是調(diào)整貼圖uv坐標(biāo)的,不過它有兩個約束條件:一是對應(yīng)視差映射中的高度值
二是到眼睛的射線. 從而隨視角變化而變化,效果效率都很好. 而EMBM一般用正/余弦波來改變du/dv
后再去影響貼圖坐標(biāo)從而達(dá)到水的漣渏效果(這在前面有說)
7. Z-correct bump mapping
這種是在ps中根據(jù)視線方向偏移Z值,使物體相交處會隨著表面的凹凸情況發(fā)生變化而不僅僅表示為一條直線。
優(yōu)缺點:
物體相交處通過z偏移表現(xiàn)凹凸變化,在pixel shader中修改Z值會禁止圖形硬件的早期深度測試優(yōu)化.
注意:?
本文參考了以下文章:
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
總結(jié)
以上是生活随笔為你收集整理的(转)各种纹理贴图技术的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C# HttpRequest基础连接已经
- 下一篇: 【老孙随笔】项目经理要如何看待技术?