DirectX
DirectX는 Window환경에서 GPU와 같은 H/W를 제어할수 있도록 제공하는 API이다. 이러한 GPU를 사용하려는 목적은 렌더링과 같이 연산량이 많으나 단순한 연산일 경우 CPU는 연산뿐만 아니라 다양한 것을 처리해야 되는데 이런 것을 CPU 혼자 처리하게 될 경우 속도의 저하로 이어질수 있다. 따라서 고급인력인 CPU를 대신하여 CPU보다 싸면서 연산장치가 많은 GPU에게 연산을 시키는 것이 DirectX의 주목적이라고 할 수 있다.
렌더링 파이프라인
렌더링 파이프라인 또는 그래픽스 렌더링 파이프라인이라 부르는 과정은 3차원으로 만들어진 모델을 2차원에 투영하는 렌더링 과정의 프로세스를 표현한 것이다. 아래에서 주황색으로 칠해져 있는 부분은 프로그래머가 코딩으로 제어할수 있는 부분을 의미한다. 본 포스팅에서는 IA단계->VS단계->RS단계->PS단계를 중점적으로 다룰 예정이다.
Input Assembler
렌더링 파이프라인의 첫 단계이며, VertexData를 CPU에서 GPU로 운반하기 위한 자료 구조를 VertexBuffer라고 한다. VertexBuffer는 Postion,Color, UV등을 담을수 있는다. GPU에서는 이렇게 전달 받은 VertexBuffer를,vsBlob을 통해 VertexData로 조립한다. IA단계에서는 VetexBuffer뿐만아니라 Vertex의 중복을 줄여주는 IndextBuffer와 Shader의 데이터를 나누는 InputLayout, 기본 도형을 정하는 Primitive등을 설정하고 조립하여 도형을 만들어 준다.
Vertex Shader
Vertex 하나에 가해지는 다양한 이펙터 및 위치정보 이동 연산에 대해, CPU 의 의존적인 경향을 최대한 줄이고, 버텍스 연산에 관련된 여러가지 프로세스를 그래픽 프로세서 안에서 처리할 수 있도록 만들어주는 것을 의미한다.
Rasterize
IA단계에서 입력받은 Primitive에 따라 그 모양을 보간하는 단계이다.Shader단계와 다르게 이부분은 고정되어 있기 때문에 수정이 불가능하다. VS와 GS를 거쳐서 나온 데이터는 Pixel단위로 색이 채워져야 하는데, 해당 단계에서는 이러한 데이터를 예비Pixel인 Fragment로 채운다.Fragment는 텍스쳐/Position/UV와 같은 데이터를 가지고 있으며 이것을 보간하여 생성한다. 이때 클리핑/원근 나눗셈/뒷면 제거/뷰포트 변환/스캔 변환등을 이 단계에서 행할수 있다.
Pixel Shdaer
Pixel 하나하나에 적용할 수 있는 연산 프로그램을 지칭한다. Rasterize에서 받은 Fragment를 받아 멀티플 라이트닝과, 다중 텍스쳐링 처리에 관한 연산 프로그램이라고 할 수 있다. Pixel Shader 는 크게 두가지 파트로 나뉘어 질 수 있다.
첫 번째 파트는 Address Shader 라고 불리우는 부분으로써,텍스쳐 좌표 값에 대해 여덟가지 수학적 연산을 수행하는 기능을 가지고 있다.
두 번째 파트는 Color Shader 라는 프로그램이다. Color Shader 는 8개의 명령어 유닛으로 구성되어 있는데, 이 명령어 유닛들은 서로 다른 색깔을 블랜딩 하거나 색상의 값을 매 순간마다 유동적으로 바꾸는 등의 연산을 수행한다.
추가로 UV를 조작하는 SampleState또한 PixelShader에서 수행하게된다.
OutputMerge
랜더링의 마지막 단계로써, 픽셀들을 화면에 출력하기 위한 마지막 연산들을 수행한다.
대표적으로 Z-Test/Stencil Test/Alpha Blending등을 사용할수 있으며, 각각의 픽셀 위치마다 여러 오브젝트의 픽셀이 겹쳐 있을 수 있다. 마찬가지로 투명도와 관계가 있는 BlendState또한 OM단계에서 행해진다.
'게임엔진 > DirectX' 카테고리의 다른 글
DX) 6. Tessellation (0) | 2023.06.01 |
---|---|
DX) 4. IA(InputAssembler) (0) | 2023.03.03 |
DX)3.Device (0) | 2023.03.03 |
DX)2.렌더링파이프라인 가이드 (0) | 2023.03.03 |
DirectX) 프로젝트 설정 (0) | 2022.02.26 |
댓글