Graphics Pipeline

물체를 화면에 그리는데 필요한 과정을 의미한다.

우리가 이용하는 모니터에서 3D 영화나 게임이 재생될 때 사용자는 3차원 물체를 모두 그린다고 착각할 수 있지만

실제로 화면에 그려지고 있는 것은 자원의 효율적인 활용을 위하여 2차원의 형태를 그리고 있는 것이다.

이렇게 3차원의 정보를 2차원의 형태로 변환하고 모니터에 찍어내기 위해 필터링 과정을 거치는 작업을

그래픽스 파이프 라인이라고 한다.

 

본 글에서는 DirectX 11을 기준으로 서술할 예정이고

DX9 나 OpenGL은 세세한 부분은 다르지만 큰 틀에서 보면 비슷하다고 하기에 따로 정리하진 않을 예정이다.

 

Pipelines for Direct3D Version 11 from MS Documentation

마이크로소프트에서 제공하는 도큐먼트에서는 상기 이미지와 같이 그래픽스 파이프라인을 정리하였다.

가장 눈에 띄는 것은 Hull Shader에서 Domain Shader 까지의 과정이다.

이 과정을 Tessellation(테셀레이션) 과정이라고 하며 D9에서 D11로 넘어오면서 추가된 기능이다.

'테셀레이션'은 '쪽매붙임' 이라고도 하는데 바닥에 타일을 깔때 빈틈이 생기는 부분을

더 작은 조각으로 채우는 기법에서 유래된 듯하다.

(옛날부터 있던 기법인데 환경의 문제 때문에 D11이 되서야 실현 가능해졌다고 한다.)

 

이 외에 Vertex Shader, Geometry Shader, Rasterizer, Pixel Shader 등의 과정은 이전 버전에도 존재했으며

각각, 입력받은 정점 정보를 토대로 수학적인 효과를 부여한다거나 (Vertex Shader)

그 처리된 정점을 추가/제거 하여 정점 수를 조절하고 선, 삼각형을 생성한다거나 (Geometry Shader)

만들어진 결과물을 화면에 띄우기 위해 픽셀 이미지화 시키고 다듬고 (Rasterizer)

래스터화 된 이미지의 픽셀들의 색을 계산하는 역할을 한다. (Pixel Shader)

 

 

Graphics pipeline - Win32 apps

This section describes the Direct3D 11 programmable pipeline.

learn.microsoft.com

 

'Computer Science > Computer Graphics' 카테고리의 다른 글

[Computer Graphics] 셰이더의 종류  (0) 2022.10.27

0. Shader

컴퓨터 그래픽스 분야에서 셰이더(shader)는 소프트웨어 명령의 집합으로

주로 그래픽 하드웨어의 렌더링 효과를 계산하는 데 쓰인다.

셰이더는 그래픽 처리 장치(GPU)의 프로그래밍이 가능한 렌더링 파이프라인을 프로그래밍하는 데 쓰인다.

 

1. Vertex Shader

버텍스 셰이더는 주로 물체의 정점 정보에 수학적인 연산을 함으로써 물체에 특별한 효과를 주는 데 쓰인다.

각각의 정점이 정의되는 방법은 다양하다. 정점이 가지는 정보는 예를 들어 3차원의 위치를 나타내는 x, y, z 좌표나,

색상, 텍스처, 조명 정보 등이 있다. 버텍스 셰이더는 이런 정점의 정보값을 변화시켜서,

물체를 특별한 위치로 옮기거나, 텍스처를 바꾸거나, 색상을 바꾸는 등의 일을 할 수 있다.

하지만 기존의 정점을 지우거나 새로운 정점을 추가하는 등의 작업은 할 수 없다.

 

2. Geometry Shader

지오메트리 셰이더는 버텍스 셰이더에서는 할 수 없는 점이나, 선, 삼각형 등의 도형을 생성할 수 있는 기능이 있다.

지오메트리 셰이더 프로그램은 버텍스 셰이더가 수행되고 난 뒤에 수행된다. 지오메트리 셰이더 프로그램은 

버텍스 셰이더를 거쳐온 도형 정보를 입력받는데, 예를 들어 정점 3개가 지오메트리 셰이더에 들어오면,

셰이더는 정점을 모두 없앨 수도 있고 더 많은 도형을 만들어 내보낼 수도 있다.

지오메트리 셰이더를 지나간 도형 정보는 레스터라이즈를 거친 뒤 픽셀 셰이더를 통과하게 된다.

지오메트리 셰이더는 테셀레이션이나 그림자 효과, 큐브 맵을 한번의 처리로 렌더링하는 데에 주로 쓰인다.

지오메트리 셰이더는 어셈블리어나, Cg, HLSL, GLSL 등으로 프로그래밍할 수 있다.

지오메트리 셰이더는 DirectX 10 버전부터 시작되었으므로, DirectX10 버전 이상의 HLSL로만 프로그래밍 할 수 있다. OpenGL 은 3.2 이상부터 GLSL 로 프로그래밍 할 수 있다.

 

3. Fragment Shader

프래그먼트 셰이더는 오브젝트가 화면에서 차지하고 있는 모든 픽셀마다 실행되는 프로그램이며

보통 각 픽셀의 컬러를 계산하고 출력하기 위해 사용된다. 화면에는 보통 수백만 개의 픽셀이 있으며

프래그먼트 셰이더는 이 모든 픽셀에 대해 실행된다.

프래그먼트 셰이더를 최적화하는 것은 전반적인 게임 성능에 있어 매우 중요한 부분이다.

 

4. Pixel Shader

픽셀 셰이더는 렌더링 될 각각의 픽셀들의 색을 계산한다.

때문에 픽셀 셰이더는 최종적으로 픽셀이 어떻게 보일지를 결정한다.

픽셀 셰이더는 간단하게 언제나 같은 색을 출력하는 간단한 일에서부터, 텍스처로부터 색을 읽어오거나,

빛을 적용하는 것, 범프 매핑, 그림자, 반사광, 투명처리 등 복잡한 현상 등을 수행할 수 있다.

픽셀 셰이더는 각각의 픽셀들이 렌더링될 때 수행되기 때문에, 다른 픽셀들과 아무런 연관이 없다.

픽셀 셰이더는 오직 한 픽셀만을 연산하기 때문에, 주변의 픽셀이나, 그리는 도형에 대한 정보를 알 수 없다.

이 때문에 픽셀 셰이더는 스스로 매우 복잡한 효과를 만들어 낼 수는 없다.

픽셀 셰이더는 픽셀의 색 말고도 깊이(Z버퍼에 쓰인다)나 또 다른 색(다른 렌더 목표물에 쓰인다)을 출력할 수 있다.

 

'Computer Science > Computer Graphics' 카테고리의 다른 글

[Computer Graphics] Graphics Pipeline  (0) 2022.11.08

+ Recent posts