3D 그래픽을 사용하는 게임들이 포함하고 있는 모듈들.

- 사용자 입력(User Input)

- 자원 관리(Resource Management)

- 그래픽 로딩과 렌더링(Loading and Rendering Graphics)

- 스크립트 해석과 실행(Interpreting and Executing Scripts)

- 음향 처리(Playing Sound Effects)

- 인공 지능(Artificial Intelligence)

 

위의 소스 코드 모듈은 집합적으로 게임 엔진(Game Engine)을 구성한다.

 

 

게임 엔진의 구성

 

객체의 표현과 렌더링

 

렌더링(Rendering)이란 3D 게임 세계의 객체들을 컴퓨터의 화면(2D)으로 그리는 것, 또는 그리는 과정이다.

 

메시(Mesh)는 게임 공간 또는 게임 세계에서 하나의 객체(Object)를 시각적으로 표현하기 위한 개념이다.

메시는 객체의 외관을 생성하기 위해 연결된 다강형들의 집합이라고 정의 할 수 있다.

가장 간단한 다각형은 삼각형이다. 일반적으로 메시는 삼각형들의 집합으로 표현된다. 모델(Model)이라고도 한다.

 

면(Face)은 메시를 구성하고 있다. 각 면은 3차원 공간에서 정의 되는 점들을 일련의 선분으로 연결함으로써 생성된다.

 

정점(Vertex)는 메시를 구성하는 점들이다.

 

텍스쳐 맵(Texture Map)이라고 하는 2차원 이미지가 메시(면)의 질감과 색상을 표현하기 위해 사용될 수 있다.

 

렌더링의 과정은 크게 변환(Transformatino)과 색칠(Coloring, Lighting)하기로 구분할 수 있다.

 

변환 과정은 다각형의 3D 좌표를 2D 화면 좌표로 바꾸는 것을 의미한다.

색칠하기 과정은 화면에 그려지는 다각형들의 점들의 색상을 결정하는 것이며 조명처리 또는 텍스처 매핑 등의 개념이 포함된다.

 

 

좌표계

 

메시를 기하학적으로 표현하려면 좌표계가 필요하다.

 

2차원 좌표계

2차원 공간을 표현하기 위한 좌표계로 직교 좌표계(Cartesian Coodinate System)를 사용한다.

2차원 직교 좌표계

 

 

화면 좌표계

모니터 디스플레이 화면을 정의하는 좌표계를 화면 좌표계 또는 스크린 좌표계(Screen Coordinate System)이라고 한다.

디스플레이 화면의 왼쪽 위는 화면 좌표계의 원점이 되고 좌표축의 방향은 원점에서 오른쪽으로 가면서 x축이 증가하고 원점에서 아래 방향으로 가면서 y축이 증가한다.

화면 좌표계

3차원 좌표계

3차원 공간을 표현하기 위해 3차원 직교 좌표계를 사용한다.

왼손 좌표계, 오른손 좌표계

왼손 좌표계(Left Hand Coordinates)와 오른손 좌표계(Right Hand Coordinates)가 있는데

Direct3D는 왼손 좌표계를 사용한다.

 

3차원 좌표계에서 점을 표현하기 위한 자료구조는 다음과 같다.

struct 3Dpoint
{
    float x;
    float y;
    float z;
};

 

3차원 좌표계에서 정육면체를 나타내면 다음과 같다.

3차원 좌표계에서 정육면체 표현

 

3차원 좌표계에서 면 또는 다각형은 3차원 점들의 순서화된 리스트로 표현할 수 있고 메시는 이렇게 표현된 다각형의 집합으로 표현할 수 있다. 이러한 개념을 구조체로 표현한다면 

 

C언어

struct Vertex
{
    float x;
    float y;
    float z;
};
struct Polygon
{
    UINT nVertices;
    Vertex *pVertexList;
};
struct Mesh
{
    UINT nFaces;
    Polygon *pFaceList;
};

 

C++언어 의 클래스로도 표현

class CVertex
{
public:
    CVertex(float fX, float fY, float fZ);
    CVertex();
    float x;
    float y;
    float z;
};

 

모델 좌표계와 월드 좌표계

