Rendering Pipeline
목 차 Rendering Pipeline 월드변환 뷰변환 후면추려내기 클리핑 투영변환 뷰포트변환 래스터라이즈 카메라제어 카메라디자인 카메라구현 뷰행렬계산 임의의축으로회전 Pitch, Yaw, Roll 걷기, 옆걸음질, 날기 애니메이션및게임실습 2
렌더링파이프라인 월드변환 뷰변환 로컬스페이스월드스페이스뷰스페이스후면추려내기조명 뷰포트변환 투영변환 래스터라이즈 뷰포트 투영 클리핑 애니메이션및게임실습 3
월드변환 로컬스페이스 -> 월드스페이스 위치, 크기, 방위를포함하는각물체간의관계를정의 z z z y y y 애니메이션및게임실습 4
월드변환 변환의연속 = 1 1 1 y y yz yy y z y y y L L L S S S R R R R R R R R R T T T W W W 1 1 1 1 1 1 z z zz zy z z z L S R R R T W 월드좌표계평행이동회전확대축소로컬좌표계좌표계좌표계애니메이션및게임실습 5
월드변환 변환의연속 변환의설정 D3DXMATRIX mattrans, matrotx, matroty; matworld = mattrans * matrotx * matroty; D3DXMATRIX *D3DXMatriMultiply ( 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
월드변환 행렬의곱은교환법칙이성립하지않음. z z 회전 -> 이동 이동 -> 회전 애니메이션및게임실습 7
월드변환 크기변환 S S S = y S z D3DXMATRIX *D3DXMatriScaling ( D3DXMATRIX *pout, FLOAT s, FLOAT sy, FLOAT sz ) 애니메이션및게임실습 8
월드변환 이동 T 1 1 = 1 T Ty Tz 1 D3DXMATRIX *D3DXMatriTranslation ( D3DXMATRIX *pout, FLOAT, FLOAT y, FLOAT z ) 애니메이션및게임실습 9
월드변환 축에의한회전 R R y D3DXMATRIX *D3DXMatriRotationX 1 ( D3DXMATRIX *pout, cosθ sinθ FLOAT angle ) ( θ ) = sinθ cosθ cosθ sinθ ( θ ) = 1 sinθ cosθ cosθ sinθ ( θ ) = sinθ cosθ 1 R ( z D3DXMATRIX *D3DXMatriRotationY ( D3DXMATRIX *pout, FLOAT angle ) D3DXMATRIX *D3DXMatriRotationZ ) D3DXMATRIX *pout, FLOAT angle 애니메이션및게임실습 1
월드변환 임의의축을중심으로하는회전 D3DXMATRIX *D3DXMatriRotationAis ( D3DXMATRIX *pout, CONST D3DXVECTOR3 *pv, FLOAT Angle ) 애니메이션및게임실습 11
월드변환 Eample D3DXMATRIX cubeworldmatri; D3DXMatriTranslation(&cubeWorldMatri, i bw ldm i -3.f, 3f 2.f, 2f 6.f); 6f) D3DXMATRIX sphereworldmatri; D3DXMatriTranslation(&sphereWorldMatri, 5.f,.f, -2.f); Device->SetTransform(D3DTS_WORLD, &cubeworldmatri); drawcube(); Device->SetTransform(D3DTS_WORLD, &sphereworldmatri); drawsphere(); 애니메이션및게임실습 12
월드변환 예제 : 회전및이동 애니메이션및게임실습 13
월드변환 방위벡터 시선벡터 : 물체가향하고있는방향, z축 상향벡터 : 물체의 y축, 뒤집힘방지 우향벡터 : 물체의뒤집힘방지, 회전 상향 (Up) 시선 (Look) 우향 (Right) 애니메이션및게임실습 14
월드변환 오일러각에의한회전 y yaw pitch D3DXMATRIX *D3DXMatriRotationYawPitchRoll ( D3DXMATRIX *pout, FLOAT yaw, FLOAT pitch, FLOAT roll ) z roll 애니메이션및게임실습 15
월드변환 회전 D3DXMATRIX *D3DXVec3TransformCoord ( 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(&vRight, &vright, &matroll); D3DXVec3TransformCoord(&vUp, &vup, &matroll); 애니메이션및게임실습 16
월드변환 벡터의정규화 시선벡터정규화 우향벡터 : 시선벡터와상향벡터의외적 우향벡터정규화 상향벡터 : 시선벡터와우향벡터의외적 상향벡터정규화 D3DXVec3Normalize(&vLook, &vlook); D3DXVec3Cross(&vRight, &vup, &vlook); D3DXVec3Normalize(&vRight, &vright); D3DXVec3Cross(&vUp, &vlook, &vright); D3DXVec3Normalize(&vUp, &vup); 애니메이션및게임실습 17
월드변환 벡터의정규화 D3DXVECTOR3 *D3DXVec3Normalize ( D3DXVECTOR3 *pout, CONST D3DXVECTOR3 *v ) 벡터의외적 D3DXVECTOR3* D3DXVec3Cross3C ( D3DXVECTOR3* pout, CONST D3DXVECTOR3* v1, CONST D3DXVECTOR3* v2 ) 애니메이션및게임실습 18
월드변환 예제 : 오일러각에의한회전 애니메이션및게임실습 19
월드변환 오일러각에의한회전 항상현시점에서의모델좌표계를기준으로회전 회전의결과좌표축방향이바뀐다는점에유의 처음 z 축기준회전결과모델좌표계의, y 축방향이이전과는달라짐 회전을적용하는순서가중요함. 교환법칙이성립하지않음 애니메이션및게임실습 2
월드변환 단점 1. 복합변환의결과를예측하기어려움. 오리엔테이션을보간하기위해서오일러각자체를보간 오일러각 (1, 2, 3) 에의해회전하고회전결과를기준으로 (4, 5, 6) 에의해회전하면, 원래물체를 (5, 7, 9) 에의해회전한것과는다름. 첫번째회전결과좌표축방향이변해버리기때문 애니메이션및게임실습 21
월드변환 단점 2. 김벌락 (Gimbal Lock) 현상 축기준으로그림에표시된방향으로일정각도를회전. 이어서 z 축을기준으로 9 도회전하면 축과 y 축이나란해짐 현재상태에서 y 축을기준으로회전을가하면이전에 축기준으로이미회전한각도에영향을미침. 회전결과, y, z 축이독립성을잃을수있음 애니메이션및게임실습 22
월드변환 단점 3: 오리엔테이션이변하는경로가유일하지않음 y 축을기준 18 도회전 z 축을기준으로 18 도회전 + 축을기준으로 18 도회전 회전각을직접적으로보간해서는오리엔테이션이변하는경로를예측하기어려움. 애니메이션및게임실습 23
월드변환 회전축과회전각을사용 : 회전축은단위벡터로나타냄 애니메이션및게임실습 24
월드변환 사원수 (Quaternion) William Rowan Hamilton : 1843, 복소수의확장 Ken Shoemake : 1985, SIGGRAPH 이용 골격체애니메이션 (Skeletal Animation) 역기구학 (Inverse Kinematics) 3D 물리학 장점 행렬보다적은공간차지 보간 (Interpolation) 에좋음 애니메이션및게임실습 25
월드변환 사원수 (Quaternion) 축 - 각표현을수학적으로개선 축관련변수 3 개와회전각관련변수 1 개를하나의 4 차원변수로 w = 스칼라부 (Scalar Part) 또는실수부 (Real Part) v = 벡터부 (Vector Part) 또는허수부 (Imaginary Part) 단위 4 원수 : 벡터의길이 ( 노름, Norm) = 1 단위사원수 (Unit Quaternion) 만이회전에사용됨. 애니메이션및게임실습 26
월드변환 사원수 (Quaternion) 축각표현과의관계 애니메이션및게임실습 27
월드변환 사원수연산 단위사원수노름값은 1 이므로공액사원수자체가역사원수 애니메이션및게임실습 28
월드변환 사원수 (Quaternion) 애니메이션및게임실습 29
월드변환 사원수 (Quaternion) 공액곱셈 (Conjugate Product) 사원수 q를사용하여실제로회전을가하는작업 원점으로부터물체위의점 p를향한벡터 P P 앞쪽에 q 를곱하고뒤쪽에 q 의공액사원수를곱하여계산 P는 3차원벡터. 이를사원수로만들려면스칼라부분인 w를 으로 애니메이션및게임실습 3
월드변환 사원수에의한보간 사원수 q 1,q 2 에의해연속적으로회전하였다면그결과는원래의물체에대해사원수 q 1 *q 2 으로회전한것과동일 예: 사원수 q 에의해회전하고그결과를다시에의해회전 애니메이션및게임실습 31
월드변환 4차원가상원구 (Hypersphere) p 사원수 q는물체위치가아니라물체오리엔테이션을의미 물체오리엔테이션의보간 원구면을따라가면서사원수를선택 오일러각에의해보간할경우그림 (a) 와유사. 오리엔테이션의변화가매우부자연스러움. 애니메이션및게임실습 32
월드변환 러프 (LERP: Linear interpolation) 애니메이션및게임실습 33
월드변환 슬러프 (SLERP: Spherical Linear interpolation) LERP 의경우오리엔테이션이바뀌는속력이변화함 중심각 θ 를일정하게증가시키면서보간 애니메이션및게임실습 34
월드변환 사원수의보간 중복성 완전히동일한회전을의미함. 원구표면을따라가면서최단경로를택했을때가장자연스러움 그림의경우 q2 을선택 벡터내적에의해선택가능 애니메이션및게임실습 35
월드변환 사원수를이용한회전 D3DQUATERNION *D3DXQuaternionRotationYawPitchRoll ( D3DXQUATERNION *pout, FLOAT yaw, FLOAT pitch, FLOAT roll ) D3DXMATRIX *D3DXMatriRotationQuaternion ( D3DXMATRIX *pout, CONST D3DXQUATERNION *pq ) 애니메이션및게임실습 36
월드변환 예제 : 사원수 애니메이션및게임실습 37
뷰변환 뷰변환 장면에서관찰자의위치와방향기술 모니터를통한장면 열기준 카메라모델 기본모델 회전불가능, 일반적인경우 정교한카메라모델 회전가능, 비행시뮬레이터, 스페이스슈터 애니메이션및게임실습 38
뷰변환 기본모델 상향 (Up) 시선 (Look) D3DXMATRIX *D3DXMatriLookAtLH( D3DXMATRIX *pout, CONST D3DXVECTOR3 *peye, CONST D3DXVECTOR3 *pat, CONST D3DXVECTOR3 *pup ) 우향 (Right) D3DVECTOR3 position(5.f, 3.f, 1.f); D3DVECTOR3 targetpoint(.f,.f,.f); D3DVECTOR3 worldup(.f, 1.f,.f); D3DXMATRIX V; D3DXMatriLookAtLH(&V, &position, &targetpoint, &worldup); Device->SetTransform(D3DTS_VIEW, &V); 애니메이션및게임실습 39
뷰변환 예제 : 카메라회전 애니메이션및게임실습 4
후면추려내기 Backface Culling 후면 전면 관찰점 관찰점 SetRenderState(D3DRS _ CULLMODE, value); D3DCULL_NONE : culling 미사용 D3DCULL_CW : 시계방향두르기 D3DCULL_CCW CCW : 반시계방향두르기 애니메이션및게임실습 41
후면추려내기 예제 : 후면추려내기 애니메이션및게임실습 42
클리핑 시야볼륨외부의기하물체추리기 완전한내부 완전한외부 부분적내부 +Z 내부 외부 교차 +X 애니메이션및게임실습 43
투영변환 원근투영변환 left top bottom znear zfar right 애니메이션및게임실습 44
투영변환 원근투영변환 +Z f D3DXMATRIX *D3DXMatriPerspectiveFovLH ( D3DXMATRIX *pout, FLOAT fovy, // 시야각 FLOAT Aspect, // 종횡비 FOV FLOAT zn, // 가까운사각형까지의거리 n FLOAT zf // 먼사각형까지의거리 ) +X D3DXMATRIX proj; D3DXMatriPerspectiveFovLH(&proj, PI*.5f, (float)width/(float)height, 1.f, 1.f); Device->SetTrasnform(D3DTS SetTrasnform(D3DTS_PROJECTION, &proj); 애니메이션및게임실습 45
뷰포트변환 뷰포트변환 최종적으로각픽셀에매핑되는방법 윈도우의크기, 해상도 typedef struct _D3DVIEWPORT9 { DWORD ; DWORD y; DWORD width; DWORD height; float minz; float maz; } D3DVIEWPORT9;,y width height 애니메이션및게임실습 46
뷰포트변환 뷰포트변환 뷰포트리셋 HRESULT GetViewport(D3DVIEWPORT9 *pviewport); 뷰포트설정 HRESULT SetViewport(D3DVIEWPORT9 t(d3dviewport9 *pviewport); D3DVIEWPORT9 vp = {,, 64, 48,, 1}; Device->SetViewport(&vp); 애니메이션및게임실습 47
뷰포트변환 예제 : 뷰포트변환 애니메이션및게임실습 48
래스터라이즈 래스터라이즈 2D 삼각형 픽셀칼라계산 깊이버퍼계산 Overdrawing 애니메이션및게임실습 49
카메라제어 카메라제어 D3DXMatriLookAtLH 를이용한변환 고정된위치에카메라이동시유용 사용자입력에반응하여카메라이동시불편 1 인칭시점게임에유용한카메라제어기술 애니메이션및게임실습 5
카메라디자인 카메라벡터 위치벡터 : P 방위벡터 (Orientation Vector) 우향벡터 : R 상향벡터 : U 전방벡터 : L 정직교 (orthonormal) U P L R 애니메이션및게임실습 51
카메라디자인 카메라동작 우향벡터를기준으로회전 (pitch) 상향벡터를기준으로회전 (yaw) 전방벡터를기준으로회전 (roll) 우향벡터방향으로이동하기 상향벡터방향으로날기 전방벡터방향으로이동하기 class Camera 애니메이션및게임실습 52
카메라구현 뷰행렬계산하기 ) ( ) ( ) ( ) ( l l l l u u u u r r r r p p p p = = = = 위치우향상향전방 ),, ( ),,, ( ),,, ( ),,, ( z y z y z y z y l l l l u u u u r r r r p p p p = = = = A B C B C C D A C A D D 애니메이션및게임실습 53 월드스페이스내의물체와카메라시점을원점으로이동 z- 축과정렬되도록시점회전
카메라구현 뷰행렬계산하기 V : 변환행렬 pv=(): (,,) 행렬 V 는카메라를원점으로이동 rv = (1,,) : 행렬 V는우향벡터를월드 축과정렬 uv = (,1,) : 행렬 V는상향벡터를월드 y축과정렬 lv = (,,1) : 행렬 V는전방벡터를월드 z축과정렬 V 행렬구하기 카메라의위치를원점으로이동하는이동파트 카메라벡터를월드의축과정렬하는회전파트 애니메이션및게임실습 54
카메라구현 이동 -p 1 1 = 1 1 1 z y p p p T z y p p p 애니메이션및게임실습 55
카메라구현 회전 우향 : 월드의 상향 : 월드의 y 전방 : 월드의 z 위조건을만족하는 A 행렬 애니메이션및게임실습 56
카메라구현 회전 ra = a a 1 2 [ r,, ] ry rz a1 a11 a12 = [ 1,, ] a a a a ua =, y z 1 11 a12 a 2 a21 a22 2 a 21 1 2 [ u u, u ] a a = [, 1, ] a a 22 la = a a 1 2 [ l,, ] ly lz a1 a11 a12 = [,, 1] a 2 a 21 a a 22 애니메이션및게임실습 57
카메라구현 회전 1 = = 1 1 1 22 21 2 12 11 1 2 1 a a a a a a a a a l l l u u u r r r BA z y z y z y 22 21 2 z y I BB BA = = 1 = = = y y y T l u r l u r A B B 1 z z z y y y l u r l u 애니메이션및게임실습 58
카메라구현 이동과회전조합 void Camera::getViewMatri() l u r l u r 1 V l l u r l u r l u r l u r TA z z z y y y z z z y y y = = = 1 1 1 1 1 l p u p r p p p p z y 1 1 1 애니메이션및게임실습 59
카메라구현 임의의축으로회전하기 D3DXMATRIX *D3DXMatriRotationAis( D3DXMATRIX *pout, // 회전행렬 CONST D3DXVECTOR3 *pv, // 회전기준축 FLOAT Angle // 회전각도 ( 라디안 ) ) D3DXMATRIX R; D3DXVECTOR3 ais(.77f,.77f,.f); D3DXMatriRotationAis(&R, &ais, D3DX_PI/2.f); 애니메이션및게임실습 6
카메라구현 Pitch void Camera::pitch(float angle) { D3DXMATRIX T; D3DXMatriRotationAis(&T, &_right, angle); } // _right를기준으로 _up과 _look을회전 D3DXVec3TransformCoord(&_up, &_up, &T); D3DXVec3TransformCoord(&_look, &_look, &T); 애니메이션및게임실습 61
카메라구현 Yaw void Camera::yaw(float angle) { D3DXMATRIX T; // 지상의물체에대해서는월드 y를기준으로회전 if(_cameratype == LANDOBJECT) D3DXMatriRotationY(&T, angle); // 비행물체에대해서는원래의상향벡터를기준으로로회전 if(_cameratype == AIRCRAFT) D3DXMatriRotationAis(&T, &_up, angle); } D3DXVec3TransformCoord(&_right &_right, &T); D3DXVec3TransformCoord(&_look, &_look, &T); 애니메이션및게임실습 62
카메라구현 Roll void Camera::roll(float angle) { // 비행타입일경우에만회전 if(_cameratype == AIRCRAFT) { D3DXMATRIX T; D3DXMatriRotationAis(&T, &_look, angle); } } D3DXVec3TransformCoord(&_right &_right, &T); D3DXVec3TransformCoord(&_up, &_up, &T); 애니메이션및게임실습 63
카메라구현 걷기 void Camera::walk(float units) { } if(units==) return; // 지상의물체는 z 평면으로움직임을제한 if(_cameratype==ladobject) { D3DXVECTOR3 dir; D3DXVec3Cross(&dir, &_right, &WORLD_UP); _pos += D3DXVECTOR3(dir.,.f, dir.z) * units; } if(_cameratype == AIRCRAFT) _pos += _look*units; 애니메이션및게임실습 64
카메라구현 옆걸음질 void Camera::strafe(float units) { // 지상의물체는 z 평면으로움직임제한 if(_cameratype == LANDOBJECT) _pos += D3DXVECTOR3(_right., f.f, _right.z) * units; if(_cameratype == AIRCRAFT) _pos += _right * units; } 애니메이션및게임실습 65
카메라구현 날기 void Camera::fly(float units) { } // 비행물체에만적용 if(_cameratype == AIRCRAFT) _pos += _up * units; 애니메이션및게임실습 66
카메라 예제 애니메이션및게임실습 67
Question? 애니메이션및게임실습 68