凹凸貼圖
凹凸貼圖(bump mapping),又稱為凸凹紋理映射、皺面貼圖,是一項計算機圖形學技術,在這項技術中每個待渲染的像素在計算照明之前都要加上一個從高度圖中找到的擾動。這樣得到的結果表面表現更加豐富、細緻,更加接近物體在自然界本身的模樣。法線貼圖是一項常用的凹凸貼圖技術,另外還有許多其它的實現技術,如視差映射等等。
具體實現
[編輯]BMEM技術
[編輯]BMEM技術通過一張叫做高度圖(Height map)的灰度圖來儲存每一點的高度信息然後直接由API處理。[1]
法線貼圖法
[編輯]但事實上遊戲編程員卻通常並不喜歡使用BMEM技術,因為他執行速度慢,因此他們通常使用DP3技術:直接把高度圖(Height map)轉換成一張法線圖(Normal Map),其圖的RGB分別是原高度圖該點的法線指向:Nx、Ny、Nz,這張圖可由Direct3D的專門函數幫助我們計算。最後在渲染的時候直接將該高度圖的每個像素與光源的向量點乘,即可得到表示每一點的明暗係數的圖:根據高度圖,越突出的地方,法線與光源夾角越小,該點的數值越大。接着將這張圖乘到渲染線中即可,這樣就使模型在背光的凹處有陰影而在面向光源處更亮的效果,這樣的3D模型看起來就像真的凹凸不平一樣。這些都可以直接在渲染流水線中由機器完成。
具體可以使用以下簡單的語句來實現:
//将光源位置转换成ARGB
DWORD Vector2ARGB(D3DXVECTOR3 *v,float height)
{
DWORD r=(DWORD)(127.0f*v->x+128.0f);
DWORD g=(DWORD)(127.0f*v->y+128.0f);
DWORD b=(DWORD)(127.0f*v->z+128.0f);
DWORD a=(DWORD)(255.0f*height);
return((a<<24L)+(r<<16L)+(g<<8L)+b);
}
//生成法线图
D3DXComputeNormalMap(pNormalMap,pHeightMap,NULL,0,D3D_CHANNEL_RED,1.0f);//pHeightMap为原高度图的指针,pNormalMap为一张空纹理,用于存放法线图
//在渲染程序段中可以这样写:
DWORD F=Vector2ARGB(&light,0.0f); //light是单位化的光源向量
pD->SetRenderState(D3DRS_TEXTUREFACTOR,F);//pD是D3D的设备指针,这句将光源法线参数输入
pD->SetTexture(1,TEXTURE);//设置原纹理,如上面的球,如有需要可以贴上纹理样式
pD->SetTexture(0,normalmap);//使用上面生成好的法线图
pD->SetTextureStageState(0,D3DTSS_COLORARG1,D3DTA_TEXTURE);//设置“来源1”为法线图
pD->SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_DOTPRODUCT3);//将“来源1”(法线图)与“来源2”(光源法线)进行点乘
pD->SetTextureStageState(0,D3DTSS_COLORARG2,D3DTA_TFACTOR);//设置“来源2”为光线的光源法线参数
pD->SetTextureStageState(1,D3DTSS_COLORARG1,D3DTA_TEXTURE);//这步和下面几步将图片的原纹理加上
pD->SetTextureStageState(1,D3DTSS_COLOROP,D3DTOP_MODULATE);
pD->SetTextureStageState(1,D3DTSS_COLORARG2,D3DTA_CURRENT);
假凹凸貼圖
[編輯]三維計算機圖形程序員有時使用計算量較小的假凹凸貼圖模擬凹凸貼圖效果。其中一個方法是使用紋素索引變化取代曲面法線變化,這種方法經常用於二維凹凸貼圖。在GeForce 2類型的圖形加速硬件中就使用了這項技術。
全屏的二維假凹凸貼圖,可以很容易地用簡單快速的渲染循環實現,在二十世紀九十年代的示範影像是一個非常普通的視覺效果。
與位移映射之間的差別
[編輯]位移映射與凹凸貼圖之間區別在例圖中已經很明顯地顯現出來了:在凹凸貼圖中,只有法線進行了擾動,而幾何體本身沒有擾動,這樣的結果就是人為改變只出現在物體的輪廓上,而球體本身仍然是原來的圓形。即凹凸貼圖只是視覺上的改變,就像一個畫得很透視的圖片;而位移映射卻真的將3D物體變得「凹凸不平」。
參見
[編輯]參考資料
[編輯]- ^ Technologies, Unity. Unity - Manual: Heightmap. docs.unity3d.com. [2017-09-25]. (原始內容存檔於2017-09-26) (英語).
參考文獻
[編輯]- Blinn, James F. "皺紋表面模擬", Computer Graphics, Vol. 12 (3), pp. 286-292 SIGGRAPH-ACM (August 1978)
外部連結
[編輯]- http://www.blacksmith-studios.dk/projects/downloads/bumpmapping_using_cg.php(頁面存檔備份,存於網際網路檔案館) Bump Mapping tutorial using CG and C++