모델 좌표계는 각 객체의 모델 메시의 점을 표현하기 위한 좌표계이다. 보통 메시의 중심이 모델 좌표계의 원점이 되며 메시의 각 점은 이 원점에 상대적인 좌표로 표현된다. (메시를 구성하는 점들은 정점(Vertex)이라고 하며 객체를 표현하는 메시의 객체의 모델(Model)이라고 한다.

 

모델 좌표계는 각 모델을 표현하기 위해 사용하는 지역 좌표계(Local Coordinate System)이다.

객체의 지역적 공간(Object Local Space)을 표현하는 좌표계이다.

 

월드 좌표계는 게임 공간에 존재하는 객체들의 위치와 뱡향을 표현하기 위한 좌표계이다. 게임 세계 전체를 하나의 통일된 좌표계로 표현하기 위한 좌표계이며, 게임에 나타나는 모든 객체에 적용될 수 있는 전역 좌표계(Global Coordinates System)이다.

 

모델이 화면에 렌더링되기 위해서 모델 좌표계로 표현된 메시는 월드 좌표계로 변환된다. 이때 월드 변환 행렬이 적용된다.

 

와인딩 순서(Winding Order)는 메시를 구성하는 다각형의 정점들을 나열하는 순서를 말한다. 즉, 다각형의 정점 또는 모서리(Edge)가 어떤 순서로 연결되는지를 나타낸다. 

 

와인딩 순서는 시계 방향(Clockwise) 순서와 반시계 방향(Counter Clockwise) 순서가 있다. 

시계 방향, 반시계 반향

와인딩 순서는 다각형의 면이 3D 객체의 바깥쪽을 향하게 될 때 즉, 바깥쪽 면이 될 때를 기준으로 정한다.

모델 메시의 다각형들을 정의할 때 모든 다각형의 와인딩 순서는 시계 방향이 되도록 하여야 한다. 와인딩 순서는 은면 제거(Back Face Culling)를 수행하기 위해 사용된다.

 

은면은 게임 플레이어가 볼 수 없는 숨겨진 면을 일컫는다.

은면 제거는 다각형을 바라보는 방향(카메라 방향)과 반대 방향인 다각형을 렌더링 과정에서 제거하는 것을 말한다.

Unity는 시계방향(CW)으로 와인딩 순서를 사용한다. 블렌더는 시계 반대 방향으로 와인딩 한다.

Direct3D에서는 기본적으로 시계방향으로 와인딩 순서를 사용한다. 이것은 카메라의 관점에서 정점이 나열되는 순서가 시계 방향이면 은면이 아님을 의미한다.

 

정육면체의 와인딩 순서(CW)

 

화면 렌더링

그래픽 엔진은 매 순간 3차원 게임 세계의 한 장면을 2차원 디스플레이 화면에 그리는 과정을 반복한다.

렌더링 과정은 3차원 게임의 한 장면을 구성하는 모든 메시들을 그리는 것이라고 볼 수 있다. 메시들은 다각형들의 집합이므로 결과적으로 렌더링은 메시를 구성하는 다각형을 그리는 것이라 볼 수 있다. 이때 다각형을 그린다는 것은 다각형을 구성하는 점들(Vertices)을 그리는(찍는)것이라 볼 수 있다.

 

이때 3차원 세상을 2차원 평면에 그리는 과정을 화가의 알고리즘(Painter's Algorithm)이라고 한다.

 

화면 렌더링 과정은 다음과 같은 코드로 표현될 수 있다.

void RenderScene()
{
    for(int i = 0; i < nMeshes; i++)
    {
         CMesh *pMesh = gpMeshArray[i];
         for(int k = 0; k < pMesh->nFaces; k++)
         {
             CPolygon *pPoly = &pMesh->pFaceList[k];
             Draw(pPoly->pVertexList, pPoly->nVertices);
         }
    }
}

3차원 좌표에서 화면 공간 좌표로 변환된 다각형의 정점들이 얻어지면 각 정점은 화면의  픽셀의 위치를 나타낸다.

 

'게임 개발 > DirectX' 카테고리의 다른 글

변환 파이프라인  (0) 2019.10.16
Direct3D -5- 벡터  (0) 2019.10.05
Direct3D -4- 벡터  (0) 2019.10.05
Direct3D -3-  (0) 2019.10.04
Direct3D -2- (Win32 API에서 Direct3d 구동하기)  (0) 2019.10.04

+ Recent posts