You are on page 1of 17

Chng 4.

Cc thut ton Vertex v Pixel Shader

vng bng ti c th bao ph ton b cc vt th khc trong bi cnh. Phn cnh ca shadow volume c to ra bng cch ko di (extrude) cc cnh bao (silhouette edges) theo phng chiu ca nh sng to thnh 1 vng kn. Sau y l hnh m t cc phn ca 1 vng bng ti.

Hnh 4-1 M t cc phn ca shadow volume

Cnh bao (silhouette edge) iu kin tin quyt ca thut ton bng l ta phi tnh c hnh khi ca shadow volume m ni dung chnh l ta phi tm c cc cnh bao. Mt cnh (bt k) c cu to bi hai im v c t 1 n 2 mt k lin vi n, cnh c gi l cnh bao khi n ch c 1 mt k hay c 2 mt k nhng mt mt hng v pha nh sng trong khi mt cn li th khng.

Hnh 4-2 Cnh bao l cnh c mt mt k hng nh sng cn mt cn li th khng

Thc t vic tm cnh bao c pht trin thnh 2 thut ton hon ton ring bit.

- 57 -

Chng 4. Cc thut ton Vertex v Pixel Shader

Thut ton 1: Kim tra tt c cc tam gic ca vt th tm cc cnh c tnh cht ca cnh bao. Thut ton 1 tm cnh bao nh sau:
Bc 1: Lp cho tt c cc tam gic ca vt th. Bc 2: Nu tam gic hng v pha ngun sng ( tch v hng ca vector hng nh sng v vector php tuyn ca tam gic >= 0): Bc 2-a: Chn 3 cnh (l 3 cp vertices) ca tam gic vo edge stack. Bc 2-b: Kim tra trong stack xem 3 cnh va chn xut hin ri hay cha (tnh lun th t o ca cnh, v d AB = BA). Bc 2-c: Nu cnh tn ti trc trong stack, g b c hai cnh khi stack. Bc 3: Cui cng, cc cnh cn li trong stack l cc cnh bao.

u im: n gin do s dng CPU thc hin. Shadow volume to ra c s mt ti thiu, render nhanh. Khuyt im: Tc chm do phi tnh ton nhiu. Skinning (dng cho din hot khung xng) phi thc hin trc trn CPU. Thut ton 2: To ra mt vt th mi (shadow volume mesh) t vt th chn sng nhng c thm cc mt c b sung cc cnh, ri dng Vertex Shader to hnh khi ca shadow volume. u im: Tc nhanh do thc hin ngay trn GPU (Vertex Shader), gii phng CPU. C th thc hin skinning trn phn cng. Khuyt im: Phc tp do thut ton to vt th mi, vic tnh ton chm. Phi s dng thm Vertex Shader. Shadow Volume c s mt to ra ln hn rt nhiu so vi vt th gc, render s chm hn.

- 58 -

Chng 4. Cc thut ton Vertex v Pixel Shader

S dng thut ton 2 cho ra tc nhanh hn hn thut ton 1 d khi render c chm hn do c nhiu mt hn. V u im v tc nn thut ton 2 cng l thut ton m Engine chn s dng nn s c trnh by k phn sau. Cch to Shadow Volume Mesh Nh ta bit ni dung ch yu ca thut ton 2 l phi tnh c shadow volume mesh v dng Vertex Shader to hnh khi shadow volume t mesh ny. Hnh v sau y minh ha cch to ra shadow volume mesh.

Hnh 4-3 Dng shadow volume mesh bng cc thm vo cc mt ph

Thut ton to shadow volume mesh:


Bc 1: Lp cho tt c cc mt trong vt th Bc 2: Tnh vector php tuyn cho mi mt. Bc 3: Lp cho 3 cnh ca mi mt. Bc 3-a: Thm cnh vo 1 list kim tra. Bc 3-b: Nu cnh xut hin trong list ( ta tm thy cnh c dng chung cho 2 mt): + Nu php tuyn ca cc mt k cnh khng song song vi nhau, thm 1 t gic (degenerate quad) vo list kt qu. + Ngc li, ch thm cnh vo list kt qu. Bc 3-c: G b cnh ang x l v cc cnh tng t ra khi list kim tra. Bc 4: To mng d liu cha d liu ca shadow volume mesh, mi vertex ca shadow volume mesh ch gm v tr v php tuyn m thi. Bc 5: Nu cn cnh no trong list kim tra th vt th ang x l khng phi l khi c v trong khi c tt c cc cnh u c 2 mt k vi n.

