GPU 파이프라인

GPU 파이프라인 개요

앞서 설명한 그래픽 렌더링 파이프라인 단계를 보다 세부적으로 나누어본다. 아래 순서대로 정리.

  1. 버텍스 셰이더 - 프로그래밍 가능
  2. 테셀레이션 - 프로그래밍 가능, 선택적
  3. 지오메트리 셰이더 - 프로그래밍 가능, 선택적
  4. 클리핑 - 고정 함수 하드웨어
  5. 화면 매핑 - 구성만 가능
  6. 삼각형 탐색 & 설정 - 고정 함수 하드웨어
  7. 픽셀 셰이더 - 프로그래밍 가능
  8. 병합 - 구성만 가능

별도로 컴퓨트 셰이더 존재. 모바일에서는 일부 지원하지 않는 기능 존재.

프로그래밍 가능한 셰이더 단계

통합된 데이터 설계 → 정점, 픽셀, 지오메트리 구조, 테셀레이션 관련 셰이더가 공통 프로그래밍 모델 공유 → 내부적으로 동일 명령 집합구조(ISA, Instruction Set Architecture) 보유.

셰이더 프로그래밍은 HLSL(DirectX), GLSL(OpenGL)을 사용해 프로그래밍 → IL로 변환(하드웨어 독립성) → 드라이버에서 특정 GPU의 ISA로 변환.

드로우 콜 → 기본체 집합을 그리는 그래픽 API 호출 → 파이프라인 실행. 이 때 입력되는 타입은 varying, uniform 두 가지가 있다. 광원의 컬러는 uniform, 삼각형 위치는 varying이라고 할 수 있다.

셰이더 가상머신 아키텍처를 보면 3개의 입력, 1개의 입출력, 1개의 출력으로 구성된다.

  • 입력
    • 다양한 입력 레지스터(입력이 자주 변하기에 필요 수량 제한 → 크기 작음)
    • 고정 레지스터(한 번 저장해서 재사용되기에 대용량)
    • 텍스처
  • 입출력
    • 임시 레지스터(색인용)
  • 출력
    • 출력 레지스터

이 부분 이미지 참고 요망. 저작권때문에 가져오지는 않음.

프로그래밍 가능한 음영과 API의 진화

진짜 발전 역사이다. 따로 정리할 필요는 없고 교양 수준으로 알고 있으면 될 듯.


파이프라인 순서대로

1) 버텍스 셰이더

삼각형 메시는 정점의 집합으로 표현되며 각 정점은 모델 표면 위의 특정 위치, 컬러, 텍스처 좌표, 법선벡터와 같은 정보에 연결된다. 이 때 법선벡터는 삼각형 표면에 대한 단일 법선이 아닌 각 정점에 대한 법선이다. 버텍스 셰이더는 이 정점들을 독립적으로 처리하기 때문에 병렬로 사용할 수 있다. 아래와 같은 일들을 한다.

  • 오브젝트 생성 - 동일 오브젝트라면 메시를 한 번만 생성 후 변형해서 사용.
  • 절차적 변형 - 깃발, 옷, 물과 같은 움직임
  • 입자 생성
  • 렌즈 왜곡 - 아지랑이, 물방울 등

연산 결과는 그대로 파이프라인으로 이어지지만 스트림 출력 기능을 통해 바로 래스터라이제이션 단계로 넘어가지 않고 스트림에 결과를 출력할 수도 있다. 메모리가 많이 소모됨.

2) 테셀레이션

효율적 곡면 렌더링. GPU는 각 표면 정보를 받아 삼각형 집합으로 변환하는데, 단순히 모든 삼각형을 표현하는 것이 아니라 적절한 수의 삼각형 표현을 통해 병목 현상 방지 및 메모리 절약을 목표로 한다. 멀리있는 물체는 적은 수의 삼각형으로, 가까운 물체는 많은 수의 삼각형으로 표현하는 것.

3가지 요소로 구성된다(DirectX기준 명칭).

1) 헐 셰이더

헐 셰이더는 테셀레이터와 도메인 셰이더에 각각 정보를 보낸다.

곡면 제어점 정보가 있는 패치(patch)기본체를 입력받음. → 테셀레이터에게 생성해야 할 삼각형의 수와 설정 전달 → 제어점 처리(추가 or 제거 가능) → 도메인 셰이더에 제어점 집합 출력

2) 테셀레이터

