[Vulkan Tutorial] 12-Introduction of Graphics Pipeline

목차: 01-Overview (Link)
이전 글: 11-Create Image Views (Link)
다음 글: 13-Shader Modules on Graphics Pipeline (Link)


이번 장을 시작으로 몇 차례에 걸쳐서 Graphics Pipeline 설명과 Graphics Pipeline을 생성하는 코드에 대해서 작성할 예정이다. 먼저 Graphics Pipeline에 대한 설명을 작성하였다. 예전에 출처 1을 기준으로 Graphics Pipeline에 대한 글을 작성한 적이 있다 (출처 2). 이번 글을 출처 2의 내용과 거의 동일하다. 

그림 1: Graphics Pipeline (출처 1)

그림 1은 Graphics Pipeline 동작 순서를 보여준다. 그림 1은 출처 1에서 제공하는 그림을 약간 변경하여서 다시 그린 그림이다. 그림의 동작 중 파란색으로 표시된 부분은 Fixed Function을 의미한다. Fixed Function은 고정된 동작(연산)을 수행한다. 노랑색으로 표시된 부분은 Programming 가능한 부분이다. 

Graphics Pipeline 동작 순서

  • Input Assembler: 사용자가 정의한 Input을 정리(Collect)하는 부분이다. Input은 Vertex Data (꼭짓점) 등을 의미한다. 예를 들어 삼각형을 그리고 싶으면 3개의 꼭짓점을 Input으로 주게 된다. 여러 개의 삼각형을 그린다면 꼭짓점 3개와 삼각형을 그리기 위한 추가적인 위치(Index) 정보가 될 수도 있다.
  • Vertex Shader: Vertex Data를 2D 화면 (Screen Space)로 변경하는 부분이다. Input으로 들어오는 Vertex Data는 보통 3차원 (X, Y, Z)로 구성된다. 우리가 눈으로 보는 모니터는 2D 화면을 보여준다. 그래서 3D Vertex 정보를 2D로 보이게 하려고 Vertex 정보를 수정한다.
  • Tessellation Shader (Optional): Mesh (물체)의 Quality를 높이기 위해서 특정 Rule에 따라 더 작은 삼각형(보통 삼각형)으로 나눈다. 예를 들어 큰 삼각형 하나가 들어오면 더 작은 단위의 삼각형으로 나누는 단계이다. 
  • Geometry Shader (Optional): Primitive(삼각형, 선, 점)를 지우거나 추가하는 부분이다. 요즘은 성능적인 문제로 인해서 거의 사용하지 않는다고 한다. Intel 내장 GPU에서는 좋은 성능을 보인다고 한다.
  • Rasterization Stage: 2D Screen Space로 변경된 포지션을 사용하여 Mesh (물체)를 Fragment로 나누는 단계이다. 이 부분에서 모니터 화면에 표시되지 않는 부분이나, 다른 Object/Mesh (물체) 뒤에 있어서 보이지 않는 Fragment 등을 Depth Test를 통해서 제거하는 작업도 수행한다.
  • Fragment Shader: Rasterization에서 살아남은 Fragment의 색상 및 Depth 값을 계산하는 부분이다. 색상을 계산하기 위해서 빛 등을 고려해야 하는 부분이다. 복잡한 색상을 구현하기 위해서는 많은 수학적 지식이 필요한 부분이다. 
  • Color Blending: Fragment의 색상들을 비교하여 최종 Pixel을 결정하는 단계이다. 한 픽셀 포인트에 대해 여러 개의 Fragment 정보가 존재하면 두 개의 정보를 기준으로 Pixel 색상을 결정한다. 투명도에 따라 색상의 값들이 변경될 수 있다.

기존 OpenGL, Direct3D 등을 사용하는 경우 glBlendFunc(…), OMSetBlendState(…) 등의 함수를 호출해서 Graphics Pipeline Setting을 변경하였다. 하지만, Vulkan의 경우 Graphics Pipeline Setting을 변경하는 것이 거의 불가능(Immutable)하다. 그래서 모든 Graphics Pipeline을 생성해야 한다. 이러한 귀찮은 작업으로 인해서 GPU Driver는 미리 모든 Graphics Pipeline의 정보를 알 수 있다. 덕분에 드라이버 단에서 추가적인 Optimization이 가능하다고 한다.

다음 글부터는 Vulkan에서 Graphics Pipeline을 설정하는 방법에 대해서 정리할 계획이다.


출처

  1. https://vulkan-tutorial.com/
  2. https://mkblog.co.kr/2018/08/11/gpu-graphics-pipeline/

Leave a Comment