Trong chng trnh Game demo vic to shadow volume mesh c t ng ha bng chng trnh MeshTools c pht trin km theo Game (cch s dng chng trnh ny xem thm phn ph lc). MeshTools nhn u vo l vt th gc sau to shadow volume mesh v lu vo .X file load vo Game sau ny.

- 59 -

Chng 4. Cc thut ton Vertex v Pixel Shader

Hnh 4-4 Chng trnh MeshTools to shadow volume mesh mt cch t ng

Dng hnh bng ti (render shadow) Sau khi tnh c hnh khi shadow volume ta phi v hnh khi ny to thnh cc vng bng ti trong bi cnh. tng ch o ca thut ton ny ging nh cch tm 1 im trong hnh khi. Ta k 1 on thng t mt ti im cn xt, nu on thng ch i vo hnh khi shadow volume m khng c i ra (tc l ct shadow volume 1 s l ln) th im cn xt nm trong vng ti. m s ln ct cho mi im nh c xt ngi s vng m stencil buffer lu s ln ct qua cc shadow volume. Stencil buffer l vng m b nh b sung (thng c chia x chung vi vng m su (depth buffer)), vai tr ch yu ca vng m ny ny l lm mt n (mask) cho cc pixel c v. Qua qu trnh pht trin c 2 thut ton c s dng cho bi ton dng hnh bng ti l z-pass v z-fail. Mi thut ton c u khuyt im ring nhng trong khun kh bi bo co ny ch yu s trnh by v thut ton z-fail. Chi tit ca thut ton ny nh sau:
+ V cc mt sau (back face) ca shadow volume. Nu su ca im nh so snh tht bi (thng l gi tr ln hn gi tr trong depth buffer), gi tr ca stencil buffer ti im s tng ln 1. + V cc mt trc (front face) ca shadow volume. Nu su ca im nh so snh tht bi, gi tr ca stencil buffer gim i 1.

- 60 -

Chng 4. Cc thut ton Vertex v Pixel Shader

Sau khi v shadow volume bng thut ton trn tt c cc im trong bi cnh b ph bi bng ti c gi tr trong stencil buffer khc 0 trong khi cc im khc th bng 0. Sau y l hnh v minh ha cho thut ton dng bng ti (z-fail)

Hnh 4-5 Thut ton shadow volume vi k thut z-fail

Trong hnh v trn vt mu cam biu din cho vt th nhn bng ti, vt mu xanh l vt th chn sng. Cc khu vc A, B, C, D, E l 5 khu vc s c dng hnh m c s nh hng ca shadow volume. Cc gi tr cc vng l gi tr trong stencil buffer thay i khi mt trc (front face) hay mt sau (back face) ca shadow volume c v vo frame hnh. Ti khu vc A v E, mt trc v sau khi v u khin gi tr trong stencil buffer khng i do trong 2 khu vc ny vt nhn bng ti (mu cam) v vt chn sng (mu xanh) gn mt hn nn lm cho vic kim tra su tht bi khin gi tr trong stencil buffer trung ha v 0. Trong khu vc B v D, mt trc s vt qua s kim tra su trong khi mt sau th tht bi, v th gi tr stencil ti cc vng ny s mang gi tr 1 (do ch c mt sau lm stencil buffer thay i m thi). khu vc C, c mt trc v sau u vt qua s kim tra su, nn khng lm cho gi tr trong stencil thay i. Khi kt thc qu trnh v shadow volume th stencil khu vc B, D khc 0, cho thy B v D nm trong vng bng ti ca vt chn sng.

- 61 -

Chng 4. Cc thut ton Vertex v Pixel Shader

