이번 장은 이론 위주였습니다. 코드만 왕창 보다가 다시 이론만 나오니 졸리기도 하는 이 황금 배합에 감탄하고 말았습니다. 그래도 익숙해서 그런가 어렵지 않았던 것 같습니다.


3차원 같은 2차원


 영화 cg나 게임을 하면서 어떻게 3D 그래픽을 표현했을 까 하는 생각을 가끔씩 했을 것입니다. 저는 이 부분을 공부하면서 3D2차원 이미지를 3차원처럼 보이게 만든 마술 같은 기술임을 알았습니다. 다음은 이 마술 같은 표현을 이루어 주는 기법입니다.

-       소실점 : 원근법이라고도 할 수 있는 이 기법은 깊이 알고리즘에 의해 오브젝트와 투영 창과의 거리에 따라 오브젝트의 크기를 조절하는 기법입니다.

-       오버랩 : 4장에서도 배웠던 것처럼 오브젝트의 겹침을 알고 렌더링 하는 기법입니다. 이것 또한 깊이 알고리즘을 이용합니다.

-       조명(Lighting) : 조명이 있고 없고 차이는 그림에서 명암 표현이 있고 없고의 차이와 같은 것 같습니다. 조명에 따라 오브젝트의 입체감이 살기 때문입니다.

-       그림자(Shader) : 그림자의 위치에 따라 조명의 위치를 알 수 있습니다. 조명과 그림자는 뗄 수 없는 조합인 것 같습니다.

4 기법은 일상생활에서도 느낄 수 있는 당연한 것들이지만, 덕분에 2차원 이미지를 3차원으로 느낄 수 있도록 도와줍니다.


모형의 표현


 3D 모델링을 해본 사람이라면 오브젝트들이 모두 평면의 메시로 이루어져 있다는 것을 알 것입니다. 저도 1인 개발을 해보겠다고 무작정 무료 모델러인 블렌더를 깔 고 모델을 해봤는데요.

레고 캐릭터 하나 만들고 현자타임이 와버리더군요. 3차원 오브젝트를 표현하는 데에 삼각형 모양의 메시가 아주 작은 크기로 근사하여 따닥따닥 붙어 모양을 나타내줍니다.


컴퓨터의 색상 표현


 RGB라는 명칭이 많이들 익숙할 것입니다. 이 뜻이 Red, Blue, Green이라는 것을 처음 알았을 때 이렇게 쉬운 단어들이 모인 것일 줄은 몰랐었습니다. RGB는 컴퓨터 내에서도 색상을 표현하는데 이용됩니다. 역시 빛의 삼원색이기 때문인 것 같습니다. 컴퓨터에서는 RGB이외에 알파라는 값을 추가시켰습니다. 알파는 불투명도를 나타내는데 딱 봤을 때, 언리얼 게임을 만들면서 마테리얼을 작업 할 때 Opanity와 같은 역할을 함을 느꼈습니다.


네 가지 값을 이용해 4차원 벡터를 만들 수 있습니다. 각각의 값들은 0부터 1까지 나타낼 수 있는데, 0은 빛이 없음을 의미하고 1은 빛의 세기가 최대임을 나타냅니다. 4차원 벡터를 이용하여 나타낸 색상은 특별한 연산이 있습니다. 벡터이지만 내적이나 외적 같은 기본적인 벡터연산이 색상을 표현하는 데에는 의미 없기 때문에 컬러 벡터만의 연산인데요. 이것을 변조(Modulation) 또는 성분별 곱셈(Componentwise multiplication)이라고 합니다. 거창하게 컬러 벡터만의 연산이라고는 하지만 의미만 다를 뿐 다른 벡터 연산과 비슷합니다. 내적과 비슷하지만 각 성분끼리 곱을 한 후 그것이 각 성분이 됩니다.




내적은 각 성분끼리 곱한 값을 모두 더하여 스칼라 값을 반환한 반면에 변조는 말 그대로 성분별 곱셈만 한 후 벡터 값을 반환합니다.


렌더링 파이프라인


 렌더링 파이프라인의 정의는 3차원 장면의 기하학적 서술과 가상 카메라의 위치 및 방향이 주어졌을 때 현재 가상 카메라에 비친 3차원 장면의 모습에 근거해서 2차원 이미지를 생성하는 데 필요한 일련의 단계들 전체를 가르키는 것을 의미합니다.

다음은 렌더링 파이프라인의 대표적인 과정인데요 맨 위에서부터 맨 아래까지 순서대로 이루어지는 과정입니다. 각 단계는 GPU로부터 리소스를 받아 수행되는데, 기하 쉐이더에서는 유일하게 GPU로 스트림을 출력합니다. 무엇을 출력하는지 자세한 것은 다음 장에서 공부해보겠습니다.


