+ All Categories
Home > Documents > 스텐실 - graphics.hallym.ac.krgraphics.hallym.ac.kr/teach/2006/gp2/src/05stencil.pdf ·...

스텐실 - graphics.hallym.ac.krgraphics.hallym.ac.kr/teach/2006/gp2/src/05stencil.pdf ·...

Date post: 29-Aug-2019
Category:
Upload: others
View: 2 times
Download: 0 times
Share this document with a friend
24
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) 스텐실 버퍼를 이용하지 않음
Transcript
Page 1: 스텐실 - graphics.hallym.ac.krgraphics.hallym.ac.kr/teach/2006/gp2/src/05stencil.pdf · Sun-Jeong Kim sunkim/teach/2006/gp2 주요내용 스텐실버퍼의작동원리와스텐실버퍼를

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)

스텐실버퍼를이용하지않음

Page 2: 스텐실 - graphics.hallym.ac.krgraphics.hallym.ac.kr/teach/2006/gp2/src/05stencil.pdf · Sun-Jeong Kim sunkim/teach/2006/gp2 주요내용 스텐실버퍼의작동원리와스텐실버퍼를

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)

특수한효과를위한오프스크린버퍼

후면버퍼및깊이버퍼와동일한해상도를가짐

후면버퍼의일정부분이렌더링되는것을막는

스텐실효과에이용

활용예) 거울, 평면그림자

Page 3: 스텐실 - graphics.hallym.ac.krgraphics.hallym.ac.kr/teach/2006/gp2/src/05stencil.pdf · Sun-Jeong Kim sunkim/teach/2006/gp2 주요내용 스텐실버퍼의작동원리와스텐실버퍼를

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 );

Page 4: 스텐실 - graphics.hallym.ac.krgraphics.hallym.ac.kr/teach/2006/gp2/src/05stencil.pdf · Sun-Jeong Kim sunkim/teach/2006/gp2 주요내용 스텐실버퍼의작동원리와스텐실버퍼를

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

Page 5: 스텐실 - graphics.hallym.ac.krgraphics.hallym.ac.kr/teach/2006/gp2/src/05stencil.pdf · Sun-Jeong Kim sunkim/teach/2006/gp2 주요내용 스텐실버퍼의작동원리와스텐실버퍼를

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비트를비트를 감춤감춤

Page 6: 스텐실 - graphics.hallym.ac.krgraphics.hallym.ac.kr/teach/2006/gp2/src/05stencil.pdf · Sun-Jeong Kim sunkim/teach/2006/gp2 주요내용 스텐실버퍼의작동원리와스텐실버퍼를

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);

Page 7: 스텐실 - graphics.hallym.ac.krgraphics.hallym.ac.kr/teach/2006/gp2/src/05stencil.pdf · Sun-Jeong Kim sunkim/teach/2006/gp2 주요내용 스텐실버퍼의작동원리와스텐실버퍼를

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

Page 8: 스텐실 - graphics.hallym.ac.krgraphics.hallym.ac.kr/teach/2006/gp2/src/05stencil.pdf · Sun-Jeong Kim sunkim/teach/2006/gp2 주요내용 스텐실버퍼의작동원리와스텐실버퍼를

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

Page 9: 스텐실 - graphics.hallym.ac.krgraphics.hallym.ac.kr/teach/2006/gp2/src/05stencil.pdf · Sun-Jeong Kim sunkim/teach/2006/gp2 주요내용 스텐실버퍼의작동원리와스텐실버퍼를

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 값으로소거

스텐실버퍼에만거울을구성하는기본도형을렌더링

반사된주전자를후면버퍼와스텐실버퍼로렌더링스텐실테스트통과한부분만후면버퍼에렌더링)

후면버퍼 스텐실버퍼

후면버퍼 스텐실버퍼

Page 10: 스텐실 - graphics.hallym.ac.krgraphics.hallym.ac.kr/teach/2006/gp2/src/05stencil.pdf · Sun-Jeong Kim sunkim/teach/2006/gp2 주요내용 스텐실버퍼의작동원리와스텐실버퍼를

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

