68
Rendering Pipeline

Week04 Rendering Pipeline · 렌더링파이프라인 월드변환 뷰변환 로컬스페이스 월드스페이스 뷰스페이스 후면추려내기 조명 래스터라이즈 뷰포트

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Week04 Rendering Pipeline · 렌더링파이프라인 월드변환 뷰변환 로컬스페이스 월드스페이스 뷰스페이스 후면추려내기 조명 래스터라이즈 뷰포트

Rendering Pipeline

Page 2: Week04 Rendering Pipeline · 렌더링파이프라인 월드변환 뷰변환 로컬스페이스 월드스페이스 뷰스페이스 후면추려내기 조명 래스터라이즈 뷰포트

목 차

Rendering Pipeline

월드 변환

카메라 제어

카메라 디자인

뷰 변환

후면추려내기

카메라 디자

카메라 구현

뷰 행렬 계산

클리핑

투영 변환

뷰포트 변환

임의의 축으로 회전

Pitch, Yaw, Roll

걷기 옆걸음질 날기뷰포트 변환

래스터라이즈

걷기, 옆걸음질, 날기

애니메이션및 게임 실습 2

Page 3: Week04 Rendering Pipeline · 렌더링파이프라인 월드변환 뷰변환 로컬스페이스 월드스페이스 뷰스페이스 후면추려내기 조명 래스터라이즈 뷰포트

렌더링 파이프라인

월드변환 뷰변환

로컬 스페이스 월드 스페이스 뷰 스페이스 후면 추려내기 조명

월드변환 뷰변환

클리핑투영뷰포트래스터라이즈

투영변환뷰포트변환

애니메이션및 게임 실습 3

Page 4: Week04 Rendering Pipeline · 렌더링파이프라인 월드변환 뷰변환 로컬스페이스 월드스페이스 뷰스페이스 후면추려내기 조명 래스터라이즈 뷰포트

월드 변환

로컬 스페이스 -> 월드 스페이스위치, 크기, 방위를 포함하는 각 물체간의 관계를 정의

zz z

z

x

y

x

yy

x

애니메이션및 게임 실습 4

Page 5: Week04 Rendering Pipeline · 렌더링파이프라인 월드변환 뷰변환 로컬스페이스 월드스페이스 뷰스페이스 후면추려내기 조명 래스터라이즈 뷰포트

월드 변환

변환의 연속

⎟⎟⎟⎟⎞

⎜⎜⎜⎜⎛

⎟⎟⎟⎟⎞

⎜⎜⎜⎜⎛

⎟⎟⎟⎟⎞

⎜⎜⎜⎜⎛

⎟⎟⎟⎟⎞

⎜⎜⎜⎜⎛

=⎟⎟⎟⎟⎞

⎜⎜⎜⎜⎛

000000000

000

100010001

y

x

y

x

yzyyyx

xzxyxx

y

x

y

x

LLL

SS

S

RRRRRRRRR

TTT

WWW

⎟⎟⎠

⎜⎜⎝⎟⎟⎠

⎜⎜⎝⎟⎟⎠

⎜⎜⎝⎟⎟⎠

⎜⎜⎝

⎟⎟⎠

⎜⎜⎝ 11000

00010000

1000100

1zzzzzyzxzz LSRRRTW

월드좌표계

평행이동 회전 확대축소로컬

좌표계좌표계 좌표계

애니메이션및 게임 실습 5

Page 6: Week04 Rendering Pipeline · 렌더링파이프라인 월드변환 뷰변환 로컬스페이스 월드스페이스 뷰스페이스 후면추려내기 조명 래스터라이즈 뷰포트

월드 변환

변환의 연속

D3DXMATRIX matTrans, matRotX, matRotY;matWorld = matTrans * matRotX * matRotY;

D3DXMATRIX *D3DXMatrixMultiply(

D3DXMATRIX* pOut,

;

D3DXMATRIX pOut,CONST D3DXMATRIX* pM1,CONST D3DXMATRIX* pM2

)

변환의 설정

m_pd3dDevice->SetTransform(D3DTS_WORLD, &m_matWorld);m_pd3dDevice->SetTransform(D3DTS_VIEW, &m_matView);m_pd3dDevice->SetTransform(D3DTS_PROJECTION, &m_matProjection);

애니메이션및 게임 실습 6

Page 7: Week04 Rendering Pipeline · 렌더링파이프라인 월드변환 뷰변환 로컬스페이스 월드스페이스 뷰스페이스 후면추려내기 조명 래스터라이즈 뷰포트

월드 변환

행렬의 곱은 교환법칙이 성립하지 않음.

z z

x

회전 > 이동

x

이동 > 회전

애니메이션및 게임 실습 7

회전 -> 이동 이동 -> 회전

Page 8: Week04 Rendering Pipeline · 렌더링파이프라인 월드변환 뷰변환 로컬스페이스 월드스페이스 뷰스페이스 후면추려내기 조명 래스터라이즈 뷰포트

월드 변환

크기 변환

D3DXMATRIX *D3DXM t i S liD3DXMATRIX *D3DXMatrixScaling(

D3DXMATRIX *pOut,FLOAT sx,⎟

⎟⎟

⎜⎜⎜

⎛= y

x

SS

SS

000000

,FLOAT sy,FLOAT sz

)

⎟⎠

⎜⎝ zS00

애니메이션및 게임 실습 8

