기술(Tech, IT)/컴퓨터 그래픽스 (Computer Graphics)

[CG] Progammable Graphics Pipeline

Daniel803 2023. 9. 30. 05:12

 우선 Graphics Pipeline의 정의에 대해 살펴보면, 전달된 그래픽 데이터를 3D 표현에서 스크린 위에 2D 픽셀로 변형하는 연속된 단계를 말하고, 요즘엔 기존 Fixed-function pipelines가 아닌 Programmable Graphics Pipeline이 사용된다. 한 교수 Programmable Graphics Pipeline을 vertex/line/triangle의 3D 데이터에서 2D 스크린으로의 여정으로 표현한다. 

 

 Programmable Graphics Pipeline은 이전에 사용된 Fixed-function pipelines와 비교해 그래픽 하드웨어가 데이터를 처리하는 방식에 변화를 가져왔다. Fixed-function pipelines 시대에는 개발자가 그래픽 하드웨어가 그래픽을 처리하고 rendering하는 방식을 제한적으로만 제어할 수 있었으며, 대부분의 작업이 미리 정의되어 있었다. Programmable Graphics Pipeline이 등장하면서 개발자는 shader라는 작은 프로그램을 사용해 rendering 프로세스의 상당 부분을 직접 만질 수 있게 됐다.

 

 아래는 OpenGL 공식 홈페이지의 Rendering Piepeline 그림이다.

각 단계에 대해 간단히 살펴보자.

  1. Vertex Specification
    : 가공되지 않은 vertex 데이터를 제공하는 단계로, vertex buffers에 주로 저장된다. 여기에는 positions, normals, texture coordinates, colors 등의 정보가 포함돼 있다.
  2. Vertex Shader
    : Pipeline의 첫 번째 programmable (프로그래밍 가능) 단계로, 각 vertex를 처리하고 일반적으로 object space (model space)에서 clip space로 변환을 담당한다.
  3. Tessellation (Optional)
    : shader의 하나로 3단계로 나눌 수 있는데, 간단하게 역할에 대해 정의하자면 3D 모델에 더 많은 디테일이나 부드러움을 제공하기 위해 표면을 작은 모양 (주로 삼각형)으로 세분화한다.
  4. Geometry Shader (Optional)
    : 또 다른 programmable (프로그래밍 가능) 단계로, input으로 받은 primitives (like triangles or lines, 삼각형이나 선 같은) 를 수정, 복제, 버리기 등의 처리를 한다. 요즘 그래픽 프로그래밍에서 성능 측면을 고려했을 때 자주 사용되지는 않지만, 특정 효과나 연산을 위해서 사용되기도 한다.
  5. Vertex Post-processing
    : 기본적으로 "clip space"에서 "NDC (nomalized device coordinates, 정규화된 장치의  좌표)"로 변환하고 clipping (자르는) 작업을 수행한다.
  6. Primitive Assemlby
    : vertex를 그룹화 하는 단계로, 3개의 vertex를 하나로 묶어 삼각형으로 만드는 것과 같은 처리를 한다.
  7. Rasterization
    : non-programmable (프로그래밍 불가) 단계로, 가공된 vertex를 fragment로 변환해, 어떤 fragment가 화면에 표시될지 결정한다.
  8. Fragment Shader (Pixel Shader)
    : 또 다른 Programmable (프로그래밍 가능한) 단계로, 각 fragment의 색과 깊이를 결정하고, texture sampling, 조명 계산, 다른 시각 효과 등에 관여한다.
  9. Per-Sampling Operations
    : 깊이 및 stencil* 테스트, blending (블렌딩, 새 fragment와 기존 pixel의 색을 결합하는 작업), 그리고 마지막으로 framebuffer에 색상 값 write가 포함된다.

* stencil
: 별도의 "stencil buffer"를 기반으로 이미지 또는 장면의 어느 부분을 그리거나 수정할지 제어할 수 있는 도구

 

 

참고

- https://www.khronos.org/opengl/wiki/Rendering_Pipeline_Overview

- https://en.wikipedia.org/wiki/Graphics_pipeline

- https://math.hws.edu/graphicsbook/c6/s1.html

- https://www.youtube.com/watch?v=kCDBzuMWTYA&list=PLvv0ScY6vfd9zlZkIIqGDeG5TUWswkMox&index=8