Page 11: 스텐실 - graphics.hallym.ac.krgraphics.hallym.ac.kr/teach/2006/gp2/src/05stencil.pdf · Sun-Jeong Kim sunkim/teach/2006/gp2 주요내용 스텐실버퍼의작동원리와스텐실버퍼를

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)

Page 12: 스텐실 - graphics.hallym.ac.krgraphics.hallym.ac.kr/teach/2006/gp2/src/05stencil.pdf · Sun-Jeong Kim sunkim/teach/2006/gp2 주요내용 스텐실버퍼의작동원리와스텐실버퍼를

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

Page 13: 스텐실 - graphics.hallym.ac.krgraphics.hallym.ac.kr/teach/2006/gp2/src/05stencil.pdf · Sun-Jeong Kim sunkim/teach/2006/gp2 주요내용 스텐실버퍼의작동원리와스텐실버퍼를

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)

Page 14: 스텐실 - graphics.hallym.ac.krgraphics.hallym.ac.kr/teach/2006/gp2/src/05stencil.pdf · Sun-Jeong Kim sunkim/teach/2006/gp2 주요내용 스텐실버퍼의작동원리와스텐실버퍼를

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( )

Page 15: 스텐실 - graphics.hallym.ac.krgraphics.hallym.ac.kr/teach/2006/gp2/src/05stencil.pdf · Sun-Jeong Kim sunkim/teach/2006/gp2 주요내용 스텐실버퍼의작동원리와스텐실버퍼를

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

Page 16: 스텐실 - graphics.hallym.ac.krgraphics.hallym.ac.kr/teach/2006/gp2/src/05stencil.pdf · Sun-Jeong Kim sunkim/teach/2006/gp2 주요내용 스텐실버퍼의작동원리와스텐실버퍼를

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

Page 17: 스텐실 - graphics.hallym.ac.krgraphics.hallym.ac.kr/teach/2006/gp2/src/05stencil.pdf · Sun-Jeong Kim sunkim/teach/2006/gp2 주요내용 스텐실버퍼의작동원리와스텐실버퍼를

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

Page 18: 스텐실 - graphics.hallym.ac.krgraphics.hallym.ac.kr/teach/2006/gp2/src/05stencil.pdf · Sun-Jeong Kim sunkim/teach/2006/gp2 주요내용 스텐실버퍼의작동원리와스텐실버퍼를

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

Page 19: 스텐실 - graphics.hallym.ac.krgraphics.hallym.ac.kr/teach/2006/gp2/src/05stencil.pdf · Sun-Jeong Kim sunkim/teach/2006/gp2 주요내용 스텐실버퍼의작동원리와스텐실버퍼를

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

Page 20: 스텐실 - graphics.hallym.ac.krgraphics.hallym.ac.kr/teach/2006/gp2/src/05stencil.pdf · Sun-Jeong Kim sunkim/teach/2006/gp2 주요내용 스텐실버퍼의작동원리와스텐실버퍼를

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)

Page 21: 스텐실 - graphics.hallym.ac.krgraphics.hallym.ac.kr/teach/2006/gp2/src/05stencil.pdf · Sun-Jeong Kim sunkim/teach/2006/gp2 주요내용 스텐실버퍼의작동원리와스텐실버퍼를

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( )

Page 22: 스텐실 - graphics.hallym.ac.krgraphics.hallym.ac.kr/teach/2006/gp2/src/05stencil.pdf · Sun-Jeong Kim sunkim/teach/2006/gp2 주요내용 스텐실버퍼의작동원리와스텐실버퍼를

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

Page 23: 스텐실 - graphics.hallym.ac.krgraphics.hallym.ac.kr/teach/2006/gp2/src/05stencil.pdf · Sun-Jeong Kim sunkim/teach/2006/gp2 주요내용 스텐실버퍼의작동원리와스텐실버퍼를

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

Page 24: 스텐실 - graphics.hallym.ac.krgraphics.hallym.ac.kr/teach/2006/gp2/src/05stencil.pdf · Sun-Jeong Kim sunkim/teach/2006/gp2 주요내용 스텐실버퍼의작동원리와스텐실버퍼를

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

연습 문제

지난주만든장면에다음을추가하시오.배경벽면에거울

바닥평면

평면에물체의그림자


Recommended