Cui cng ta ch cn ph ti vng B, D bng cch v mt t gic ln bao ph ton b bi cnh l kt thc thut ton. 4.2.2. Vertex Shader cho Shadow Volume cc phn trn ta nm c c s l thuyt ca thut ton ny. Phn ny s trnh by Vertex Shader c dng v shadow volume.
static const int g_lightIndex = 0; static const float g_extrudeDistance = 200.0f; static const float g_depthEsilon = 1e-5f; static const float3 g_shadowColor = { 1.0f, 1.0f, 0.0f }; struct VS_INPUT { float4 position : POSITION; float3 normal : NORMAL; }; struct VS_OUTPUT { float4 position : POSITION; float4 color : COLOR0; }; VS_OUTPUT main( VS_INPUT i ) { VS_OUTPUT o; // Calculate vertex world position float3 worldPos = mul( i.position, cModel[0] ); // Calculate vertex world normal float3 worldNormal = mul( i.normal, cModel[0] ); // Calculate light-to-vertex vector in world space float3 lightVector = normalize( worldPos cLightInfo[g_lightIndex].pos); // Extrude if the vertex not facing the light if( dot(worldNormal,-lightVector)<0.0 ) worldPos += lightVector * g_extrudeDistance; // Calculate projection space position float4 projPos = mul( float4(worldPos, 1), cViewProj ); // Offset an amount to avoid z-fighting projPos.z += g_depthEsilon * projPos.w; o.position = projPos; // Final color o.color = float4( g_shadowColor, 0.1f ); return o; }

Khi thc hin Vertex Shader tt c cc vertex khng hng v ngun sng s b y ra xa theo hng nh snh, hnh thnh vng bng ti (shadow volume).

- 62 -

Chng 4. Cc thut ton Vertex v Pixel Shader

4.2.3. Mt s kt qu t c Vic s dng hiu ng ny trong Game demo t hiu qu rt cao do gn vi thc t. Nu khng c bng, cc vt th c v l lng trong khng gian, nhng nu c bng cht lng hnh nh tng ln r rt. Cc cnh sau y c chp t Game demo.

Hnh 4-6 Bi cnh khng c bng thi gian thc

Hnh 4-7 Bi cnh c bng thi gian thc

- 63 -

Chng 4. Cc thut ton Vertex v Pixel Shader

Hnh 4-8 Shadow volume c v bao trm cc vng ti

4.3. Khung cnh bu tri (skybox) Trong cc Game hin nay cc hu cnh l iu khng th thiu v chng mang li cht lng rt ha rc r, to tnh thc cho bi cnh. Ci lm nn cho cc hu cnh li chnh l khung cnh bu tri, nu khng c chng ta s kh phn bit c, u l ngy, u l m Nhm gp phn lm cho hu cnh gn hn vi thc t, Nwfc Engine c h tr thm Vertex Shader thc hin v cc khung cnh bu tri. 4.3.1. C s l thuyt Cch biu din bu tri bng hnh khi v texture. V bu tri l khung cnh ng nn cc hnh khi ng c s dng kh nhiu th hin bu tri. Cc hnh khi thng c s dng l hnh khi vung (box), hnh cu hay bn cu (sphere). Cc texture c s to khung cnh bu tri thng l cc texture biu hin 6 mt ca khng gian xung quanh (dng cho box) hay cc texture lin nhau cc cnh (dng cho sphere).

- 64 -

Chng 4. Cc thut ton Vertex v Pixel Shader

Hnh 4-9 Texture lin nhau cc cnh dng cho sky sphere

Hnh 4-10 Texture 6 mt dng cho sky box

Cc c tnh ca bu tri trong thc t Khung cnh bu tri trong thc t c cc c tnh y m ta cn quan tm khi mun thit k Vertex Shader. Rt xa so vi tm nhn, khi ta nhn tp trung vo 1 hung th d ta c di chuyn n u di na th theo hng nhn (vi iu kin khong cch khng qu ln) th hnh nh m ta nhn c t bu tri l khng i. Tuy nhin hnh nh t bu tri m ta nhn c s thay i khi ta nhn cc hng khc nhau. T cc c tnh trn ca bu tri ta xc nh c cch thc biu din bu tri trong 3D nh sau: S dng mt hnh khi lm vt cha v s dng 1 texture c hnh khung cnh bu tri.

- 65 -

Chng 4. Cc thut ton Vertex v Pixel Shader

V ta khng th no i xuyn qua bu tri, nn ta phi lun cp nht v tr ca hnh khi bu tri = v tr hin thi ca camera (hay v tr ca mt) (tha mn tnh cht 1). Ch cp nht v tr m khng thay i gc xoay ca hnh khi bu tri nhm khin cho hnh khi bu tri khng thay i theo hng xoay ca camera (tha mn tnh cht 2). Sau y l hnh v minh ha cho tng.

Hnh 4-11 Ta ca skybox c cp nht theo ta camera

4.3.2. Vertex Shader cho skybox Vertex Shader cho skybox kh n gin nh sau:
struct VS_INPUT { float4 position float2 texcoord }; : : POSITION; TEXCOORD0;

struct VS_OUTPUT { float4 position float4 color float2 texcoord }; : : : POSITION; COLOR0; TEXCOORD0;

VS_OUTPUT main( VS_INPUT i )

- 66 -

Chng 4. Cc thut ton Vertex v Pixel Shader

{ VS_OUTPUT o; // Skybox local transform float3 worldPos = mul( float4( i.position.xyz, 0 ), cModel[0] ); // Vertex world position = eye position worldPos += cEyePos; // Transform vertex to projection space float4 projPos = mul( float4( worldPos, 1 ), cViewProj ); // Sky is far away, so depth value = 1.0f projPos.z = 0.9999f * projPos.w; o.position = projPos; // Final color o.color = 1.0f; o.texcoord = i.texcoord; return o; }

Trc tin ta phi bin i sky box bng ma trn th gii, vic ny c v nh l khng cn thit v ta s s dng v tr ca mt (hay camera) lm v tr cho skybox. Nhng thc t cng vic ny cho php ta trin khai 1 s thuc tnh ban u cho skybox nh cao i vi tm mt, phng i Sau khi cng thm ta ca mt vo, ta phi bin i vertex vo khng gian chiu bng cch nhn vi ma trn View * Projection. V skybox rt xa nn ta cho su = 1.0f ( cc im nh ca skybox khng th vt qua gi tr su ca cc im nh khc khi kim tra su (depth test)) cng on ny phi nhn vi projPos.w v chun b cho giai on chun ha h ta thun nht sau khi kt thc Vertex Shader. 4.3.3. Mt s kt qu t c Khung cnh bu tri c v ra m bo ng cc c tnh ca bu tri trong thc t, cho d ta c di chuyn camera th no i na, ta cng khng th i xuyn qua bu tri c. Cc cnh sau y c chp t Game demo.

- 67 -

Chng 4. Cc thut ton Vertex v Pixel Shader

Hnh 4-12 Khung cnh bu tri chnh din

Hnh 4-13 Mt gc nhn khc ca bu tri

- 68 -

Chng 4. Cc thut ton Vertex v Pixel Shader

4.4. Chiu sng theo im nh (per-pixel lighting) s dng normal map v specular map Hin nay hiu ng chiu sng trn tng im nh c s dng kh ph bin trong cc Game nhm tng cng cht lng ha cho Game. Thay v chiu sng theo tng nh vertex, per-pixel lighting cho cht lng ha cao hn hn do c th p dng nhiu thut ton mi trong ha 3 chiu nh bump b mt bng normal map, phn chiu b mt bng specular map ng dng khi t thc hin chiu sng trn im nh bng Shaders phi gii quyt cc tt c cc vn v chiu sng nh diffuse lighting, specular lighting Diffuse lighting trong Engine ch yu s dng bump bng normal map v specular lighting ch yu s dng specular map, 2 thut ton chiu sng ny s c trnh by k phn ny. 4.4.1. C s l thuyt phn ny s cp chi tit vo qui trnh chiu sng trn im nh c Engine h tr. Qui trnh chiu sng trn im nh ch yu phn ra lm 2 cng on ring bit: thc hin tnh ton mu chnh (diffuse color) v tnh ton mu phn chiu (specular color). Tnh ton mu diffuse (c bump b mt bng normal map) Trc khi i chi tit vo thut ton ta cn xem qua 1 s khi nim mi dng trong phn ny Khng gian tip tuyn ca vt th (tangent space). Ta texture ti mi nh (vertex) hnh thnh mt h trc ta 3 chiu vi trc U (tip tuyn), trc W (php tuyn) v trc V (binormal = U x W). H trc ta ny gi l khng gian tip tuyn hay khng gian texture ca vt th ti cc nh (vertex).

- 69 -

Chng 4. Cc thut ton Vertex v Pixel Shader

Hnh 4-14 Khng gian tip tuyn

Normal map l g? Normal map l mt texture nhng c c tnh kh c bit, thay v cha thng tin v im mu nh texture thng thng, normal map lai cha thng tin v khng gian tip tuyn (tangent space) hay khng gian texture (texture space) ca vt th, hay ni cch khc nu cc im nh ca texture biu din mu sc ca vt th ti 1 im th normal map s biu din khng gian tip tuyn ca vt th ti im . Mi im nh ca normal map c nh dng l RGBA trong 3 thnh phn RGB c gi tr [0..1] c nh x t 3 trc U, V, W c gi tr trong khong [-1, 1]. Normal map c th to ra bng 2 cch, dng height map (texture dng graycale cha thng tin su v b mt ca vt th trong mu sng hn biu th cao ln hn). Cch th 2 phc tp hn do phi to thm 1 vt th khc c chi tit cao hn, sau ta so snh s khc nhau gia 2 vt th to ra normal map (qu trnh ny c th c thc hin bng tool Melody ca NVidia).

Hnh 4-15 To normal map t height map

- 70 -

Chng 4. Cc thut ton Vertex v Pixel Shader

Hnh 4-16 To normal map t vt th c chi tit cao hn bng Melody (NVidia)

Bump b mt s dng normal map Bump b mt ch yu c thc hin trn Pixel Shader cho tng im nh. Thut ton ny s dng gi tr normal trong normal map xc nh mc ca nh sng tc ng vo im nh bng cch nhn tch v hng gi tr normal trn vi vector hng nh sng trong khng gian tip tuyn. Sau gi tr ny c nhn vi mu sc ca vertex v mu ly mu t texture tnh ra mu diffuse (mu ca vertex c tnh trong Vertex Shader)
light factor = dot product (normal, light vector ) diffuse color = light factor * vertex color * texture color;

Trong normal. Vector php tuyn (normal vector) ti im , normal vector c c do ly mu t normal map. light vector. Vector hng nh sng trong khng gian tip tuyn (tangent space), vector ny c tnh trong Vertex Shader v c truyn vo Pixel Shader s dng. vertex color. Mu ca vertex sau khi thc hin chiu sng trn vertex (pervertex lighting) trong Vertex Shader. texture color. Mu ca texture chnh, c c do ly mu texture.

- 71 -

Chng 4. Cc thut ton Vertex v Pixel Shader

Hnh 4-17 Chiu sng theo tng vertex trong Vertex Shader

Hnh 1. D liu vertex trong b nh (c v di dng wireframe) Hnh 2. Chiu sng trn tng nh (per-vertex lighting) bng Vertex Shader

Hnh 4-18 Chiu sng trn tng im nh trong Pixel Shader

Hnh 1. Chiu sng trn tng pixel (s dng tch v hng gia normal v vector hng nh sng). Hnh 2. Sau khi kt hp vi ly mu t texture chnh. Tnh ton mu specular (s dng specular map) Specular map l g ? Specular map l texture dng grayscale, specular map c tc dng cho bit vng no ca vt th phn chiu nhiu nh sng vng no phn chiu t nh sng (tng ng vi mu trong specular map t sng ti ti). Tnh phn chiu ca nh snh phn chiu (phn x) ca nh sng trn vt th th ph thuc v tr ca mt (hay camera). Khi mt nm ngay trn ng phn x ca nh sng th mt s nhn

- 72 -

Chng 4. Cc thut ton Vertex v Pixel Shader

thy mt vng nh sng chi do ton b nng lng ca nh sng c truyn thng vo mt.

Hnh 4-19 S phn x ca tia sng trn b mt

Mun tnh mu specular ca im nh ta phi xc nh c mc nh sng phn chiu ti im . Cng thc tnh vector phn chiu (phn x) nh sau:
R = 2(L dot N)N - L

Trong : L. Light vector R. Reflection vector N. Normal Mc phn chiu ca nh sng ph thuc rt nhiu vo cht liu b mt ca vt th, cc b mt nhn bng c phn chiu ln trong khi cc b mt g gh li c phn chiu thp. trnh cng vic phi phn r vt th ra thnh nhiu thnh phn dng hnh vi cc mc phn chiu khc nhau ngi ta dng specular map nh mt lookup table xc nh mc phn chiu ca nh snh trn tng im nh.
reflection vector = 2 * dotproduct (normal, light vector) * normal - light vector specular factor = dotproduct (reflection vector, view vector) specular color = (specular factor ^ specular constant) * specular lookup

Trong normal. Vector php tuyn (normal vector) ti im , normal vector c c do ly mu t normal map.

- 73 -

You might also like