Tìm hiểu kỹ thuật tạo bóng cứng Shadow VolumeTìm hiểu kỹ thuật tạo bóng cứng Shadow VolumeTìm hiểu kỹ thuật tạo bóng cứng Shadow VolumeTìm hiểu kỹ thuật tạo bóng cứng Shadow VolumeTìm hiểu kỹ thuật tạo bóng cứng Shadow VolumeTìm hiểu kỹ thuật tạo bóng cứng Shadow VolumeTìm hiểu kỹ thuật tạo bóng cứng Shadow VolumeTìm hiểu kỹ thuật tạo bóng cứng Shadow VolumeTìm hiểu kỹ thuật tạo bóng cứng Shadow VolumeTìm hiểu kỹ thuật tạo bóng cứng Shadow VolumeTìm hiểu kỹ thuật tạo bóng cứng Shadow VolumeTìm hiểu kỹ thuật tạo bóng cứng Shadow VolumeTìm hiểu kỹ thuật tạo bóng cứng Shadow VolumeTìm hiểu kỹ thuật tạo bóng cứng Shadow VolumeTìm hiểu kỹ thuật tạo bóng cứng Shadow Volume
Trang 2L I C
d cho chúng em nh ng ki n th c b ích và quý giá trong su t 4
i.
Trang 3M c L c
L U 3
H A BA CHI U VÀ BÀI TOÁN T O BÓNG 4
1.1 Khái quát v h a 3 chi u 4
1.1.1 Hi n th 3D(3D Viewing) 4
1.1.2 B m và các phép ki m tra 11
1.2 Bài toán t o bóng 12
1.2.1 Bóng và các d ng ngu n sáng 12
1.2.2 M t s cách ti p c n trong t o bóng 17
THU T T O BÓNG C NG B VOLUME 19
2.1 19
20
2.3 24
2.4 T o bóng kh i b ng thu t toán Z-Pass 27
2.5 T o bóng b ng thu t toán Z-Fail 30
2.5.1 T t c các m c c a bóng t v m nhìn 31
2.5.2 T t c các m t sau c a bóng t v m nhìn 32
2.5.3 V y n u c a kh i 33
2.6 35
C NGHI M 36
3.1 Bài toán 36
3.2 Phân tích, l a ch n công c 36
3.2.1 Gi i thi u ngôn ng l p trình 36
3.2.2 L a ch n công c 37
3.3 K t qu 37
K T LU N 39
TÀI LI U THAM KH O: 39
Trang 4h a máy tính là m t l nh v c phát tri n nhanh nh t trong tin h c Nó
c áp d ng r ng rãi trong nhi u l nh v c khác nhau thu c v khoa h c, k ngh , y khoa, ki n trúc và gi i trí
Trang 5ng trong th gi i th c ph n l ng 3 chi u còn thi t
nhìn trùng v ng âm c a tr c Z Tr c X ch v phía ph i và tr c Y ch lên phía trên trong màn hình H t m i này s c g i là H t M t (Eye Coordinate System) Phép bi n i t t th gi i sang các t m t là m t phép bi c g i là phép bi i hi n th (Viewing Transformation)
C t th gi i và t m c bi u di n b i t ng nh t (Homogeneous Coordinates) v i w=1
c th 2 T a m c chuy n qua t c a thi t b chu n hóa
cho vùng không gian mà ta mu c
Trang 6và y c a t thi t b chu n hóa sang t Pixel c a màn hình Thành ph n z ( 1 z 1 c chuy n [0,1] và s c s d ng
chi u sâu (Depth-Value) trong thu t toán Z-Buffer (b c s
c t (Clipping Coordinate System) Phép chi u s là m t phép bi i affine
ng h p phép chi u là phép chi u tr c giao N u phép chi u là phép chi u
ph i c nh s không ph i là m t phép bi i affine (Vì w s nh n m t giá tr khác 1)
c ti p theo, các vùng c a không gian hi n th mà không n m trong kh i tiêu chu c g i là kh i nhìn tiêu chu n) s b c
ng th c ch a trong ho c là có m t ph n trong s c thay
ch ph n n m trong kh i nhìn tiêu chu n m c gi l i Ph n còn l i không c n quan tâm nhi u n a
Sau khi c t g t, các t ng nh t s c chuy n sang t c a thi t b
b ng cách chia x,y,z cho w N u w nh n 1 giá tr u, thì phép chianày s ng ph i c nh mong mu
c g i là phép chia ph i c nh (Perspective Division)
Trang 7Hình 1.1: T ng quan v hi n th 3D và các phép chi u.
Phép bi i hi n th s t camera c cho tùy ý v m t camera
v m nhìn trùng v i g c t ng nhìn d c theo chi u âm c a tr c Z (xem hình 2.1) Tr c Y sau phép bi ng s ch lên phía trên c a màn hình Tr c X s ch v phía ph i
M t cách thu n ti nh v trí c a camera o là cho sãn v trí c a
m nhìn E, M m trong khung nhìn R m tham chi u) và m ng s
ch lên phía trên trong màn hình
Phép bi i hi n th s g c:
Trang 8R E
n V
n V
u Ch v phía ph i, vuông góc v i n X
u n
Trang 9ng h p phép chi u tr c giao, vùng không gian hi n th là m t ng song song trong h t m t Các m t c a ng song song này song song v i các
m t c a h t m c và v trí c a vùng không gian hi n th c xác
nh b i t m t xleft, xright, ybottom, ytop, zfront và zback (xleft, ybottom) và (xright, ytop)
nh m t c a s trong m t ph ng chi u (ho c là b t k m t nào song song v i
m t XY) mà vùng không gian hi n th s c hi n th a s này ph i
d ng hình vuông [-1,+1]2 zfront và zback m t ph ng c t
c và c t sau T c a t t c m trong không gian (ho c ít nh t là nh ng
m ta mu n nhìn) ph i th a mãn zback z zfront Kho ng giá tr c a z ph c các giá tr chi u sâu (depth value) n n [- m g n m t
có giá tr chi u sâu nh
Hình 1.2 : Vùng không gian hi n th c a phép chi u tr c giao.
Phép chi u tr c b ng cách th c hi n các phép bi i sau theo th t :
nh ti n M t ( M) s a vùng không gian hi n th v g c
c c a vùng hi n th v m i chi u
Trang 10i x ng qua m m n m g nh n giá tr z nh
m t thành ph n t khác c a thi t b chu n hóa là z sao cho nó là m
u c a kho ng cách t n m t ph ng m t XY Kho ng cách t m t
b ng cách chia x ,y ,z cho w (Phép chia ph i c nh):
Trang 11V i phép chi u ph i c nh, vùng không gian hi n th là m t hình tháp c t v i
Trang 121.1.2
b c tranh ra màn hình Màn hình là m t m ng hình vuông c a các pixel M i pixel
hi n th c 1 màu nh nh Sau các quá trình quét (bao g m Texturing
chi u sâu Các m qua m t lo t các phép ki m tra và các thao tác
c v ra màn hình
N u m c các phép ki m tra (test pass) thì nó s tr thành các
v các pixel này, ta c n ph i bi c màu s c c a chúng là gì, và thông
tr d li u cho t ng pixel xu t hi c g i là b
m (Buffer) Các b m khác nhau s t lo i d li u khác nhau cho pixel
và b nh cho m i pixel có th s khác nhau gi a các b t b
m này là Z-buffer
b Depth test: V i m i pixel trên màn hình, b m chi ng
c coi là qua Depth test (depth test pass) và giá tr chi u sâu c c
Trang 13thay th cho giá tr m N u giá tr chi u sâu c
v i m t giá tr tham chi u theo m
glStencilOp(GLenum fail, GLenum zfail, GLenum zpass);
Hà nh d li u trong stencil Buffer s i th nào n
m m tra stencil 3 hàm fail, zfail và zpass có th là
ng v i gi nguyên giá tr hi n t i, thay th nó v i 0, thay th nó b i m t giá tr
Trang 15Hình 1.6: Bóng cung c p thông tin v d ng hình h c c a con r i Hình bên trái con r i c gi a nó c m cái vòng, và bên ph i nó c m cái m trà.
m m hi n th vùng n a bóng bên ngoài vùng bóng trung tâm và ph i
ánh sáng b t quy t c trong vùng n a bóng)
Trang 16.
thành ph n không th thi t o ra bóng Có ngu n sáng ch chi u theo m t
ng nh ng ánh sáng m t tr i), có ngu n sáng chi u ra toàn khung
c t khung c nh có th có nhi u ngu n sáng Các ngu n sáng này có
th c t t b t t ng cái gi ng công t c v y Theo mô hình ánh sáng c a OpenGl thì ánh sáng g m có 4 thành ph n chính: Emissive Light, Ambient Light, Diffuse Light, Specular Light Các thành ph n này có th c
l p v i nhau, và cu c k t h p l i v i nhau
Ambient Light là ánh sáng b phân rã b ng và không th nh
ng c a chúng N u trong m t khung c nh ngu n sáng thì k t
Trang 17Hình 1.8: Chi c c chi u b ng Ambient Light.
Diffuse Light (ánh sáng khu ch tán) là ánh sáng chi u theo m ng nh t, tuy nhiên khi nó g p m t b m t nó s b phân rã b ng nhau v m ng, Vì th
m m hay t m ng nh u có thành ph n Diffuse Light
Hình 1.9: c chi u b ng Diffuse Light
Specular Light là ánh sáng ph n x Khi g p m t b m t nó s ph n x l i
t ph n x Nó có th c nhìn th y trên nh ng b m t cong.Ánh sáng xung quanh là m c sáng trung bình, t n t i trong m t vùng không gian M t không gian lý t ng là không gian mà t i m i v t u c cung
c p m t l ng ánh sáng lên b m t nhau, t m i phía m i n Thông
th ng ánh sáng xung qua c xác nh v i m t m c c th g i là m c sángxung quanh c a vùng không gian mà v t th ng , sau ta c ng v i c ng sáng có c t các ngu n sáng khác có c c ng sáng cu i cùng lên
m t m hay m t m t c a v t th
Ngu n nh h ng gi ng nh ng gì mà m t tr i cung c p cho chúng
ta Nó bao g m m t t p các tia sáng song song, b t k c ng c a chúng có gi ng
Trang 18nhau hay không Có hai lo i k t qu c a ánh sáng nh h ng khi chúng chi u n
b m t là: khuy ch tán và ph n chi u N u b m t ph n x toàn b (gi ng m t
g ng) thì các tia ph n x s có h ng ng c v i h ng c a góc t i (Hình 8.1).Trong tr ng h p ng c l i, n u b m t là không ph n x toàn ph n (cónhám, xù xì) thì m t ph n các tia sáng s b to các h ng khác hay b h p th ,
c nh vi t m t ph ng nh n bóng Nh ng c nh vi nh vi n s t o ra các m a bóng kh i T a vào các phép ki m tra ta s ki m tra
c m m trong khung c nh có thu c bóng kh i hay không
- Dùng b bóng (Shadow Mapping) t toán s d ng
(hay còn g i là b các giá tr chi u sâu khi t o nh t v trí c a
hay n m trong bóng
Trang 19- L n theo tia sáng (Ray Tracing) : v i m m t ta vào không gian là m ng th ng s c t vào c a s (màn hình) và ch m vào v t
th trong không gian (g n nh t t m t) T m ch m vào v t th i
m ch m v t th nào mà ta chia ra các tia sáng khác nhau
.:
- khung (Frame Buffer Algorithms):
Trang 20PHÁP SHADOW VOLUME 2.1
2.1
Thu t toán bóng kh i là thu t toán t o bóng d a trên các thông tin v hình
d ng c a v t th c n t o bóng (Geometry Based Shadow Algorithm), vì th
h i ph i có các thông tin v tính k t n i c a t t c các v t th
có th tính toán m t cách hi u qu và chính xác.Các thông tin v v t th có th c l y t m
nó th hi n hình d ng c ng 3D b ng 2 danh sách:
nh
Trang 21ch xét v i m t ngu n sáng duy nh t o ra bóng kh i là ta s xây d ng
m ác bao quanh vùng bóng kh i mà v t th t c chi u
i tìm ra danh sách các c nh vi n c a v t th , chúng là nh ng c nh ch y t o ra bóng kh i, khi ánh sáng chi n nh ng
v t th v i tia sáng
Trang 23Side: interger;
For i = 0 to n do Begin
thu t toán tìm danh sách các c nh vi i d ng mã gi
n: là s
Procedure Danhsachcanhvien() Begin
for i = 0 to n do // Ki m tra t t c giác
if (P[i].visible = true} // N u m t ch c chi u sáng
Trang 24}}
//calculate the indicesfor(int ring=0; ring<torusPrecision; ring++){
for(int i=0; i<torusPrecision; i++){
indices[((ring*torusPrecision+i)*2)*3+0]=ring*(torusPrecision+1)+i;
indices[((ring*torusPrecision+i)*2)*3+1]=(ring+1)*(torusPrecision+1)+i;indices[((ring*torusPrecision+i)*2)*3+2]=ring*(torusPrecision+1)+i+1;
Trang 25planeEquations=new PLANE[numTriangles];
if(!planeEquations){
errorLog.OutputError("Unable to allocate memory for %d planes", numTriangles);
return false;
}for(unsigned int j=0; j<numTriangles; ++j){
th ng n i gi a ngu nh này theo lý thuy t s c chi u ra
vô c s không c n thi t vì th ta s ch cho chúng các giá tr t
Trang 26v4.y = (v2.y - L.y) * He_so_chieu;
v t th i v i v trí c a ánh sáng N p m t sau thì ta ch c n chi u t ng m t sau c a
2.6
Trang 27nh các t giác bao quanh bóng kh i
isFacingLight=new bool[numTriangles];
if(!isFacingLight){
errorLog.OutputError("Unable to allocate memory for %d booleans", numTriangles);
return false;
}//Create space for connectivity dataneighbourIndices=new GLint[numTriangles*3];
if(!neighbourIndices){
errorLog.OutputError("Unable to allocate memory for %d neighbour indices", numTriangles*3);
return false;
}//Create space for "is silhouette edge" booleansisSilhouetteEdge=new bool[numTriangles*3];
if(!isSilhouetteEdge){
errorLog.OutputError("Unable to allocate memory for %d booleans", numTriangles*3);
return false;
}//Calculate the neighboursSetConnectivity();
return true;
}
Trang 28t bao nhiêu m c, bao nhiêu m t sau ta sdùng m t b m cho m m c n ki m tra, mà s
ph n bóng, Còn n u nó l m này n m trong vùng bóng và
m trong vùng bóng kh i N u nó c t s m c c a bóng kh i
Thu t toán s c mô t b ng mã gi
Procedure IN_SHADOW_TEST // Z-pass
Trang 29For {T t c các m t sau c a bóng kh i nhìn t v trí c m nhìn} do
if Depth test passes then
- Gi m giá tr Stencil Buffer
End if End for
Trang 302.9
2.10 : Không
.
c th c hiXóa h t trong Z-buffer và Stencil-Buffer, Ch c ch n r ng Ch ghi vào Z-
Trang 31- V các m t sau c a bóng kh i, N u chúng th c s c v ra.(Có
m giá tr Stencil Buffer
- B t ch Stencil test (ch nh m có giá tr Stencil = 0 m i
c v ra màn hình), Xóa Z-buffer, b t ch ghi vào Z-buffer, b t ngu n sáng
- V ra toàn b khung c nh nh m có giá tr trong stencil Buffer là 0
Cách th 3 là s d ng thu t toán Z-Fail do Thay vì tính toán giá tr Stencil
b ng vi c c a bóng kh i và gi m giá tr c a các m t sau khi Buffer Pass, toàn b quá trình s m t vô c m t
Z-m nhìn Vì th thu t toán này còn g i là Z-Fails
Thu t toán Z- c th hi n b n mã gi sau:
Procedure IN_SHADOW_TEST // Z-fail
if Depth test fails then
- Gi m giá tr Stencil Buffer
End if
Trang 322.5.1
Void SHADOW_MODEL::SetConnectivity()
{
//set the neighbour indices to be -1
for(unsigned int i=0; i<numTriangles*3; ++i)
neighbourIndices[i]=-1;
//loop through triangles
for(unsigned int i=0; i<numTriangles-1; ++i){
//loop through edges on the first triangle
for(int edgeI=0; edgeI<3; ++edgeI)
{//continue if this edge already has a neighbour set
if(neighbourIndices[i*3+edgeI]!=-1)
continue;
//loop through triangles with greater indices than this one
for(unsigned int j=i+1; j<numTriangles; ++j)
{//loop through edges on triangle jfor(int edgeJ=0; edgeJ<3; ++edgeJ)
{
Trang 33//get the vertex indices on each edge
if(planeEquations[i].ClassifyPoint(lightPosition)==POINT_IN_FRONT_OF_PLANE)
isFacingLight[i]=true;
elseisFacingLight[i]=false;
}
//loop through edgesfor(unsigned int i=0; i<numTriangles*3; ++i){
//if this face is not facing the light, not a silhouette edge
Trang 34isSilhouetteEdge[i]=0;
continue;
}//this face is facing the light
//if the neighbouring face is not facing the light, or there is no neighbouring face,//then this is a silhouette edge
Void SHADOW_MODEL::DrawInfiniteShadowVolume(VECTOR3D lightPosition, bool drawCaps)
//Loop through edges on this face
for(int j=0; j<3; ++j)
Trang 35{//Draw the shadow volume "edge" if this is a silhouette edge
glVertex4f( vertex2.x-lightPosition.x,
vertex2.y-lightPosition.y,vertex2.z-lightPosition.z, 0.0f);
}}
}}
glEnd();
//Draw caps if required
if(drawCaps){
glBegin(GL_TRIANGLES);
{ for(unsigned int i=0; i<numTriangles; ++i)
{ for(int j=0; j<3; ++j)
{VECTOR3D vertex=vertices[indices[i*3+j]].position;
Trang 36(Self-Shadow)
Trang 373.1 Bài toán
ng d ng k thu t t o bóng c ng minh h a cho k t qu tài s d ng ngôn ng l p trình visual c.net và ch ng
Ph n quan tr ng c a VS NET là các công ngh m i v i trung tâm là NET
xây d ng ng d ng Windows, ng d ng web và d ch v web XML T t c ngôn ng c d ch sang d ng ngôn ng trung gian c a
d ng mã th c thi b i m t trình d ch JIT (Just in Time) trên n n NET
CLR và MSIL cho phép t t c các ngôn ng NET làm vi c v i nhau Ví d
b n có th dùng m t l p C# k th a t m i t ng COM C++/ATL, l p này l i
phép tích h , b n có th ch y t b y l i qua c 3 ngôn ngtrong cùng m ng phát tri n ng d ng VS.NET
Trình d ch JIT cung c p thêm kh o m t, tính an toàn lúc th c thi và
kh y trên nhi u n n t ng (Microsoft cho bi t s dùng m t t p con chu n hoá c a NET Framework - c g i là n n t ng ngôn ng - xây d ng
m t th hi n trên FreeBSD) N u trình JIT cho mã ngôn ng trung gian làm b n liên
ng l ng dùng ngôn ngtrung gian trong Vbasic và h u h t các ph n m m ng d ng c a mình (k c
Office)t nhi
C# m t ngôn ng phát tri n t C++ có nhi u nét gi
, ngôn ng Visual C++ quen thugói vào VS.NET là Visual C++.NET bao g m ph n C++ truy n th ng dùng cho ng
d c l p v i ph n m dùng v i n n NET V ph n
p khá nhi u cho s
Trang 38Mô t : D án này s hi n th b n Tori xoay quanh m m ánh sáng ngu n
qua:
1 V toàn b c nh lit c a ambient và m ng nh diffuse ánh sáng
t giá tr chi u sâu cho nhìn th y c nh
2 V kh i tin vào bóng t i stencil buffer Theo m nh, bóng t i kh i tin, s d ng "zFail" k thu t, v i m t infinite clip
c mô t trong "m nh m Stenciled Shadow volumes" gi y
3 V c nh lit v diffuse và specular, trong khu v c unshadowed
Yêu c u:
i v i hai bên-stencil Shadows:
EXT_stencil_two_side: kh ng bóng t i có th c rút ra ch m t l n cho t ng, ch không ph i hai l n Ph n c ng s g / gi m các b m