비디오 게임들은 가상의 세계를 시뮬레이션 하려 한다. 그러나 본질적으로 컴퓨터는 수치를 처리하는 기계 이다. 따라서 어떻게 세상을 컴퓨터 안으로 옮겨올 것인가 라는 문제 가 제기된다. 그 답은, 세상과 세상에 있는 사물들 사이의 상호작용을 전부 수학적으로 서술한다는 것이다. 따라서 수학은 비디오 게임 개발에서 근본적인 역할을 차지한다.
Direct3D 12 는 현세대 그래픽 하드웨어를 활용하는 고성능 3차원 그래픽 응용 프로그램을 다양한 Windows 플랫폼에서 작성하기 위한 렌더링 라이브러리 이다. Direct3D 는 하나의 저수준(low-level) 라이브러링인데, 여기서 '저수준'은 Direct3D 의 API 가 자신이 제어하는 바탕 그래픽 하드웨어를 밀접하게 본뜬 것 이라는 점에서 붙은말이다.
비디오 게임들은 가상의 세계를 시뮬레이션 하려고 하며, 3차원 공간의 가상의 세계는 렌더링 파이프 라인의 과정을 거쳐 모니터의 2차원 화면으로 출력되어 진다. 렌더링 파이프라인이란 무엇일까? 파이프라인 : 생산 공정 즉 렌더링 파이프라인은, 이미지 생산 공정이라고 할 수 있다. 마치 컨베이어 시스템과 같이, 사람이나 기계에 의한 분업화가 이루어져, 입력이 들어오면, 각각의 기능과 역할에 따라서, 일을 순차적으로 처리하여, 출력되는 과정이다. 입력에 의해 결과가 나오게 된다. 렌더링 파이프라인에서의 입력이 되는것은 모델링 데이터, 텍스쳐, 광원 등이 될것이고, 출력이 되는것은 컴퓨터 모니터상의 그림으로 나타나게 된다. 만들고 배치된 모델링, Mesh 가 Pixel 이 되기까지의 여정, 과정이 렌더링 파이프라인이다.
Max 나 Maya 등, 제작도구에서는 잘 나왔는데, 엔진에 옮기고 나니, 의도한 느낌이 나지 않는경우가 나오지 않을 수 있다. 즉, 엔진의 속성에 대한 이해와, 그것을 감안하고 만들어야 한다. 엔진의 기반이 되는것은 Graphics API 라고 해서, 컴퓨터에서 3D 물체를 제대로 그려내기 위한 함수들의 모음인데, 대표적으로 OpenGL 이나 DirectX 가 있다.
가상의 카메라이 보이는 것들에 근거해서, 2차원 영상(이미지)를 생성하는데 꼭 필요한 일련의 단계. 렌더링파이프라인! 다시말해 렌더링파이프라인이란, 카메라에 보이는 3차원공간 -> 2차원이미지 를 생성하는데 필요한 단계.
우리는 일반적인 프로그래밍 언어를 통해 , 자연스럽게 CPU 에게, 특정 값을 계산해 달라고 요청하였다. 이는 c 나 cpp 등의 언어로, .c , .cpp 파일로 작성되고, 컴파일되어 CPU 에게 계산을 요청하게 된다. 똑같이, GPU 에게 계산을 요청하기 위해서는 GLSL(openGL Shading Language) 이나, HLSL(High-Level-Shader-Language) 등의 언어로 .glsl , .hlsl 파일을 작성하고, 이를 컴파일하여 GPU 에게 계산을 요청하게 됩니다.
.hlsl 등 shader 파일은 GPU 에게 맡길 계산이나 명령어들의 집합 이라고 할 수 있다.
그러니까 그래픽 카드에게 특정 값의 연산을 맡기기 위해서는 shader 파일에 작성하면 된다는 것이다. 즉, GPU 에게 어떤 일을 맡기기 위해서는 Shader 프로그램 이 있어야 한다.
이를 생각하면, Direct3D API 를 사용하게 되면, 왜 RootSignature 를 선언하고, 여기에 리소스를 묶는지 납득할 수 있다. GPU 의 연산은 Shader 프로그램에 적혀있고, 우리가 작성하는 c 나 cpp 에서는 그래픽 카드에게 직접적인 연산을 요청하는 것이 아닌, shader 프로그램에 필요한 자원들을 준비하고, 할당하고, 묶는등의 명령만 적어준다. 필요한 자원들을 Shader 프로그램에 묶어 주기 위한 것이 RootSignature 이며, 이는 마치 함수가 필요로 하는 매개변수 를 묶어 주는 것과 같다. RootSignature 는 그래픽 파이프라인의 루트계층(root level) 에서 호출될 리소스의 바인딩 및 파라미터 설정을 정의하는데 사용된다. 쉽게말해, GPU 에게 그래픽 작업에 필요한 데이터를 제공하는 방법을 결정하는 것이다. RootSignature 는 리소스 와 렌더링 파이프라인 각 스테이지 간의 연결을 약속합니다. ShaderFile 은 GPU 에서 실행되는 프로그램 코드를 포함하는 파일입니다. 이 파일은 Shader Program 을 정의하고, 그래픽 카드에서 수행할 작업을 명시합니다. Shader 파일은 대개 HLSL 이나 GLSL 과 같은 언어로 작성됩니다.
그래픽 카드는 원래 그래픽 연산을 위해 사용되는 프로세서 이지만, 최근에는 AI 가 그래픽 카드를 사용하면서, 그래픽 연산 이외의 작업들을 시키게 되었다. 이 또한 Shader 파일에다가 작성하여 이루어진다. (병렬처리 및 계산 작업을 위한, Compute Shader 를 사용하여, 그래픽 카드에게 특정 연산을 수행하도록 명령할 수 있습니다.) 또는, Shader 파일 이외에도 각종 라이브러리를 제공되고 있으며, Shader 파일을 작성하지 않아도, GPU 에게 연산을 요청하기 위한 여러 명령어들을 라이브러리 의 형태로 제공하고 있다.
GPU IO 를 하기 위한 다양한 방법이 존재한다. GPU 에게 작업을 맡기기 위해 여러가지 라이브러리 가 있으나, 그중 대표적인 방법이 DirectX 라이브러리를 사용하는 방법이다.