2장 렌더링 파이프라인 목표 Direct3D에서 3D 물체를 표현하는 방법을 배운다. 가상카메라를 모델링하는 방법을 배운다. 렌더링 파이프라인을 이해한다. 2009-1학기 컴퓨터게임(DirectX)
메쉬 삼각형은 모델링하는 물체의 기본적인 구성 성분 모델 표현 장면(scene)은 물체나 모델의 모음 물체는 삼각형의 메쉬의 묘사로 이루어짐 메쉬 삼각형은 모델링하는 물체의 기본적인 구성 성분 다각형(polygon), 기본형(primitive), 메쉬 기하물체로 참조하기도 함. 점, 선은 물체 모델링에는 유용하지 않음. 2009-1학기 컴퓨터게임(DirectX)
다각형에서 두 변이 만나는 지점을 버텍스(꼭지점)라 함 버텍스 포맷 위에서 설명한 버텍스의 정의는 Direct3D에서는 불완전함 Direct3D는 공간적 위치 이외에 부가적인 특성으로 이루어짐 예를 들어 법선 특성이나 색상 특성 변 버텍스 2009-1학기 컴퓨터게임(DirectX)
커스텀 버텍스 포맷을 만들기 먼저 우리가 선택한 버텍스 데이터를 포함할 구조체를 만들어야 함 먼저 우리가 선택한 버텍스 데이터를 포함할 구조체를 만들어야 함 struct ColorVertex { float _x, _y, _z; // 위치 DWORD _color; }; struct NormalTexVertex{ float _x, _y, _z; // 위치 float _nx, _ny, _nz; // 법선 float _u, _v; //텍스처 2009-1학기 컴퓨터게임(DirectX)
버텍스 구조체에 정의된 데이터의 순서와 FVF의 정의된 순서는 반드시 일치해야 한다. 버텍스 구조체를 완성한 후에는 유연한 버텍스 포맷(FVF: flexible vertex format) 플래그 조합을 이용해 버텍스가 포맷팅 되는 법 지정 #define FVF_COLOR (D3DFVF_XYZ | D3DFVF_DIFFUSE) #define FVF_NOMAL_TEX (D3DFVF_XYZ | D3DFVF_NOMAL | D3DFVF_TEX1) 버텍스 구조체에 정의된 데이터의 순서와 FVF의 정의된 순서는 반드시 일치해야 한다. 2009-1학기 컴퓨터게임(DirectX)
삼 각 형 삼각형은 3D 물체의 기본 구성 요소 물체를 구성하기 위해서는 물체의 모양과 외형을 묘사하는 삼각형 리스트를 만들어야 함 예를 들어 사각형을 만들기 위해서는 두 개의 삼각형으로 나누고 각각의 삼각형을 구성하는 버텍스 지정해야 함 2009-1학기 컴퓨터게임(DirectX)
삼각형 버텍스를 지정하는 순서는 매우 중요하며 이를 두르기 순서(winding order)라고 부른다 Vertex rect[6] = {v0, v1, v2, // triangle0 V0, v2, v3}; // triangle1 삼각형 버텍스를 지정하는 순서는 매우 중요하며 이를 두르기 순서(winding order)라고 부른다 V1 V2 V0 V3 2009-1학기 컴퓨터게임(DirectX)
인 덱 스 3D 물체를 구성하는 삼각형들은 동일한 버텍스들을 공유하는 경우가 많다. 먼저 버텍스 리스트와 인덱스 리스트 구성 이 문제를 해결하기 위해 인덱스 개념 사용 먼저 버텍스 리스트와 인덱스 리스트 구성 버텍스 리스트는 모든 버텍스들을 포함 인덱스 리스트는 삼각형을 구성하기 위한 버텍스 리스트로의 인덱스값 포함 사각형을 예제로 한 인덱스 표현 Vertex vertextList[4] = {v0, v1, v2, v3}; WORD indexList[6] = {0, 1, 2, 0, 2, 3}; 2009-1학기 컴퓨터게임(DirectX)
가상 카메라 카메라는 관찰자가 볼 수 있는 세계의 부분을 지정하는 것 2D 이미지를 생성하기 위해 세계의 어떤 부분이 필요한지 결정 세계 내에 보여질 공간의 부피를 정의 2009-1학기 컴퓨터게임(DirectX)
(그림2.6) 카메라가 볼 수 있는 공간의 부피를 정의하는 절두체 먼 평면 수평 시야각 h 가까운 평면 투영 윈도우 : Direct3D는 z = 1과 일치하도록 정의 수직 시야각 v 투영의 중심 2009-1학기 컴퓨터게임(DirectX)
공간의 부피는 절두체(frustum) 이며 시야각과 가까운 평면, 먼 평면에 의해 정의 투영 윈도우는 3D 장면의 2D 표현을 만드는 데 이용될 절두체 내부에 있는 3D 기하의 2D 영역 투영윈도우는 min = (-1, -1), max= (1, 1) 로 정의 Direct3D는 투영 평면이 평면 z = 1이 되도록 정의 2009-1학기 컴퓨터게임(DirectX)
렌더링 파이프라인 가상 카메라를 설정한 뒤에는 모니터에 2D 표현을 만들어 내는 과정을 수행해야 함 이와 같은 과정을 렌더링 파이프라인이라 한다. 로컬 스페이스 월드 스페이스 뷰 스페이스 후면 추려내기 조 명 클 리 핑 투 영 뷰 포 트 레스터라이즈 2009-1학기 컴퓨터게임(DirectX)
파이프라인 내에서의 몇 가지 단계에 의해 하나의 좌표 시스템에서 다른 시스템으로 기하 물체를 변환하는 과정 이루어짐 변환에는 행렬이 이용됨(Direct3D가 직접 함) Direct3D변환을 이용하기 위해서는 행렬을 지정 IDirect3DDeviece->SetTransform 메서드 이용해 행렬을 전달 Device->SetTransform(D3DTS_WORLD, &worldMatrix) 예) 변환타입을 설명하는 인자와, 변환을 표현하는 행렬을 인자로 받음. 월드 스페이스로 가는 행렬 2009-1학기 컴퓨터게임(DirectX)
자체의 로컬 좌표 시스템을 이용하는 것이 월드에서 직접 모델을 구성하는 것 보다 쉽다. 로컬 스페이스 모델링 스페이스라고도 불림 자체의 로컬 좌표 시스템을 이용하는 것이 월드에서 직접 모델을 구성하는 것 보다 쉽다. y z x 자체의 좌표 시스템을 이용해 정의된 육면체 2009-1학기 컴퓨터게임(DirectX)
자체의 로컬 좌표 시스템 내에 다수의 모델을 구성한 다음 이를 월드 좌표 시스템으로 옮겨 하나의 장면을 구성해야 함 월드 스페이스 자체의 로컬 좌표 시스템 내에 다수의 모델을 구성한 다음 이를 월드 좌표 시스템으로 옮겨 하나의 장면을 구성해야 함 로컬 스페이스의 물체들은 이동, 회전, 크기 변형 등을 포함하는 월드 변환 작업을 거쳐 옮겨짐 월드 변환은 위치, 크기, 방위를 포함하는 각 물체 간의 관계를 정의함으로써 이루어짐 2009-1학기 컴퓨터게임(DirectX)
여러 개의 3D 물체들이 하나의 월드 좌표 시스템 내에서 서로 연결 2009-1학기 컴퓨터게임(DirectX)
변환타입에 D3DTS_WORLD 지정, IDirect3DDevice9::SetTransform 메서드를 호출하여 수행 월드 변환은 하나의 행렬로 표현 변환타입에 D3DTS_WORLD 지정, IDirect3DDevice9::SetTransform 메서드를 호출하여 수행 예제: 포인트(-3, 2, 6) 위치에 입방체를 배치하고, 포인트 (5, 0, -2)에 구체를 배치하는 코드 // 하나의 이동을 포함하는 입방체 월드 행렬을 만든다. D3DXMATRIX cubeWorldMatrix; D3DMatrixTranslation (&cubeWorldMatrix, -3.0f, 2.0f, 6.0f); 2009-1학기 컴퓨터게임(DirectX)
// 하나의 이동을 포함하는 구체 월드 행렬 만듬 D3DXMATRIX sphereWorldMatrix; D3DMatrixTranslation (&sphereWorldMatrix, 5.0f, 0.0f, 2.0f); Device->SetTransform(D3DTS_WORLD, &cubeWorldMatrix); drawCube(); // 입방체를 그린다. Device->SetTransform(D3DTS_WORLD, &sphereWorldMatrix); drawSphere(); // 구체를 그린다. 2009-1학기 컴퓨터게임(DirectX)
뷰 스페이스 월드 스페이스 내에서 기하 물체와 카메라는 월드 좌표 시스템과 연계되어 정의된다. 작업의 수월함을 위해 카메라를 월드 시스템의 원점으로 변환 카메라가 양의 Z축을 내려다 보도록 회전 왼손좌표계 이때 카메라에 맞추어 월드 내의 모든 기하물체 변환해야 함 이와 같은 변환을 뷰 스페이스 변환이라 한다. 2009-1학기 컴퓨터게임(DirectX)
Z-축에 맞도록 관찰점을 회전, 물체도 함께 회전 A B C D A B C D A B C D 월드 스페이스 내의 물체와 카메라 관찰점을 원점으로 변환, 물체도 함께 회전 Z-축에 맞도록 관찰점을 회전, 물체도 함께 회전 2009-1학기 컴퓨터게임(DirectX)
뷰 스페이스 변환 행렬은 다음의 D3DX 함수를 통해 계산 D3DXMATRIX *D3DMatrixLookAtLH( D3DXMATRIX* pOut, // 결과 행렬을 받을 포인터 Const D3DXVECTOR3 * pEye, // 월드 내의 카메라 위치 CONST D3DXVECTR3 * pAt, // 월드 내의 카메라가 보는 지점 CONST D3DXVECTOR3 * pUp // 월드의 업 벡터(0, 1, 0); ); pEye 는 월드 내의 원하는 카메라 위치 지정 pAt : 월드 내의 카메라가 조준하기를 원하는 지점 지정 pUp : 3D월드 내의 “위쪽” 방향을 가리키는 백터를 지정 2009-1학기 컴퓨터게임(DirectX)
예제 카메라가 포인트 (5, 3, -10)에 위치하고 월드의 중앙 (0, 0, 0)을 바라보기 원하는 경우의 뷰 변환 행렬 D3DXVECTOR3 position(5.0f, 3.0f, -10.0f); D3DXVECTOR3 targetPoint(0.0f, 0.0f, 0.0f); D3DXVECTOR3 worldUp(0.0f, 1.0f, 0.0f); D3DXMATRIX V; D3DMatrixLookAtLH(&V, &position, &targetPoint, &worldUp); 뷰스페이스 변환을 수행하려면 D3DTS_VIEW에 변환 타입을 지정하고 IDIRECT3DDevice9::SetTransform 메서드를 호출하면 된다. Device->SetTransform(D3DTS_VIEW, &V); 2009-1학기 컴퓨터게임(DirectX)
후면 추려내기 폴리곤은 두 개의 면을 가지고 있다. 하나의 면을 전면, 다른 면을 후면이라 부른다. 카메라는 절대로 폴리곤의 후면을 보지 못한다. 폴리곤의 후면을 볼 수 있는 경우에는 후면 추려내기가 작동 하지 않기 때문이다. 2009-1학기 컴퓨터게임(DirectX)
후 면 전 면 관 찰 점 2009-1학기 컴퓨터게임(DirectX)
Direct3D는 후면 폴리곤을 추려냄으로써 상당한 이득을 취한다. 이 과정을 추려내기(backface culling)이라 한다. 관찰점 2009-1학기 컴퓨터게임(DirectX)
이와 같은 처리를 위해서 어떤 폴리곤이 전면 폴리곤이고 후면 폴리곤 인지를 Direct3D의 입장에서 확인할 수 있어야 한다. 두르기 순서 (뷰 스페이스에서) 시계 방향으로 지정된 버텍스를 가진 폴리곤은 전면 시계 반대 방향으로 지정된 버텍스는 후면 뷰 스페이스로 시점을 정의한 것에 주의 이것은 삼각형이 180도 회전할 경우 두르기 순서가 뒤집히기 때문이다. 2009-1학기 컴퓨터게임(DirectX)
표준적인 추려내기 동작이 마음에 들지 않는다면 D3DRS_CULLMODE 렌더 상태를 수정하여 동작 변경 가능 Device->SetRenderState(D3DRS_CULLMODE, Value); Value : D3DCULL_NONE : 후면 추려내기를 완전히 끈다. D3DCULL_CW : 시계 방향 두르기를 가진 삼각형 추려냄 D3DCULL_CCW : 시계 반대 방향 두르기를 가진 삼각형을 추려냄(디폴트) 2009-1학기 컴퓨터게임(DirectX)
조 명 광원은 월드 스페이스 내에 정의 되지만 뷰 스페이스 변환에 의해 뷰 스페이스로 변환된다. 광원은 물체에 명암을 추가하여 장면에 사실감을 더해준다. 광원은 5장에서 좀더 자세히 다룰 예정 2009-1학기 컴퓨터게임(DirectX)
클 리 핑 시야 볼륨 외부의 기하물체를 추려내는 과정 절두체에서 삼각형 위치는 3가지로 분류 완전한 내부 : 삼각형이 완전히 절두체 내부에 위치 완전한 외부 : 삼각형이 절두체 외부에 위치(추려짐) 부분적 내부(외부) : 삼각형이 부분적으로 절두체 내부에 위치하면 삼각형을 두개의 부분으로 분리 절두체 내부의 부분 보존, 나머지 추려짐 2009-1학기 컴퓨터게임(DirectX)
시야 볼륨 외부의 기하물체를 추려냄 내부 분리 외부 2009-1학기 컴퓨터게임(DirectX)
투 영 N차원에서 N-1차원을 얻는 과정(projection) 원근 투영(perspective projection) 원근법을 이용하여 기하물체를 투사한다. 카메라에서 멀리 떨어진 물체는 가까운 물체에 비해 작게 나타남 다음의 그림은 원근 투영을 통해 3D 포인트를 투영 윈도우에 투영하는 과정을 표현한다. 2009-1학기 컴퓨터게임(DirectX)
투영 윈도우로의 3D 포인트 투영 q q’ 먼 평면 투영 윈도우. Direct3D는 평면 z=1과 일치하도록 정의하고 있다. 투영의 중심 2009-1학기 컴퓨터게임(DirectX)
투영 변환은 우리의 시야 볼륨(절두체)을 정의하고 절두체 내의 기하물체를 투영 윈도우에 투영하는 과정을 담당 D3DX 함수를 이용하여 절두체 선언에 따른 투영 행렬을 만들어낸다. 2009-1학기 컴퓨터게임(DirectX)
D3DXMATRIX * D3DXMatrixPerspectiveFovLH( D3DXMATRIX* pOut, // 투영 행렬 리턴 z D3DXMATRIX * D3DXMatrixPerspectiveFovLH( D3DXMATRIX* pOut, // 투영 행렬 리턴 FLOAT fovY, // 시야각의 수직 영역(라디안) FLOAT Aspect, // 종횡비 = 너비/높이 FLOAT zn, // 가까운 평면까지의 거리 FLOAT zf // 먼 평면까지의 거리 }; f n x fov 2009-1학기 컴퓨터게임(DirectX)
투영윈도우의 기하물체들이 스크린 스페이스로 변환될 때, 정사각형에서 직사각형 스크린 변환에서 왜곡이 발생. 종횡비 = 화면 너비 / 화면 높이 투영윈도우의 기하물체들이 스크린 스페이스로 변환될 때, 정사각형에서 직사각형 스크린 변환에서 왜곡이 발생. 이 왜곡을 보정하기 위함 2009-1학기 컴퓨터게임(DirectX)
투영 행렬을 얻기 위해서는 D3DTS_PROJECTION에 변환 타입을 전달하고 IDirect3DDevice9::SetTransform 메서드 호출 D3DXMATRIX proj; D3DXMatrixPerspectiveFovLH( &proj, PI * 0.5f, (float)width/(float)height, 1.0, 1000.0f); Device->SetTransform(D3DTS_PROJECTION, &proj); 2009-1학기 컴퓨터게임(DirectX)
뷰 포 트 변 환 프로젝트 윈도우의 좌표를 뷰포트라 불리는 화면의 직사각형으로 변환하는 과정 뷰 포 트 변 환 프로젝트 윈도우의 좌표를 뷰포트라 불리는 화면의 직사각형으로 변환하는 과정 게임에서의 뷰포트는 보통 직사각형의 전체 화면 윈도우 모드에서 실행하는 경우에는 클라이언트 영역이나 화면의 일부가 될 수도 있다. 뷰포트 사각형은 이를 포함하고 있는 윈도우와 상대적이며 윈도우 좌표를 이용해 지정된다. 2009-1학기 컴퓨터게임(DirectX)
Direct3D에서는 D3DVIEWPORT9 구조체를 이용해 뷰포트를 표현하여 다음과 같이 정의 typedef struct _D3DVIEWPORT9{ DWORD x; /* 뷰포트를 포함하는 윈도우와의 상대적인 뷰포트 DWORD y; 사각형을 정의, MinZ, MaxZ 는 최대 깊이 버퍼값 DWORD Width; 정의. Direct3D는 0~1까지의 깊이 버퍼를 이용하 DWORD height; 므로 특수한 효과를 원하는 것이 아니면 이에 DWORD MinZ; 맞는 값으로 설정해야 한다. */ DWORD MaxZ; } D3DVIEWPORT9; 2009-1학기 컴퓨터게임(DirectX)
뷰포트 사각형 (0, 0) (x, y) Viewport Area (w, h) (640, 480) 2009-1학기 컴퓨터게임(DirectX)
D3DVIEWPORT9 구조체를 채운 다음 아래 코드를 이용해 뷰포트를 구성 D3DVIEWPORT9 vp = {0, 0, 640, 480, 0, 1}; Device->SetTransform(&vp); Direct3D는 자동으로 뷰포트를 변환 수행 2009-1학기 컴퓨터게임(DirectX)
레스터라이즈 스크린 좌표로 버텍스들을 변환한 다음에는 2D 삼각형들의 리스트를 가지게 된다. 레스터라이즈 단계는 각각의 삼각형을 그리는데 필요한 픽셀 컬러들을 계산하는 과정이다. 래스터라이즈 과정은 엄청난 작업 양을 필요로 하므로 반드시 전용 그래픽 하드웨어에서 처리되어야 함 래스터라이즈 결과물은 모니터에 바로 디스플레이 할 수 있는 2D 이미지가 된다. 2009-1학기 컴퓨터게임(DirectX)
2009-1학기 컴퓨터게임(DirectX)