?? 卡通渲染.txt
字號:
卡通渲染
文\申曉
現在市面上流行的3D游戲畫面越來越炫目,不過也有一些為了營造一種特殊的效果而使用了卡通渲染技術,比如PC游戲中的《殺手XIII》,《忍者神龜》;PS2游戲中的《真紅之淚》,《犬夜叉》等等。這些游戲的畫面看上去很像漫畫,感覺比較有趣。下面就介紹一種簡單的實現方法。
所謂用卡通渲染技術繪制的三維物體一般都有兩個明顯的特征,一個特征是物體表面覆蓋著大塊的單調顏色,而且光影變化比較劇烈;另一個特征是物體擁有粗重的邊緣效果。如果能自己控制光照和陰影,就可以達到目的。而DirectX 9.0 中的頂點渲染(Vertex Shaders)提供了這樣一個途徑,使我們可以實現自己的想法。
頂點渲染與以前的T&L在渲染流程中處于二選一的地位,一段代碼最多只能有128條指令,而且不能有循環,判斷和跳轉指令,全是線性執行指令。每次只能有一個Shader程序是激活的,Vertex Shaders讓我們可以實時地控制模型的空間變換,光照處理以及像素渲染。
那么現在先來解決第一個問題。我們可以用光線的亮度值作為物體的紋理坐標,這就產生一種帶狀紋理的效果,然后再調整相應的顏色即可。下面是渲染表面的Vertex Shaders代碼:
//v0 點位置
//v1 法向量
//c0 (0,0.5,1.0,2.0)
//c1-4 WV矩陣
//c5-9 WVP矩陣
//c9 光的顏色
//c10 光的方向
vs_2_0
dcl_position v0
dcl_normal v1
dcl_texcoord v2
dcl_color v3
def c0,0.0,0.5,1.0,2.0
m4x4 oPos,v0,c5 //變換點位置到WorldViewProj空間
m3x4 r1,v1,c1 //變換法向量到WorldView空間
dp3 r2,-r1,c10 //計算光照
max r2,r2,c0.x
mov oT0.x,r2 //紋理坐標[r2,0.5]
mov oT0.y,c0.y
mov oD0,c9 //設置光照
這段代碼先把每個點的坐標變換到相應的空間,然后使用一維的坐標來表示帶狀紋理的效果。最后設置材質的顏色并添加照明。程序中之所以選擇0.5作為水平方向上的紋理坐標,是為了避免一些邊緣采樣的問題。
接著解決第二個問題。為了體現出粗重的邊緣效果,我們必須要找出所有的邊緣輪廓。一般的話,如果兩個面的朝向相反,那么它們的公共邊就是邊緣輪廓。法向量和視覺向量的點積越接近0,就離邊緣越近,然后把這些靠近邊緣的三角形渲染成黑色即可。為了控制卡通化的程度,可以設置一個閥值,然后使用alpha檢測來決定每個點的顏色。
vs_2_0
dcl_position v0
dcl_normal v1
dcl_texcoord v2
dcl_color v3
def c0,0.0,0.5,1.0,2.0
m4x4 oPos,v0,c5 //變換點位置到WorldViewProj空間
m3x4 r0,v0,c1 //變換點位置到WorldView空間
m3x4 r1,v1,c1 //變換法向量到WorldView空間
nrm r2,r0 //歸一化
dp3 r3.x,r2,-r1 //計算點積
mad oD0.w,r3.x,c0.y,c0.y //設置alpha值
mov oD0.xyz,c0.x //設置漫射光
這段代碼先把每個點的坐標變換到相應的空間,然后計算點積,最后添加光照。另外還要在程序中使用alpha檢測來過濾像素,代碼如下所示:
m_pd3dDevice->SetRenderState(D3DRS_ALPHATESTENABLE,1);
m_pd3dDevice->SetRenderState(D3DRS_ALPHAFUNC,D3DCMP_GREATEREQUAL);
m_pd3dDevice->SetRenderState(D3DRS_ALPHAREF,200);
實際渲染要執行兩遍,第一遍繪制表面,第二遍繪制邊緣,這樣就基本達到了我們的目的。還要說明的一點是,因為Geforce FX系列以前的顯卡不是硬件支持VS2.0,所以必須在程序中設置成軟件模擬方式。就是在 d3dapp.cpp 的 Initialize3DEnvironment 中把 behaviorFlags 賦值為D3DCREATE_SOFTWARE_VERTEXPROCESSING即可,這樣才能看到效果。本文附帶的D3D9Cartoon例程是用DirectX 9 SDK開發的,這個開發包在微軟網站上有下載,大概有218MB,地址是http://download.microsoft.com/download/b/6/a/b6ab32f3-39e8-4096-9445-d38e6675de85/dx90bsdk.exe,安裝后再編譯此例程就可以運行了。D3D9Cartoon例程是在 VS.NET2002+WinXP 下面調試通過。
參考文獻:
Cartoon Rendering in DirectX 8.0 Using Vertex Shaders
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -