[Game Graphics] Graphics Pipeline

Cherish·2023년 2월 3일
0

Game Graphics

목록 보기
1/1

Graphics Pipeline

3D 컴퓨터 그래픽스에서 그래픽스 파이프라인이라는 3차원 도형이나 이미지를 2차원 래스터 이미지로 표현하기 위한 단계적 방법을 의미한다.

  • 래스터(raster) : 컴퓨터에서 도형이나 이미지를 픽셀로 구성한다. 이 점들의 모습을 조합하고 일정한 간격의 픽셀들을 나열하여 하나의 화면을 표현하는 것을 의미한다.

Fixed Stage

= 프로그래밍이 가능한 단계

  • Input Assembler (IA)
  • Tesselator (TS)
  • Stream Output (SO)
  • Rasterizer (RS)
  • Output Merger (OM)

Shader Stage

= 프로그래밍없이 고정된 단계

  • Vertex Shader(VS)
  • Hull shader(HS)
  • Domain Shader(DS)
  • Geometry Shader(GS)
  • Pixel Shader(PS)

+ The Compute Shader

GPU를 병렬 프로세서로 사용하여 CPU 처리 능력을 향상시켜 빠른 계산을 수행할 때 사용된다. 그래픽스와 관련은 없지만 컴퓨팅 셰이더 파이프라인을 사용하면 GPU에서 정확한 충돌 감지와 같이 성능이 비싼 작업을 수행할 수 있다.


1. Input Assembler(IA)

입력 어셈블러는 저장된 버퍼(Vetex 및 Index 데이터를 담고 있다)의 data를 모아 삼각형, 선, 점과 같은 Geometric Primitive를 생성해준다.

  • Vertex Buffer는 Vertex data를 CPU에서 GPU로 운반하기 위한 자료구조인데, 예쁜 구조체 형태가 아닌 직렬화된 배열 형태이다. 이 데이터들을 예쁘게 조립하는 것이 목적!
  • GPU에서는 전달받은 Vertex Buffer의 Vertex data들을 삼각형과 같은 기본 도형(Primitive)로 assemble 해준다. 이때, Vertex data를 읽는 방법을 담은 Input Layout을 이용한다.
  • 조립이 완료되면 남은 pipeline에 데이터들을 넘겨준다.
    -> IA 단계에서 Index 버퍼를 이용하여 Vertex의 복제나 중복을 막아준다

2. Vertex Shaer(VS)

IA 단계에서 assemble된 primitive의 모든 vertex에 대한 연산을 한다. 이때 프로그래밍이 필요하다. Vertex Data는 3차원 (x,y,z)로 구성되는데, 우리가 눈으로 보는 화면은 2D를 보여준다. 모든 Vertex 위치를 Model Matrix-> View Matrix -> Projection Matrix로 변환하는 작업을 통해 3D Vertex 정보를 2D로 표현할 수 있도록 Vertex 정보를 수정한다.

  • Vertex 마다 transformation(변환), scaling, lighting 등의 작업을 수행한다. 모든 Vertex가 한 번씩 호출되기 때문에 작업이 필요하지 않은 경우 통과하는 셰이더를 작성한다.

3. Tessellator(TS)

Mesh의 Quality를 높이기 위해 특정 Rule에 따라 더 작은 삼각형으로 나눈다.

  • 일반적으로 가까운 거리의 물체는 고해상도로, 먼 거리의 물체는 저해상도로 표현하여 성능을 향상시킨다. 고해상도로 표현되었을 때 보여져야 할 텍스쳐 형태를 높이 맵으로 저장해두고, 실제 모델에 필요한 만큼의 레벨 만큼만 적용하는 식으로 테셀레이션을 활용하면 하나의 모델에 대해 여러 해상도의 모델 데이터를 가지고 있을 필요가 없다.
  • 메모리에는 Low-Poly Mesh를 담아두어 메모리를 절약하고 필요 시에 즉석으로 세분화하여 효율적으로 메모리를 관리할 수 있다.
  • 애니메이션이나 물리 처리 같은 연산들은 Low-Poly Mesh에서 수행하여 계산량을 줄이고, 렌더링에만 테셀레이션을 이용하여 렌더링 품질을 올릴 수 있다.
  • DirextX11 부터 도입되었다.

3-1 Hull Shader(HS)

primitive에 새 vertex를 추가하거나 위치를 계산하여 더 자세하게 만들어준 후 data를 TS, DS 단계로 보내준다.

3-2 Tessellator(TS)

HS에서 받은 data로 실제로 primitive 분할을 수행한 후 DS로 전달한다

3-3 Domain Shader(DS)

HS에서 새롭게 생성된 Vertex의 위치를 가져오고 TS에서 전달받은 Vertex를 변환하여 더 자세한 정보를 생성한다. 예를 들면 삼각형이나 선의 중심에 정점을 추가하는 방법이 있다.

4. Geometry Shader(GS)

primitive를 입력으로 받는다. 또한 인접한 primitive의 data를 parameter로 받을 수 있다. - primitive를 생성하거나 파괴하여 모델을 변경할 수 있다.

  • -> 파티클 엔진에 사용할 수 있다 / 선택적 단계로 생략 가능하다 / 프로그래밍 단계

5. Stream Output(SO)

GS단계에서(GS 단계가 비활성된 경우 VS에서) 하나 이상의 Memory Buffer로 Vertex data를 지속적으로 출력한다. 불완전한 primitive(ex. vertex가 2개인 triangle, vertex가 하나인 line)는 출력되지 않고 무시된다.

6. Rasterizer Stage(RS)

3D graphic을 실시간으로 표시하기 위해 vector 정보를 래서터 이미지로 변환해준다

  • 클립 스페이스의 정점 데이터를 전달받아 fragment를 구성하고, 화면에 출력할 픽셀들을 찾아낸다.
  • fragment = 픽셀 하나의 색상을 화면에 그려내기 위한 정보를 담고있는 데이터

7. Pixel Shader(PS)

픽셀마다 한 번씩 PS를 호출하여 조명, 그림자, 투명도 등의 처리를 해주어 픽셀을 수정한다. 처리가 필요없는 경우 NULL 셰이더를 지정할 수 있다. 이 단계를 사용하면 풍부한 음영 기술을 사용할 수 있다.

  • PS는 각 픽셀들의 색상과 깊이 값을 출력으로 전달한다. 깊이 값은 Z-Buffer에, 색상 값은 Color Buffer에 저장된다. 이런 Buffer들을 통칭하여 Screen Buffer라고 한다.
    -> 선택적 단계

8. Output Manager(OM)

파이프라인 상태, pixel fragment와 depth/stencil buffer를 받아서 내용을 조합하여 렌더링 대상에 실제로 기록되는 픽셀을 결정하고 최종으로 표현될 픽셀 색을 생성한다.

  • 픽셀들을 화면에 출력하기 위한 마지막 연산들을 수행한다 - ex) Z-Test, Stencil Test, Alpha Blending
  • 각 픽셀의 위치마다 여러 오브젝트의 픽셀이 겹쳐 있을 수 있는데, OM단계에서 겹치는 픽셀들을 연산하여 최종 색을 결정한다.

Reference

0개의 댓글