Game Programming II
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/gp2
스텐실
September 19, 2006
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/gp2
주전자의 반사 효과 (1)
스텐실버퍼를이용하지않음
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/gp2
주전자의 반사 효과 (2)
스텐실버퍼를이용
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/gp2
스텐실 버퍼 (Stencil Buffer)
특수한효과를위한오프스크린버퍼
후면버퍼및깊이버퍼와동일한해상도를가짐
후면버퍼의일정부분이렌더링되는것을막는
스텐실효과에이용
활용예) 거울, 평면그림자
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/gp2
주요 내용
스텐실스텐실 버퍼의버퍼의 작동작동 원리원리와스텐실버퍼를
만드는방법, 스텐실버퍼를제어하는방법
거울을거울을 구현하는구현하는 방법방법과스텐실버퍼를이용해
거울이아닌표면에반사가일어나는것을막는
방법
그림자를그림자를 렌더링렌더링 하는하는 방법방법과스텐실버퍼를
이용해 “더블블렌딩”을막는방법
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/gp2
스텐실 버퍼 이용하기
스텐실버퍼활성화
스텐실버퍼를 default 값으로깨끗이지움
_device->SetRednerState(D3DRS_STENCILENABLE, true);
... // do stencil work
_device->SetRednerState(D3DRS_STENCILENABLE, false);
_device->Clear( 0, 0,D3DCLEAR_TARGET | D3DCLEAR_ZBUFFER | D3DCLEAR_STENCIL,0xff000000, 1.0f, 0 );
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/gp2
스텐실 버퍼 요청하기 (1)
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/gp2
스텐실 버퍼 요청하기 (2)
스텐실버퍼는깊이버퍼를생성할때함께생성가능깊이버퍼의포맷을지정할때스텐실버퍼의포맷도함께지정가능
예) 3 종류의깊이 / 스텐실버퍼포맷D3DFMT_D24S8
D3DFMT_D24X4S4
D3DFMT_D15S1
참고) D3DFMT_D32
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/gp2
스텐실 테스트
스텐실버퍼를사용하여후면버퍼의일부영역이렌더링되는것을막음
LHS = 참조 & 마스크프로그램상에서정의된참조값과마스크값의 AND 연산
RHS = 값 & 마스크테스트하려는픽셀의스텐실버퍼값과프로그램상에서정의된마스크값의 AND 연산
비교연산자LHS와 RHS를비교하는연산자지정
( 참조 & 마스크 ) 비교연산자 ( 값 & 마스크 )( 참조 & 마스크 ) 비교연산자 ( 값 & 마스크 )
스텐실테스트결과가 true이면스텐실을통과하여후면버퍼에픽셀출력false이면픽셀은출력되지않고깊이버퍼에도안써짐
스텐실테스트결과가 true이면스텐실을통과하여후면버퍼에픽셀출력false이면픽셀은출력되지않고깊이버퍼에도안써짐
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/gp2
스텐실 테스트의 제어 (1)
스텐실참조값, 마스크, 비교연산자를지정
스텐실참조값default : 0
참조값변경
스텐실마스크참조와값양쪽의비트를감추는데이용
default : 0xffffffff (어떤것도감추지않음)
마스크변경
_device->SetRenderState(D3DRS_STENCILREF, 0x1);
1616진수를진수를 이용하면이용하면 비트비트 배열배열 확인확인 및및 AND AND 연산에연산에 수월수월
_device->SetRenderState(D3DRS_STENCILMASK, 0x0000ffff);
상위상위 1616비트를비트를 감춤감춤
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/gp2
스텐실 테스트의 제어 (2)
스텐실값테스트를수행하고있는현재픽셀의스텐실버퍼값
비교연산자비교연산자지정
typedef enum _D3DCOMPFUNC {D3DCMP_NEVER = 1,D3DCMP_LESS = 2,D3DCMP_EQUAL = 3,D3DCMP_LESSEQUAL = 4,D3DCMP_GREATER = 5,D3DCMP_NOTEQUAL = 6,D3DCMP_GREATEREQUAL = 7,D3DCMP_ALWAYS = 8,D3DCMP_FORCE_DWORD = 0x7ffffff
} D3DCOMPFUNC;
_device->SetRenderState(D3DRS_STENCILFUNC, D3DCMP_LESS);
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/gp2
스텐실 버퍼의 갱신
테스트후, 세가지상황에따라스텐실버퍼의항목이갱신되는방법을지정스텐실테스트가실패했을때,
깊이테스트가실패했을때,
스텐실테스트와깊이테스트가모두성공했을때,
_device->SetRenderState(D3DRS_STENCILFAIL, StencilOperation);
D3DSTENCILOP_KEEP
D3DSTENCILOP_ZERO
D3DSTENCILOP_REPLACE
D3DSTENCILOP_INVERT
D3DSTENCILOP_INCRSAT
D3DSTENCILOP_DECRSAT
D3DSTENCILOP_INCR
D3DSTENCILOP_DECR
_device->SetRenderState(D3DRS_STENCILZFAIL, StencilOperation);
_device->SetRenderState(D3DRS_STENCILPASS, StencilOperation);
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/gp2
스텐실 쓰기 마스크
스텐실버퍼에값을쓸때도, 마스크를설정해
비트를감출수있음
default : 0xffffffff
_device->SetRenderState(D3DRS_STENCILWRITEMASK, 0x0000ffff);
상위상위 1616비트를비트를 감춤감춤
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/gp2
Sample: Mirrors
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/gp2
‘거울’ 구현
두가지문제
임의의평면에물체가반사되는방법파악
거울영역에만반사를그려야함
스텐실스텐실 버퍼버퍼 (Stencil Buffer) (Stencil Buffer)
벡터벡터 기하학기하학 (Vector Geometry) (Vector Geometry)
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/gp2
반사를 위한 수학 (1)
임의의평면 에대해점 의반사포인트 를계산하는방법( )zyx vvv ′′′=′ , ,v
( )zyx vvv , ,=v0ˆ =+⋅ dpn
0ˆ =+⋅ dpn
( )zyx vvv , ,=v
( )zyx vvv ′′′=′ , ,v
qn̂
n̂kn̂2k−
( )( )[ ]nnvnv
nvnv
nvv
ˆˆˆ2
ˆˆ2
ˆ2
d
d
k
+⋅−=+⋅−=
−=′
MatrixMatrixMatrix
⎥⎥⎥⎥⎥
⎦
⎤
⎢⎢⎢⎢⎢
⎣
⎡
−−−+−−−
−+−−−−+−
=
1222
01222
02122
02212
dndndn
nnnnnn
nnnnnn
nnnnnn
zyx
zzzyzx
yzyyyx
xzxyxx
R
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/gp2
반사를 위한 수학 (2)
D3DX 라이브러리는 R과같은임의의평면에대한반사행렬을만들어내는함수제공
세가지특수한경우표준좌표평면(yz, xz, xy평면)에대한반사변환행렬
D3DXMATRIX *D3DXMatrixReflect(D3DXMATRIX *pOut,CONST D3DXPLANE *pPlane
);
⎥⎥⎥⎥
⎦
⎤
⎢⎢⎢⎢
⎣
⎡−
=
1000
0100
0010
0001
yzR
⎥⎥⎥⎥
⎦
⎤
⎢⎢⎢⎢
⎣
⎡−
=
1000
0100
0010
0001
xzR
⎥⎥⎥⎥
⎦
⎤
⎢⎢⎢⎢
⎣
⎡
−=
1000
0100
0010
0001
xyR
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/gp2
‘거울’ 구현의 Overview
전체장면을보통때와마찬가지로렌더링
스텐실버퍼를 0 값으로소거
스텐실버퍼에만거울을구성하는기본도형을렌더링
반사된주전자를후면버퍼와스텐실버퍼로렌더링스텐실테스트통과한부분만후면버퍼에렌더링)
후면버퍼 스텐실버퍼
후면버퍼 스텐실버퍼
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/gp2
Global Variables
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/gp2
Flexible Vertex Format
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/gp2
Create Objects (1)
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/gp2
Create Objects (2)
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/gp2
Texture & Light
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/gp2
Camera & Projection
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/gp2
Cleanup( )
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/gp2
Display( ) (1)
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/gp2
Display( ) (2)
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/gp2
RenderScene( )
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/gp2
Enabling the Stencil Buffer
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/gp2
Rendering the Mirror only to the Stencil Buffer
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/gp2
Preparing to Render the Reflected Teapot
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/gp2
Computing the Matrix that Positions the Reflectance
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/gp2
Rendering the Reflected Teapot
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/gp2
Sample: Shadow
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/gp2
평면 그림자
평면에놓이는그림자어느곳에서빛이비추고있는지인식할수있도록함
장면의사실감을높임
그림자볼륨매우사실적, 수준높은개념
DirectX SDK에그림자볼륨의예제프로그램
구현방법3차원수학 –물체를평면에떨어뜨림
50% 투명한검은재질을이용하여렌더링
“더블블렌딩”이라는약간의부작용방지를위해스텐실버퍼이용
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/gp2
평행 광원 그림자
광선과평면의교차
L
p
s n·p+d=0
Intersection Point
Ray ( ) Lpr tt +=
Plane 0=+⋅ dpn
0=+⋅+=d
t
sn
Lps ( ) 0=++⋅ dtLpn
( )( )
Ln
pn
pnLn
Lnpn
⋅⋅−−
=
⋅−−=⋅−=⋅+⋅
dt
dt
dt
LLn
pnps ⎥⎦
⎤⎢⎣⎡
⋅⋅−−
+=∴d
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/gp2
점 광원 그림자
광선과평면의교차
p
n·p+d=0
L
s
Intersection Point
Ray ( ) ( )Lppr −+= tt
Plane 0=+⋅ dpn
( )0=+⋅−+=
d
t
sn
Lpps ( )( ) 0=+−+⋅ dt Lppn
( )( )( )
Lnpn
pn
pnLnpn
Lpnpn
⋅−⋅⋅−−
=
⋅−−=⋅−⋅−=−⋅+⋅
dt
dt
dt
LLnpn
pnps ⎥
⎦
⎤⎢⎣
⎡⋅−⋅⋅−−
+=∴d
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/gp2
그림자 행렬 (1)
변환행렬투영면 4D 벡터
조명의방향이나위치 4D vectorLw=0이면, L은평행조명의방향
Lw=1이면, L은점조명의위치
평행광원그림자
평행투영이용
평행평행 광원광원 그림자그림자
평행평행 투영투영 이용이용점광원그림자
원근투영이용
점점 광원광원 그림자그림자
원근원근 투영투영 이용이용
0=+⋅ dpn ( )dnnn zyx , , ,( )wzyx LLLL , , ,
⎥⎥⎥⎥⎥
⎦
⎤
⎢⎢⎢⎢⎢
⎣
⎡
++
++
=
kdLdLdLdL
LnkLnLnLn
LnLnkLnLn
LnLnLnkLn
wzyx
wzzzyzxz
wyzyyyxy
wxzxyxxx
S
( ) ( ) wzzyyxxwzyxzyx dLLnLnLnLLLLdnnnk +++=⋅= ,,,,,, where
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/gp2
그림자 행렬 (2)
DirectX 라이브러니는그림자행렬을만들어내는함수제공
pLight : w=0일경우, 평행조명
w=1일경우, 점조명pPlane : 그림자를만들평면
D3DXMATRIX *D3DXMatrixShadow(D3DXMATRIX *pOut,CONST D3DXVECTOR4 *pLight,CONST D3DXPLANE *pPlane
);
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/gp2
더블 블렌딩을 막기 위한 스텐실 버퍼이용 (1)더블블렌딩 (Double blending)
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/gp2
더블 블렌딩을 막기 위한 스텐실 버퍼이용 (2)
하나의픽셀에두번이상블렌드가적용되는
것을막음
처음으로렌더링되는픽셀들만받아들이도록스텐실
테스트를구성
이미렌더링된 (스텐실버퍼에표시된) 영역에픽셀을쓰려고하면, 스텐실테스트가실패
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/gp2
Display( )
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/gp2
Setting the Stencil Render States
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/gp2
Computing the Shadow Transformation
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/gp2
Rendering the Shadow
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/gp2
Sample: Mirror Shadow
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/gp2
Display( )
Sun-Jeong Kim http://www.hallym.ac.kr/~sunkim/teach/2006/gp2
연습 문제
지난주만든장면에다음을추가하시오.배경벽면에거울
바닥평면
평면에물체의그림자