-       입력조절기(Input Assembler)

n  입력 조절기에서는 간단하게 VertexIndex 버퍼를 채우고, 기하목록에서 어떤 도형을 형성할 것인지 기본도형 위상구조를 나타내는 enum형 인            D3D_PRIMITIVE_TOPOLOGY을 참고하여 설정하는 단계입니다.

n  Vertex 버퍼에는 기본도형을 형성하기 위해 사용되는 vertex들이 저장되는데 모두 연속적인 메모리에 저장됩니다. 하지만, 어떤 식으로 조합되었는지 나타나있지 않아 기본도형 위상구조를 설정해줘야 합니다.

n  기본도형 위상구조의 예로 개별적인 점으로 그려지는 점 목록(POINTLIST), 차례로 연결된 선분들을 형성하는 선 띠(LINESTRIP), 매 정점 두 개가 하나의 선분을 형성하는 선 목록(LINELIST), 삼각형들이 연결되어 있다는 가정하에서 인접한 두 삼각형이 정점들으르 공유하는 삼각형 띠(TRIANGLESTRIP), 매 정점 세 개가 하나의 삼각형을 형성하는 삼각형 목록(TRIANGLELIST)이 있습니다. 목록과 띠의 차이는 독립적이냐 연속적이냐의 차이입니다.

n  삼각형 목록에서는 인접성이라는 특별한 기능을 가질 수 있는데요, 이 인접성은 삼각형 목록에서 삼각형을 형성할 때 각 변에서 인접한 삼각형에 대한 정보를 가진 삼각형을 의미합니다. 인접성을 포함한 삼각형 목록은 기하 쉐이더에서 사용되는데 기하 쉐이더 부분에서 다시 공부해보겠습니다.

n  Index 버퍼는 vertex의 중복에 따라 메모리와 Gpu 처리량의 낭비를 해결하기 위해 사용되는 버퍼입니다. 함께 사용되는 vertex 버퍼와 일대일로 대응하도록 만든 이 버퍼는 어떤 vertex들을 어떤 순서로 사용하여 삼각형을 형성하는지를 나타냅니다. 보통은 삼각형이 만들어질 때 기준 vertex를 기준으로 시계방향 순으로 작성됩니다. Index 버퍼를 이용함으로써 정수형의 자료형을 가지기 때문에 적은 양의 메모리를 사용하고, 정수 값이 정해진 순서로 작성되어 캐시에 저장하여 처리한다면 Gpu의 처리량도 줄어듭니다.

-       정점 쉐이더(Vertex Shader)

n  모든 길은 로마로 통한다라는 속담이 어울리는 단계입니다. 화면에 그려지는 모든 vertex들은 모두 이번 단계를 거쳐가야 합니다.

n  Local Space & World Space :

n   

-       테셀레이터(Tesellator)

n  오브젝트의 삼각형 메시를 분할하여 새로운 삼각형 메시를 만드는 기법입니다.

-       기하 쉐이더(Geometry Shader)

n  선택적입니다.

n  이전 단계들로부터 생성된 vertex를 이용하여 새로운 vertex로 변형하거나 삭제시킬 수 있습니다.

n  절단(Clipping) : 시야에서 보이지 않는 부분을 잘라냄으로써 최적화하는 기법입니다. 게임을 하는 데에 있어 가장 중요한 것은 부드러운 게임 환경인데요. 좀 더 효율적인 연산을 위해 보이는 부분만 렌더링하고 보이지 않는 부분은 과감히 잘라내어 렌더링을 하지 않는 것입니다.

-       래스터화(Rasterization)

n  뷰포트 변환, 후면 선별과 정점 특성의 보간 등의 기능을 가지고 있으며 주로 픽셀에 색상을 계산합니다.

-       픽셀 쉐이더(Pixel Shader)

n  각 픽셀마다 특정한 작업을 하여 픽셀 단편을 생성한 뒤 다음 단계로 출력합니다.

-       출력 병합기(Output Merger)

n  이전 단계로부터 받은 픽셀 단편을 폐기하거나, 백 버퍼에 추가합니다.

n  블렌딩 : 백 버퍼에 픽셀들을 혼합하여 얻은 결과를 추가하는 것입니다.


이외에도 헐 쉐이더와 도메인 쉐이더가 있지만 교재에서는 언급만 했기 때문에 이번 장에서는 넘어가도록 하겠습니다.


'GameDev > DirectX12' 카테고리의 다른 글

Direct3D의 초기화  (0) 2018.08.17
변환(Transformation)  (0) 2018.08.17
행렬(Matrix)  (0) 2018.07.25
벡터(Vector)  (0) 2018.07.25

+ Recent posts