렌더링 파이프라인(Rendering Pipeline) 또는 그래픽스 렌더링 파이프라인(Graphics rendering pipeline)이라 부르는 과정은 3차원으로 만들어진 모델을 2차원에 투영하는 렌더링 과정의 프로세스를 자세하게 표현한 것이다. 컴퓨터에 데이터로 존재하는 3D 리소스가 모니터에 출력되는 과정이 렌더링 파이프라인을 따르게 된다.
위의 과정에 따라 화면에 도형을 표시할 수 있으며, 주황색 박스로 된 과정이 조작 가능한(Programmable) 단계이다.
Vertex Specfication라고도 불리는 Input Assembler 단계는 CPU로부터 렌더링을 수행할 도형의 정점 정보를 정점 버퍼에 담아 전달 받는다. 국내에서는 Input Assembler가 더 익숙한 표현이라 편의상 해당 명칭으로 부르겠다.
GPU는 CPU의 자원에 직접 접근할 수 없으므로 CPU에서 버퍼라고 부르는 메모리에 필요한 정보를 담아 GPU로 전달해준다.
Input Assembler 단계에서 받은 정점들의 정보로 도형은 생성되었지만 공간 좌표계를 변환할 필요가 있다.
기본적으로 도형들은 자신만의 좌표계인 Local Space의 좌표를 가지는데, 모든 물체들이 하나의 월드에 위치하도록 Local Space에서 World Space로 변환하고, 실제 플레이어가 바라보는 카메라가 중심이 되는 공간인 View Space로 변환해준다.
Tesselation 단계는 주어진 모델의 정점을 더 잘게 쪼개어 디테일하게 표현할 때 사용한다.
일반적으로 가까운 거리의 물체는 고해상도로, 먼 거리의 물체는 저해상도로 표현하여 성능을 향상시키는데, 고해상도로 표현되었을 때 보여져야 할 텍스쳐 형태를 높이 맵으로 저장해놓고 실제 모델에 필요한 만큼의 레벨만큼만 적용하는 식으로 테셀레이션을 활용하면 하나의 모델에 대해 여러 해상도의 모델 데이터를 가지고 있을 필요가 없다.
이는 LOD(Level of Detail)을 적용하여 여러 해상도로 표현 가능한 모델을 마련했는데, 그 모델들끼리의 변환이 부자연스러운 경우를 Tesselation으로 자연스럽게 표현할 수 있는 것이다.
기본 도형에서 정점을 추가하거나 삭제하여 모델을 변경할 수 있는 셰이더이다. Geometry Shader로 정점 정보를 조금 추가하여 표현할 수 있는 모델이라면 그만큼의 정점 정보를 빼고 저장할 수 있으니 디스크 용량과 그래픽 메모리 절약에 도움이 될 수도 있으며, 테셀레이션 등으로 추가된 정점들을 표현할 때도 사용된다.
정점 정보를 완전히 결정한 3D 도형을 실제 픽셀 데이터로 변환해주는 단계이다. 이때 우리가 가진 정점 데이터는 말그대로 정점의 데이터이고, 정점 사이의 공간은 보간(Interpolation)을 통해 메워주어야 한다.
Pixel Shader라고도 부르며, 래스터화된 도형에 텍스쳐 매핑, 범프 매핑, 노말 매핑 등의 기법으로 텍스쳐를 입혀 색을 표현한다. 또한, 정점의 법선 벡터 정보를 통해 조명(Lighting) 처리도 해당 셰이더에서 이루어진다.
▶ 렌더링 파이프라인 이미지 출처 - 그래픽스 개발자의 코딩 블로그 "그래픽스 파이프라인이란?" 포스팅
▶ [OpenGL Wiki] Rendering Pipeline Overview
▶ 렌더링 파이프 라인 - VS Stage
▶ DirectX11의 테셀레이션
▶ OpenGL 조명