상세 컨텐츠

본문 제목

Graphics Pipeline 개요

Computer Graphics/Graphics Pipeline

by Banjosh 2024. 11. 29. 12:46

본문

Graphics Pipeline이란?

Graphics Pipeline은 쉽게 말해, 우리가 OpenGL로 렌더링을 진행하는 과정을 단계별로 정리해놓은 것이다. 사실 지금까지 OpenGL을 사용한 프로젝트들도 이 과정을 거쳐 렌더링이 되었지만, OpenGL은 Graphics Pipeline에 대해 몰라도 렌더링이 가능하게끔 만들어주는 고수준 API다 보니 이를 깊이 있게 이해하지 않고 작업했던 경우가 많다.

하지만 다음 프로젝트부터는 Vulkan이라는 더 저수준의 API를 이용해 렌더링을 진행할 예정이기 때문에, 이번 기회에 Graphics Pipeline에 대해 제대로 공부해 보기로 했다.


Graphics Pipeline의 큰 흐름

Graphics Pipeline은 크게 4단계로 나눌 수 있다:

  1. Application 단계
  2. Geometry Processing 단계
  3. Rasterization 단계
  4. Pixel Processing 단계

1. Application 단계

Application 단계는 우리가 CPU 단에서 직접 제어하는 단계다. 보통 렌더링에 필요한 정보(정점 정보, 인덱스 정보, 프리미티브 정보 등)를 준비하는 역할을 한다.

게임 엔진을 사용하는 경우에는 이 단계에서 물체들의 물리 처리(물체의 움직임, 충돌 처리 등), 최적화(예: Frustum Culling)를 추가로 수행할 수 있다. 물론 텍스처를 VRAM에 복사하는 등 GPU를 활용한 작업들도 일부 포함되지만, 대부분의 작업은 CPU를 이용한다.

만약 렌더링이 아닌 빠른 계산만을 위해 GPU를 사용하고 싶다면, Compute Shader를 활용하는 것이 더 적합하다.


2. Geometry Processing 단계

Geometry Processing 단계에서는 화면에 렌더링할 정점 정보를 준비하여 정규화된 좌표로 변환한다. 이 과정은 크게 다음 5단계를 거친다:

  1. Vertex Shading
    정점 데이터를 처리하고 좌표 변환을 수행한다.
  2. Tessellation
    필요에 따라 정점을 세부적으로 분할하여 더 많은 프리미티브를 생성한다.
  3. Geometry Shading
    프리미티브의 최종 형태를 조작하거나 추가적인 데이터를 생성한다.
  4. Clipping
    화면 절두체(Frustum) 밖에 있는 데이터는 제거하여 성능을 최적화한다.
  5. Screen Mapping
    정규화된 좌표(NDC)를 화면(Viewport)에 매핑하여 실제 화면에 표시될 위치를 결정한다.

이 과정이 끝나면, 렌더링할 정점 정보가 준비된 상태로 다음 단계로 넘어간다.


3. Rasterization 단계

Rasterization 단계는 준비된 정점 정보를 화면 픽셀 정보로 변환하는 단계다. 이 작업은 프리미티브(정점들이 모여 만드는 기본 도형) 단위로 진행된다. 모든 프리미티브를 순회하며, 해당 프리미티브가 속하는 픽셀들의 정보를 계산하고 저장한다.

Rasterization 단계는 다음 2단계를 거친다:

  1. Triangle Setup
    삼각형의 기본 정보를 설정한다. (예: 각 정점의 위치, 색상, 텍스처 좌표 등)
  2. Triangle Traversal
    삼각형 내부의 픽셀들을 찾아 정보를 저장한다.

이 과정이 끝나면, 픽셀별로 여러 프래그먼트(Fragment)들이 생성되며, 이는 다음 단계에서 처리된다.


4. Pixel Processing 단계

Pixel Processing 단계는 픽셀별로 최종 색상을 결정하는 단계다. 보통 텍스처의 색상 정보와 빛 처리를 활용하여 각 픽셀의 최종 색을 계산한다.

이 단계는 다음 2과정을 포함한다:

  1. Fragment Shading
    각 프래그먼트의 색상, 텍스처, 조명 등의 데이터를 처리하여 픽셀의 최종 색상을 계산한다.
  2. Merging
    계산된 색상을 화면의 해당 픽셀에 적용한다. 이 과정에서는 Z-버퍼를 이용해 깊이 테스트를 수행하거나, 알파 블렌딩을 통해 반투명 효과를 적용할 수도 있다.

 

여기까지 마치면 하나의 Graphics Pipeline 과정이 끝난다.
앞으로 각 단계의 세부 과정들을 하나씩 살펴볼 예정이다.

관련글 더보기