테셀레이터는 헐 셰이더로부터 정보를 받아 연산 후 도메인 셰이더로 보낸다. 오로지 테셀레이션 셰이더만 사용하는 고정 함수 단계.

헐 셰이더로부터 테셀레이터 정보(무슨 표면을 원하는가), 테셀레이션 인자(TF, 테셀레이션을 내부에서 얼마나 실행할 것인가, 외부 엣지를 얼마나 쪼갤 것인가) 전달 받음. → 무게 중심 좌표 할당.

3) 도메인 셰이더

도메인 셰이더는 테셀레이터와 헐 셰이더로부터 정보를 받는다. 테셀레이터의 각 입력 정점이 처리되고, 대응하는 출력 정점을 생성한다. → 삼각형 생성.

3) 지오메트리 셰이더

점, 선분, 삼각형 등의 기본체를 확장된 기본체로 변형시키는 것. 입력 데이터를 변경하거나 제한된 수의 복제본을 생성하고자 설계되었다. 고품질 그림자 생성을 위한 그림자 맵, 털 렌더링 등에 사용된다.

입력한 순서대로 기본체를 출력하기 때문에 성능에 영향을 준다. GPU의 장점인 병렬 작업에 잘 맞지 않기 때문.

4) 중간 부분

이 위의 3개는 프로그래밍 할 수 있는 영역이다. 그러나 중간의 클리핑, 화면 매핑, 삼각형 탐색및 설정은 고정된 부분이기에 바로 픽셀 셰이더로 넘어간다.

5) 픽셀 셰이더

상수, 텍스처 데이터, 보간된 꼭짓점별 값 및 기타 데이터를 조합하여 픽셀별 출력을 산출하는 단계. 픽셀별 조명 및 후처리 등을 사용할 수 있다.

앞서 진행한 연산의 결과인 삼각형이 어떠한 픽셀을 얼마나 덮는지 계산한다. 삼각형의 표면에 대해 각 픽셀마다 계산을 진행하는데, 원근 보정 보간 등 다양한 보간을 사용한다.

입력에 대하여 픽셀 셰이더는 투명도 값 생성 및 z깊이 변경이 가능하다. 이는 병합 과정에서 해당 픽셀에 무엇이 저장되는지 확인하는데 사용된다.

입력 프래그먼트를 버리기 위해 출력을 하지 않는 기능 또한 존재한다. 이는 곧 클리핑과 같으며 클리핑 볼륨을 AND, OR연산하는 것을 통해 오브젝트를 자르는 효과를 나타낸다.

관련되서 배우고 정리할 내용이 많다! 차근차근 알아볼 예정.

6) 병합 단계

개별 프레그먼트의 깊이와 컬러가 프레임 버퍼에서 병함되는 곳. 컬러 혼합 또한 이 단계에서 연산하여 불투명의 경우 위의 색을 덮어씌우고 투명의 경우 합성.

Early-Z라는 기능이 있다. 픽셸 세이더까지 처리를 해뒀는데 z버퍼 적용 이후에 가려지면 연산 낭비가 아닌가? 그래서 픽셀 셰이더 이전에 z값을 사용해 뷰 테스트를 하고, 감춰진걸 잘라내는 기능이다.

+) 컴퓨트 셰이더

GPU를 비그래픽적 목적으로 사용하는 것을 GPU 컴퓨팅이라고 한다. 대표적으로 딥러닝의 신경망이 있다. 그래픽 카드의 병렬 처리 능력으로 복잡한 계산을 수행하거나 데이터 처리를 가속화 하기 위해 사용한다.

GPU에서 생성한 데이터를 CPU로 보내지 않고 GPU에서 그대로 연산하기에 속도가 빠르다. 메시 처리, 파티클 시스템 등에 사용되는데, 머리카락이 흔들리는걸 생각해보자.

여담

1) 헐 셰이더(Hull Shader) 이름의 유래

헐 셰이더는 외형 정의 및 물체의 외곽선을 결정하는데 사용된다. 여기서 Hull은 배의 외부를 둘러싸는 구조물인 Hull에서 유래되었다. 아래 이미지에서 파란게 Hull이다.

Untitled

2) 테셀레이터 이름의 유래

라틴어 “tessellatus”에서 비롯되었으며, 이는 “작은 돌조각”, “모자이크 형태로 늘어놓은 것”을 의미한다고 한다. 표면을 더 작거나 큰 조각의 합으로 구성하는 작업이 테셀레이션.

출처