Page 9: Week04 Rendering Pipeline · 렌더링파이프라인 월드변환 뷰변환 로컬스페이스 월드스페이스 뷰스페이스 후면추려내기 조명 래스터라이즈 뷰포트

월드 변환

이동

D3DXMATRIX *D3DXMatrixTranslation⎟⎞

⎜⎛ 0001

(D3DXMATRIX *pOut,FLOAT x,FLOAT y⎟

⎟⎟⎟⎟⎞

⎜⎜⎜⎜⎜⎛

=010000100001

TFLOAT y,FLOAT z

)

⎟⎟⎠

⎜⎜⎝ 1zyx TTT

애니메이션및 게임 실습 9

Page 10: Week04 Rendering Pipeline · 렌더링파이프라인 월드변환 뷰변환 로컬스페이스 월드스페이스 뷰스페이스 후면추려내기 조명 래스터라이즈 뷰포트

월드 변환

축에 의한 회전

D3DXMATRIX *D3DXMatrixRotationX(

⎟⎞

⎜⎛ 001 (

D3DXMATRIX *pOut,FLOAT angle

)⎟⎟⎟

⎜⎜⎜

⎛−=cossin0sincos0001

)(θθθθθxR

⎟⎟⎟

⎜⎜⎜

⎛=

0i010

sin0cos)(

θθ

θθθyR

D3DXMATRIX *D3DXMatrixRotationY(

D3DXMATRIX *pOut,FLOAT angle

⎟⎟⎞

⎜⎜⎛ −

=

⎟⎠

⎜⎝−

0cossin0sincos

)(

cos0sin

θθθθ

θ

θθ

R

FLOAT angle)D3DXMATRIX *D3DXMatrixRotationZ(

⎟⎟

⎠⎜⎜

=1000cossin)( θθθzR (

D3DXMATRIX *pOut,FLOAT angle

)

애니메이션및 게임 실습 10

Page 11: Week04 Rendering Pipeline · 렌더링파이프라인 월드변환 뷰변환 로컬스페이스 월드스페이스 뷰스페이스 후면추려내기 조명 래스터라이즈 뷰포트

월드 변환

임의의 축을 중심으로 하는 회전

D3DXMATRIX *D3DXMatrixRotationAxis(

D3DXMATRIX *pOut,CONST D3DXVECTOR3 * VCONST D3DXVECTOR3 *pV,FLOAT Angle

)

애니메이션및 게임 실습 11

Page 12: Week04 Rendering Pipeline · 렌더링파이프라인 월드변환 뷰변환 로컬스페이스 월드스페이스 뷰스페이스 후면추려내기 조명 래스터라이즈 뷰포트

월드 변환

Examplep

D3DXMATRIX cubeWorldMatrix;D3DXM i T l i (& b W ldM i 3 0f 2 0f 6 0f)D3DXMatrixTranslation(&cubeWorldMatrix, -3.0f, 2.0f, 6.0f);

D3DXMATRIX sphereWorldMatrix;D3DXMatrixTranslation(&sphereWorldMatrix, 5.0f, 0.0f, -2.0f);D3DXMatrixTranslation(&sphereWorldMatrix, 5.0f, 0.0f, 2.0f);

Device->SetTransform(D3DTS_WORLD, &cubeWorldMatrix);drawCube();

Device->SetTransform(D3DTS_WORLD, &sphereWorldMatrix);drawSphere();

애니메이션및 게임 실습 12

Page 13: Week04 Rendering Pipeline · 렌더링파이프라인 월드변환 뷰변환 로컬스페이스 월드스페이스 뷰스페이스 후면추려내기 조명 래스터라이즈 뷰포트

월드 변환

예제 : 회전 및 이동

애니메이션및 게임 실습 13

Page 14: Week04 Rendering Pipeline · 렌더링파이프라인 월드변환 뷰변환 로컬스페이스 월드스페이스 뷰스페이스 후면추려내기 조명 래스터라이즈 뷰포트

월드 변환

방위 벡터

시선벡터 : 물체가 향하고 있는 방향, z축상향벡터 : 물체의 y축, 뒤집힘 방지우향벡터 : 물체의 뒤집힘 방지 회전우향벡터 : 물체의 뒤집힘 방지, 회전

상향(Up)

시선(Look)

우향(Right)

애니메이션및 게임 실습 14

Page 15: Week04 Rendering Pipeline · 렌더링파이프라인 월드변환 뷰변환 로컬스페이스 월드스페이스 뷰스페이스 후면추려내기 조명 래스터라이즈 뷰포트

월드 변환

오일러각에 의한 회전

D3DXMATRIX *D3DXMatrixRotationYawPitchRoll

y

(D3DXMATRIX *pOut,FLOAT yaw,FLOAT it h

yaw

FLOAT pitch,FLOAT roll

)x

pitch

z

roll

애니메이션및 게임 실습 15

Page 16: Week04 Rendering Pipeline · 렌더링파이프라인 월드변환 뷰변환 로컬스페이스 월드스페이스 뷰스페이스 후면추려내기 조명 래스터라이즈 뷰포트

월드 변환

회전

D3DXMATRIX *D3DXVec3TransformCoord(

D3DXVECTOR3 *pOut,D3DXVECTOR3 pOut,CONST D3DXVECTOR3 *pv,CONST D3DXMATRIX *pM

)

// 상향벡터 중심 회전D3DXVec3TransformCoord(&vLook, &vLook, &matYaw);D3DXVec3TransformCoord(&vRight, &vRight, &matYaw);

// 우향 벡터 중심 회전D3DXVec3TransformCoord(&vLook, &vLook, &matPitch);D3DXVec3TransformCoord(&vUp &vUp &matPitch);D3DXVec3TransformCoord(&vUp, &vUp, &matPitch);

// 시선 벡터 중심 회전D3DXVec3TransformCoord(&vRight, &vRight, &matRoll);

애니메이션및 게임 실습 16

D3DXVec3TransformCoord(&vUp, &vUp, &matRoll);

Page 17: Week04 Rendering Pipeline · 렌더링파이프라인 월드변환 뷰변환 로컬스페이스 월드스페이스 뷰스페이스 후면추려내기 조명 래스터라이즈 뷰포트

월드 변환

벡터의 정규화

시선벡터 정규화우향벡터 : 시선벡터와 상향벡터의 외적우향벡터 정규화우향벡터 정규화상향벡터 : 시선벡터와 우향벡터의 외적상향벡터 정규화

D3DXVec3Normalize(&vLook, &vLook);D3DXVec3Cross(&vRight, &vUp, &vLook);( g , p, );D3DXVec3Normalize(&vRight, &vRight);D3DXVec3Cross(&vUp, &vLook, &vRight);D3DXVec3Normalize(&vUp, &vUp);

애니메이션및 게임 실습 17

Page 18: Week04 Rendering Pipeline · 렌더링파이프라인 월드변환 뷰변환 로컬스페이스 월드스페이스 뷰스페이스 후면추려내기 조명 래스터라이즈 뷰포트

월드 변환

벡터의 정규화

D3DXVECTOR3 *D3DXVec3Normalize(

D3DXVECTOR3 *pOutD3DXVECTOR3 *pOut,CONST D3DXVECTOR3 *v

)

벡터의 외적

D3DXVECTOR3* D3DXV 3CD3DXVECTOR3* D3DXVec3Cross(

D3DXVECTOR3* pOut,CONST D3DXVECTOR3* v1,,CONST D3DXVECTOR3* v2

)

애니메이션및 게임 실습 18

Page 19: Week04 Rendering Pipeline · 렌더링파이프라인 월드변환 뷰변환 로컬스페이스 월드스페이스 뷰스페이스 후면추려내기 조명 래스터라이즈 뷰포트

월드 변환

예제 : 오일러각에 의한 회전

애니메이션및 게임 실습 19

Page 20: Week04 Rendering Pipeline · 렌더링파이프라인 월드변환 뷰변환 로컬스페이스 월드스페이스 뷰스페이스 후면추려내기 조명 래스터라이즈 뷰포트

월드 변환

오일러 각에 의한 회전

항상 현 시점에서의 모델 좌표계를 기준으로 회전회전의 결과 좌표축 방향이 바뀐다는 점에 유의처음 z 축 기준 회전 결과 모델 좌표계의 x y 축 방향이 이전과는 달라짐처음 z 축 기준 회전 결과 모델 좌표계의 x, y 축 방향이 이전과는 달라짐회전을 적용하는 순서가 중요함. 교환법칙이 성립하지 않음

애니메이션및 게임 실습 20

Page 21: Week04 Rendering Pipeline · 렌더링파이프라인 월드변환 뷰변환 로컬스페이스 월드스페이스 뷰스페이스 후면추려내기 조명 래스터라이즈 뷰포트

월드 변환

단점 1. 복합 변환의 결과를 예측하기 어려움.

오리엔테이션을 보간하기 위해서 오일러 각 자체를 보간

오일러 각 (10 20 30)에 의해 회전하고 회전결과를 기준으로 (40 50 60)에 의오일러 각 (10, 20, 30)에 의해 회전하고 회전결과를 기준으로 (40, 50, 60)에 의해 회전하면, 원래 물체를 (50, 70, 90)에 의해 회전한 것과는 다름. 첫 번째 회전결과 좌표축 방향이 변해 버리기 때문

애니메이션및 게임 실습 21

Page 22: Week04 Rendering Pipeline · 렌더링파이프라인 월드변환 뷰변환 로컬스페이스 월드스페이스 뷰스페이스 후면추려내기 조명 래스터라이즈 뷰포트

월드 변환

단점 2. 김벌락(Gimbal Lock) 현상

x 축 기준으로 그림에 표시된 방향으로 일정 각도를 회전. 이어서 z 축을 기준으로90도 회전하면 x 축과 y 축이 나란해 짐

현재 상태에서 y 축을 기준으로 회전을 가하면 이전에 x 축 기준으로 이미 회전한각도에 영향을 미침. 회전결과 x, y, z 축이 독립성을 잃을 수 있음

애니메이션및 게임 실습 22

Page 23: Week04 Rendering Pipeline · 렌더링파이프라인 월드변환 뷰변환 로컬스페이스 월드스페이스 뷰스페이스 후면추려내기 조명 래스터라이즈 뷰포트

월드 변환

단점 3: 오리엔테이션이 변하는 경로가 유일하지 않음

y축을 기준 180도 회전z축을 기준으로 180도 회전 + x축을 기준으로 180도 회전

회전각을 직접적으로 보간해서는 오리엔테이션이 변하는 경로를 예측하기 어려움.

애니메이션및 게임 실습 23

Page 24: Week04 Rendering Pipeline · 렌더링파이프라인 월드변환 뷰변환 로컬스페이스 월드스페이스 뷰스페이스 후면추려내기 조명 래스터라이즈 뷰포트

월드 변환

회전축과 회전각을 사용: 회전축은 단위벡터로 나타냄

애니메이션및 게임 실습 24

Page 25: Week04 Rendering Pipeline · 렌더링파이프라인 월드변환 뷰변환 로컬스페이스 월드스페이스 뷰스페이스 후면추려내기 조명 래스터라이즈 뷰포트

월드 변환

사원수(Quaternion)Q

William Rowan Hamilton : 1843, 복소수의 확장Ken Shoemake : 1985, SIGGRAPH

이용골격체 애니메이션(Skeletal Animation)역 기구학(Inverse Kinematics)3D 물리학

장점행렬보다 적은 공간 차지행렬보다 적은 공간 차지보간(Interpolation)에 좋음

애니메이션및 게임 실습 25

Page 26: Week04 Rendering Pipeline · 렌더링파이프라인 월드변환 뷰변환 로컬스페이스 월드스페이스 뷰스페이스 후면추려내기 조명 래스터라이즈 뷰포트

월드 변환

사원수(Quaternion)Q

축-각 표현을 수학적으로 개선

축 관련 변수 3개와 회전각 관련 변수 1개를 하나의 4차원 변수로축 관련 변수 3개와 회전각 관련 변수 1개를 하나의 4차원 변수로

w = 스칼라 부(Scalar Part) 또는 실수 부(Real Part)v = 벡터 부(Vector Part) 또는 허수 부(Imaginary Part)단위 4원수: 벡터의 길이(노름, Norm) = 1단위 사원수(Unit Quaternion)만이 회전에 사용됨.

애니메이션및 게임 실습 26

Page 27: Week04 Rendering Pipeline · 렌더링파이프라인 월드변환 뷰변환 로컬스페이스 월드스페이스 뷰스페이스 후면추려내기 조명 래스터라이즈 뷰포트

월드 변환

사원수(Quaternion)Q

축각 표현과의 관계

애니메이션및 게임 실습 27

Page 28: Week04 Rendering Pipeline · 렌더링파이프라인 월드변환 뷰변환 로컬스페이스 월드스페이스 뷰스페이스 후면추려내기 조명 래스터라이즈 뷰포트

월드 변환

사원수 연산

단위 사원수 노름 값은 1이므로 공액 사원수 자체가 역 사원수

애니메이션및 게임 실습 28

Page 29: Week04 Rendering Pipeline · 렌더링파이프라인 월드변환 뷰변환 로컬스페이스 월드스페이스 뷰스페이스 후면추려내기 조명 래스터라이즈 뷰포트

월드 변환

사원수(Quaternion)Q

애니메이션및 게임 실습 29

Page 30: Week04 Rendering Pipeline · 렌더링파이프라인 월드변환 뷰변환 로컬스페이스 월드스페이스 뷰스페이스 후면추려내기 조명 래스터라이즈 뷰포트

월드 변환

사원수(Quaternion)Q

공액 곱셈(Conjugate Product)

사원수 q를 사용하여 실제로 회전을 가하는 작업원점으로부터 물체 위의 점 p를 향한 벡터 PP 앞쪽에 q를 곱하고 뒤쪽에 q의 공액 사원수를 곱하여 계산P 앞쪽에 q를 곱하고 뒤쪽에 q의 공액 사원수를 곱하여 계산P는 3차원 벡터. 이를 사원수로 만들려면 스칼라 부분인 w를 0으로

애니메이션및 게임 실습 30

Page 31: Week04 Rendering Pipeline · 렌더링파이프라인 월드변환 뷰변환 로컬스페이스 월드스페이스 뷰스페이스 후면추려내기 조명 래스터라이즈 뷰포트

월드 변환

사원수에 의한 보간

사원수 q1, q2 에 의해 연속적으로 회전하였다면 그 결과는 원래의 물체에 대해 사원수 q1*q2 으로 회전한 것과 동일

예:사원수 q에 의해 회전하고 그 결과를 다시 에 의해 회전예 사원수 q에 의해 회전하고 그 결과를 다시 에 의해 회전

애니메이션및 게임 실습 31

Page 32: Week04 Rendering Pipeline · 렌더링파이프라인 월드변환 뷰변환 로컬스페이스 월드스페이스 뷰스페이스 후면추려내기 조명 래스터라이즈 뷰포트

월드 변환

4차원 가상원구(Hypersphere)yp p

사원수 q는 물체 위치가 아니라 물체 오리엔테이션을 의미물체 오리엔테이션의 보간

원구면을 따라가면서 사원수를 선택원구면을 따라가면서 사원수를 선택오일러 각에 의해 보간할 경우 그림 (a)와 유사.

오리엔테이션의 변화가 매우 부자연스러움.

애니메이션및 게임 실습 32

Page 33: Week04 Rendering Pipeline · 렌더링파이프라인 월드변환 뷰변환 로컬스페이스 월드스페이스 뷰스페이스 후면추려내기 조명 래스터라이즈 뷰포트

월드 변환

러프(LERP: Linear intERPolation)

애니메이션및 게임 실습 33

Page 34: Week04 Rendering Pipeline · 렌더링파이프라인 월드변환 뷰변환 로컬스페이스 월드스페이스 뷰스페이스 후면추려내기 조명 래스터라이즈 뷰포트

월드 변환

슬러프(SLERP: Spherical Linear intERPolation) p

LERP의 경우 오리엔테이션이 바뀌는 속력이 변화함중심각 θ를 일정하게 증가시키면서 보간

애니메이션및 게임 실습 34

Page 35: Week04 Rendering Pipeline · 렌더링파이프라인 월드변환 뷰변환 로컬스페이스 월드스페이스 뷰스페이스 후면추려내기 조명 래스터라이즈 뷰포트

월드 변환

사원수의 보간

중복성

완전히 동일한 회전을 의미함.

원구 표면을 따라가면서 최단경로를 택했을 때 가장 자연스러움

그림의 경우 q2을 선택그림의 경우 q2을 선택벡터 내적에 의해 선택가능

애니메이션및 게임 실습 35

Page 36: Week04 Rendering Pipeline · 렌더링파이프라인 월드변환 뷰변환 로컬스페이스 월드스페이스 뷰스페이스 후면추려내기 조명 래스터라이즈 뷰포트

월드 변환

사원수를 이용한 회전

D3DQUATERNION *D3DXQ aternionRotationYa PitchRollD3DQUATERNION *D3DXQuaternionRotationYawPitchRoll(

D3DXQUATERNION *pOut,FLOAT yaw,yFLOAT pitch,FLOAT roll

)

D3DXMATRIX *D3DXMatrixRotationQuaternion(

D3DXMATRIX *pOut,CONST D3DXQUATERNION *pQ

)

애니메이션및 게임 실습 36

Page 37: Week04 Rendering Pipeline · 렌더링파이프라인 월드변환 뷰변환 로컬스페이스 월드스페이스 뷰스페이스 후면추려내기 조명 래스터라이즈 뷰포트

월드 변환

예제 : 사원수

애니메이션및 게임 실습 37

Page 38: Week04 Rendering Pipeline · 렌더링파이프라인 월드변환 뷰변환 로컬스페이스 월드스페이스 뷰스페이스 후면추려내기 조명 래스터라이즈 뷰포트

뷰 변환

뷰 변환

장면에서 관찰자의 위치와 방향 기술모니터를 통한 장면열 기준열 기준

카메라 모델

기본 모델

회전 불가능, 일반적인 경우

정교한 카메라 모델

회전 가능, 비행 시뮬레이터, 스페이스 슈터회전 가능, 비행 시뮬레이터, 스페이스 슈터

애니메이션및 게임 실습 38

Page 39: Week04 Rendering Pipeline · 렌더링파이프라인 월드변환 뷰변환 로컬스페이스 월드스페이스 뷰스페이스 후면추려내기 조명 래스터라이즈 뷰포트

뷰 변환

기본 모델

상향(Up)

D3DXMATRIX *D3DXMatrixLookAtLH(

시선(Look)

(D3DXMATRIX *pOut,CONST D3DXVECTOR3 *pEye,CONST D3DXVECTOR3 *pAt,CONST D3DXVECTOR3 *pUp

우향(Right)

CONST D3DXVECTOR3 *pUp)

D3DVECTOR3 position(5.0f, 3.0f, 10.0f);D3DVECTOR3 targetPoint(0.0f, 0.0f, 0.0f);D3DVECTOR3 worldUp(0.0f, 1.0f, 0.0f);D3DVECTOR3 worldUp(0.0f, 1.0f, 0.0f);

D3DXMATRIX V;D3DXMatrixLookAtLH(&V, &position, &targetPoint, &worldUp);

애니메이션및 게임 실습 39

Device->SetTransform(D3DTS_VIEW, &V);

Page 40: Week04 Rendering Pipeline · 렌더링파이프라인 월드변환 뷰변환 로컬스페이스 월드스페이스 뷰스페이스 후면추려내기 조명 래스터라이즈 뷰포트

뷰 변환

예제 : 카메라 회전

애니메이션및 게임 실습 40

Page 41: Week04 Rendering Pipeline · 렌더링파이프라인 월드변환 뷰변환 로컬스페이스 월드스페이스 뷰스페이스 후면추려내기 조명 래스터라이즈 뷰포트

후면 추려내기

Backface Cullingg

후면

전면

후면

전면

관찰점 관찰점

SetRenderState(D3DRS CULLMODE, value);( _ , );

• D3DCULL_NONE : culling 미사용• D3DCULL_CW : 시계방향 두르기• D3DCULL CCW : 반시계방향 두르기

애니메이션및 게임 실습 41

D3DCULL_CCW : 반시계방향 두르기

Page 42: Week04 Rendering Pipeline · 렌더링파이프라인 월드변환 뷰변환 로컬스페이스 월드스페이스 뷰스페이스 후면추려내기 조명 래스터라이즈 뷰포트

후면 추려내기

예제 : 후면 추려내기

애니메이션및 게임 실습 42

Page 43: Week04 Rendering Pipeline · 렌더링파이프라인 월드변환 뷰변환 로컬스페이스 월드스페이스 뷰스페이스 후면추려내기 조명 래스터라이즈 뷰포트

클리핑

시야 볼륨 외부의 기하물체 추리기

완전한 내부완전한 외부완전한 외부부분적 내부 +Z

내부

외부교차

+X

애니메이션및 게임 실습 43

Page 44: Week04 Rendering Pipeline · 렌더링파이프라인 월드변환 뷰변환 로컬스페이스 월드스페이스 뷰스페이스 후면추려내기 조명 래스터라이즈 뷰포트

투영 변환

원근 투영 변환

left

top

rightbottom

zNear

zFar

애니메이션및 게임 실습 44

Page 45: Week04 Rendering Pipeline · 렌더링파이프라인 월드변환 뷰변환 로컬스페이스 월드스페이스 뷰스페이스 후면추려내기 조명 래스터라이즈 뷰포트

투영 변환

원근 투영 변환+Z

D3DXMATRIX *D3DXMatrixPerspectiveFovLH(

D3DXMATRIX *pOut,f FLOAT fovy, // 시야각

FLOAT Aspect, // 종횡비FLOAT zn, // 가까운 사각형까지의 거리FLOAT zf // 먼 사각형까지의 거리

FOV

f

n FLOAT zf // 먼 사각형까지의 거리)

n

+X

D3DXMATRIX proj;D3DXMatrixPerspectiveFovLH(&proj, PI*0.5f, (float)width/(float)height, 1.0f, 1000.0f);Device->SetTrasnform(D3DTS PROJECTION, &proj);

애니메이션및 게임 실습 45

Device SetTrasnform(D3DTS_PROJECTION, &proj);

Page 46: Week04 Rendering Pipeline · 렌더링파이프라인 월드변환 뷰변환 로컬스페이스 월드스페이스 뷰스페이스 후면추려내기 조명 래스터라이즈 뷰포트

뷰포트 변환

뷰포트 변환

최종적으로 각 픽셀에 매핑되는 방법윈도우의 크기, 해상도

typedef struct _D3DVIEWPORT9 {

DWORD x;x,y

DWORD x;DWORD y;DWORD width;DWORD height;

heightg

float minz;float maxz;

} D3DVIEWPORT9;

width

애니메이션및 게임 실습 46

Page 47: Week04 Rendering Pipeline · 렌더링파이프라인 월드변환 뷰변환 로컬스페이스 월드스페이스 뷰스페이스 후면추려내기 조명 래스터라이즈 뷰포트

뷰포트 변환

뷰포트 변환

뷰포트 리셋

HRESULT GetViewport(D3DVIEWPORT9 *pViewport);

뷰포트 설정

HRESULT GetViewport(D3DVIEWPORT9 pViewport);

HRESULT S tVi t(D3DVIEWPORT9 * Vi t)HRESULT SetViewport(D3DVIEWPORT9 *pViewport);

D3DVIEWPORT9 vp = {0, 0, 640, 480, 0, 1};Device->SetViewport(&vp);

애니메이션및 게임 실습 47

Page 48: Week04 Rendering Pipeline · 렌더링파이프라인 월드변환 뷰변환 로컬스페이스 월드스페이스 뷰스페이스 후면추려내기 조명 래스터라이즈 뷰포트

뷰포트 변환

예제 : 뷰포트 변환

애니메이션및 게임 실습 48

Page 49: Week04 Rendering Pipeline · 렌더링파이프라인 월드변환 뷰변환 로컬스페이스 월드스페이스 뷰스페이스 후면추려내기 조명 래스터라이즈 뷰포트

래스터라이즈

래스터라이즈

2D 삼각형

픽셀 칼라 계산픽셀 칼라 계산

깊이 버퍼 계산

Overdrawing

애니메이션및 게임 실습 49

Page 50: Week04 Rendering Pipeline · 렌더링파이프라인 월드변환 뷰변환 로컬스페이스 월드스페이스 뷰스페이스 후면추려내기 조명 래스터라이즈 뷰포트

카메라 제어

카메라 제어

D3DXMatrixLookAtLH를 이용한 변환

고정된 위치에 카메라 이동시 유용고정된 위치에 카메라 이동시 유용사용자 입력에 반응하여 카메라 이동시 불편

1인칭 시점 게임에 유용한 카메라 제어 기술

애니메이션및 게임 실습 50

Page 51: Week04 Rendering Pipeline · 렌더링파이프라인 월드변환 뷰변환 로컬스페이스 월드스페이스 뷰스페이스 후면추려내기 조명 래스터라이즈 뷰포트

카메라 디자인

카메라 벡터

위치벡터 : P

방위 벡터(Orientation Vector)방위 벡터(Orientation Vector)

우향벡터 : R상향벡터 : U전방벡터 : L

정직교(orthonormal)U L

RRP

애니메이션및 게임 실습 51

Page 52: Week04 Rendering Pipeline · 렌더링파이프라인 월드변환 뷰변환 로컬스페이스 월드스페이스 뷰스페이스 후면추려내기 조명 래스터라이즈 뷰포트

카메라 디자인

카메라 동작

우향 벡터를 기준으로 회전(pitch)

상향 벡터를 기준으로 회전(yaw)

전방 벡터를 기준으로 회전(roll)

우향 벡터 방향으로 이동하기우향 벡터 방향으로 이동하기

상향 벡터 방향으로 날기

전방 벡터 방향으로 이동하기

class Camera

애니메이션및 게임 실습 52

Page 53: Week04 Rendering Pipeline · 렌더링파이프라인 월드변환 뷰변환 로컬스페이스 월드스페이스 뷰스페이스 후면추려내기 조명 래스터라이즈 뷰포트

카메라 구현

뷰 행렬 계산하기

)()()()( lllluuuurrrrpppp ====위치 우향 상향 전방

),,( ),,,( ),,,( ),,,( zyxzyxzyxzyx lllluuuurrrrpppp ====

A

BC

BC

C

D

AC

A

D

D

애니메이션및 게임 실습 53

월드스페이스 내의물체와 카메라

시점을 원점으로 이동 z-축과 정렬되도록시점 회전

Page 54: Week04 Rendering Pipeline · 렌더링파이프라인 월드변환 뷰변환 로컬스페이스 월드스페이스 뷰스페이스 후면추려내기 조명 래스터라이즈 뷰포트

카메라 구현

뷰 행렬 계산하기

V : 변환 행렬

pV = (0 0 0) : 행렬 V는 카메라를 원점으로 이동pV = (0,0,0) : 행렬 V는 카메라를 원점으로 이동rV = (1,0,0) : 행렬 V는 우향 벡터를 월드 x축과 정렬uV = (0,1,0) : 행렬 V는 상향 벡터를 월드 y축과 정렬lV = (0,0,1) : 행렬 V는 전방 벡터를 월드 z축과 정렬

V 행렬 구하기

카메라의 위치를 원점으로 이동하는 이동 파트카메라의 위치를 원점으로 이동하는 이동 파트카메라 벡터를 월드의 축과 정렬하는 회전 파트

애니메이션및 게임 실습 54

Page 55: Week04 Rendering Pipeline · 렌더링파이프라인 월드변환 뷰변환 로컬스페이스 월드스페이스 뷰스페이스 후면추려내기 조명 래스터라이즈 뷰포트

카메라 구현

이동

-p

⎥⎤

⎢⎡

00100001

⎥⎥⎥⎥⎥

⎦⎢⎢⎢⎢⎢

⎣ −−−

=

101000010

zyx ppp

T

⎥⎦⎢⎣ zyx ppp

애니메이션및 게임 실습 55

Page 56: Week04 Rendering Pipeline · 렌더링파이프라인 월드변환 뷰변환 로컬스페이스 월드스페이스 뷰스페이스 후면추려내기 조명 래스터라이즈 뷰포트

카메라 구현

회전

우향 : 월드의 x상향 : 월드의 y전방 : 월드의 z전방 : 월드의 z

위 조건을 만족하는 A 행렬

애니메이션및 게임 실습 56

Page 57: Week04 Rendering Pipeline · 렌더링파이프라인 월드변환 뷰변환 로컬스페이스 월드스페이스 뷰스페이스 후면추려내기 조명 래스터라이즈 뷰포트

카메라 구현

회전

[ ]020100⎥⎤

⎢⎡ aaa

[ ] [ ]0,0,1,,

222120

121110 =⎥⎥⎥

⎦⎢⎢⎢

=aaaaaarrrrA zyx

[ ] [ ]0,1,0,, 121110

020100

=⎥⎥⎥

⎢⎢⎢

⎡= aaa

aaauuuuA zyx

[ ]020100⎥⎤

⎢⎡ aaa

222120 ⎥⎦⎢⎣ aaa

[ ] [ ]1,0,0,,

222120

121110 =⎥⎥⎥

⎦⎢⎢⎢

=aaaaaallllA zyx

애니메이션및 게임 실습 57

Page 58: Week04 Rendering Pipeline · 렌더링파이프라인 월드변환 뷰변환 로컬스페이스 월드스페이스 뷰스페이스 후면추려내기 조명 래스터라이즈 뷰포트

카메라 구현

회전

⎤⎡⎤⎡⎤⎡ 001

⎥⎥⎥

⎢⎢⎢

⎡=

⎥⎥⎥

⎢⎢⎢

⎥⎥⎥

⎢⎢⎢

=100010001

222120

121110

020100

aaaaaaaaa

llluuurrr

BA

zyx

zyx

zyx

⎦⎣⎦⎣⎦⎣ 222120zyx

IBBBA == −1

⎥⎥⎤

⎢⎢⎡

===−yyy

xxxT lur

lurABB 1

⎥⎥⎦⎢

⎢⎣ zzz

yyy

lurlu

애니메이션및 게임 실습 58

Page 59: Week04 Rendering Pipeline · 렌더링파이프라인 월드변환 뷰변환 로컬스페이스 월드스페이스 뷰스페이스 후면추려내기 조명 래스터라이즈 뷰포트

카메라 구현

이동과 회전 조합

void Camera::getViewMatrix()

lurlur xxxxxx⎥⎤

⎢⎡

⎥⎤

⎢⎡⎥⎤

⎢⎡ 000001

V

llurlur

lurlur

TAzzz

yyy

xxx

zzz

yyy

xxx

=

⎥⎥⎥⎥

⎢⎢⎢⎢

=

⎥⎥⎥⎥

⎢⎢⎢⎢

⎥⎥⎥⎥⎥

⎦⎢⎢⎢⎢⎢

=

100

100000

101000010

lpuprpppp zyx⎥⎦

⎢⎣ ⋅−⋅−⋅−⎥

⎦⎢⎣⎥⎥⎦⎢

⎢⎣ −−− 110001

애니메이션및 게임 실습 59

Page 60: Week04 Rendering Pipeline · 렌더링파이프라인 월드변환 뷰변환 로컬스페이스 월드스페이스 뷰스페이스 후면추려내기 조명 래스터라이즈 뷰포트

카메라 구현

임의의 축으로 회전하기

D3DXMATRIX *D3DXMatrixRotationAxis(

D3DXMATRIX *pOut, // 회전 행렬

CONST D3DXVECTOR3 *pV, // 회전 기준 축p ,

FLOAT Angle // 회전 각도(라디안)

)

D3DXMATRIX R;

D3DXVECTOR3 axis(0.707f, 0.707f, 0.0f);

D3DXMatrixRotationAxis(&R, &axis, D3DX_PI/2.0f);

애니메이션및 게임 실습 60

Page 61: Week04 Rendering Pipeline · 렌더링파이프라인 월드변환 뷰변환 로컬스페이스 월드스페이스 뷰스페이스 후면추려내기 조명 래스터라이즈 뷰포트

카메라 구현

Pitch

void Camera::pitch(float angle){

D3DXMATRIX T;D3DXMatrixRotationAxis(&T, &_right, angle);

// _right를 기준으로 _up과 _look을 회전

D3DXVec3TransformCoord(&_up, &_up, &T);D3DXVec3TransformCoord(&_look, &_look, &T);

}

애니메이션및 게임 실습 61

Page 62: Week04 Rendering Pipeline · 렌더링파이프라인 월드변환 뷰변환 로컬스페이스 월드스페이스 뷰스페이스 후면추려내기 조명 래스터라이즈 뷰포트

카메라 구현

Yaw

void Camera::yaw(float angle){

D3DXMATRIX T;// 지상의 물체에 대해서는 월드 y를 기준으로 회전

if(_cameraType == LANDOBJECT)D3DXMatrixRotationY(&T, angle);

// 비행 물체에 대해서는 원래의 상향 벡터를 기준으로로 회전

if(_cameraType == AIRCRAFT)D3DXMatrixRotationAxis(&T, &_up, angle);

D3DXVec3TransformCoord(&_right &_right, &T);D3DXVec3TransformCoord(&_look, &_look, &T);

}

애니메이션및 게임 실습 62

}

Page 63: Week04 Rendering Pipeline · 렌더링파이프라인 월드변환 뷰변환 로컬스페이스 월드스페이스 뷰스페이스 후면추려내기 조명 래스터라이즈 뷰포트

카메라 구현

Roll

void Camera::roll(float angle){

// 비행 타입일 경우에만 회전

if(_cameraType == AIRCRAFT){

D3DXMATRIX T;D3DXMatrixRotationAxis(&T, &_look, angle);

D3DXVec3TransformCoord(&_right &_right, &T);D3DXVec3TransformCoord(&_up, &_up, &T);( _ p _ p )

}}

애니메이션및 게임 실습 63

Page 64: Week04 Rendering Pipeline · 렌더링파이프라인 월드변환 뷰변환 로컬스페이스 월드스페이스 뷰스페이스 후면추려내기 조명 래스터라이즈 뷰포트

카메라 구현

걷기

void Camera::walk(float units){{

if(units==0)return;

// 지상의 물체는 xz 평면으로 움직임을 제한// 지상의 물체는 xz 평면으로 움직임을 제한

if(_cameraType==LADOBJECT){

D3DXVECTOR3 dir;D3DXVECTOR3 dir;D3DXVec3Cross(&dir, &_right, &WORLD_UP);_pos += D3DXVECTOR3(dir.x, 0.0f, dir.z) * units;

}}if(_cameraType == AIRCRAFT)

_pos += _look*units;}

애니메이션및 게임 실습 64

}

Page 65: Week04 Rendering Pipeline · 렌더링파이프라인 월드변환 뷰변환 로컬스페이스 월드스페이스 뷰스페이스 후면추려내기 조명 래스터라이즈 뷰포트

카메라 구현

옆걸음질

void Camera::strafe(float units){{

// 지상의 물체는 xz 평면으로 움직임 제한

if(_cameraType == LANDOBJECT)pos += D3DXVECTOR3( right x 0 0f right z) * units;_pos += D3DXVECTOR3(_right.x, 0.0f, _right.z) * units;

if(_cameraType == AIRCRAFT)_pos += _right * units;

}}

애니메이션및 게임 실습 65

Page 66: Week04 Rendering Pipeline · 렌더링파이프라인 월드변환 뷰변환 로컬스페이스 월드스페이스 뷰스페이스 후면추려내기 조명 래스터라이즈 뷰포트

카메라 구현

날기

void Camera::fly(float units){{

// 비행물체에만 적용

if(_cameraType == AIRCRAFT)pos += up * units;_pos += _up * units;

}

애니메이션및 게임 실습 66

Page 67: Week04 Rendering Pipeline · 렌더링파이프라인 월드변환 뷰변환 로컬스페이스 월드스페이스 뷰스페이스 후면추려내기 조명 래스터라이즈 뷰포트

카메라

예제

애니메이션및 게임 실습 67

Page 68: Week04 Rendering Pipeline · 렌더링파이프라인 월드변환 뷰변환 로컬스페이스 월드스페이스 뷰스페이스 후면추려내기 조명 래스터라이즈 뷰포트

Question?Question?Question?Question?

애니메이션및 게임 실습 68