26 June 2022

렌더링 파이프라인

by 꽈배기

위대한 일은 하루 아침에 이루어지지 않는다


3차원 이미지를 우리가 보는 평면 모니터에 2차원 래스터 이미지로 표현하기 위한 단계를 뜻함.

렌더링 과정

물체는 각 단계의 좌표 행렬을 매트릭스 연산을 통한 변환을 거쳐
최종적으로 그려진다.
  1. 오브젝트 데이터 받아오기
  2. 버텍스 쉐이더
  3. 래스터라이저
  4. 프래그먼트 쉐이더

목차

  1. 정점 데이터 받기
  2. 버텍스 쉐이더
  3. 래스터라이저
  4. 프래그먼트 쉐이더 / 픽셀 쉐이더

정점 데이터 받기

버텍스 쉐이더에 입력할 수 있는 정점 값을 받아오는 과정.

정점 데이터는 GPU에 의해 병렬 처리되는데, 이 과정을 수행하도록 CPU의 그래픽스 API 를 초기화 명령이 필요하다.

정점이 뭐에요?

물체는 삼각형의 메쉬로 구성되는데, 이 삼각형을 이루는 각각의 점을 정점이라고 한다!

vertex

그래픽스 API의 구성으로는 GPU 디바이스, 커맨드 큐, 커맨드 버퍼 로 구성된다.
CPU는 GPU 디바이스와 커맨드 큐를 생성하여 커맨드 큐에 커맨드 버퍼를 쌓게 되는데, 커맨드 큐는 GPU 디바이스와 연결되어 정점 데이터를 넘겨준다. 이때 데이터는 CPU의 RAM에서 GPU의 VRAM으로 업로드된다.

왜 이런 방식을 사용하나요?

GPU가 CPU에 의해 실행 지연되는 경우를 최소화하기 위해 버퍼를 쌓아두는 방식을 이용한다!

렌더링 파이프라인에 사용될 속성들을 가진 렌더링 파이프라인 상태 오브젝트는 여러개로 생성되며, 렌더링 파이프라인 서술자가 정점 데이터, 버텍스쉐이더, 프래그먼트 쉐이더를 포함하고 있다.

드로우 콜이란?

CPU가 GPU로 전달할 명령을 생성하는 단계, 오브젝트를 그리는데 필요한 명령들의 집합을 말함!

정점은 구조체로 [위치, 컬러, 노말, 텍스처의 좌표]등을 포함하여 구성되는데, 전달받은 정점 데이터가 전달될 때는 구조체가 아닌 스트링 버퍼 형식으로 데이터를 전송시킨다.

이 스트링 버퍼는 정점 조립과정을 거쳐 버텍스 쉐이더에 인자로 넣어진다.


버텍스 쉐이더

전달받은 정점 인자를 이용하여 오브젝트를 그려질 화면의 위치로 전달하는 과정.

버텍스 쉐이더는 위치 변환과정을 거칠때 행렬 연산을 수행하여 좌표를 변환한다.

모델 곱하기 행렬 결과
오브젝트 좌표 모델 행렬 월드 좌표
월드 좌표 카메라 행렬 카메라 좌표
카메라 좌표 투영 행렬 투영 좌표

행렬 연산은 한번에 수행!

그려야 할 삼각형이 100개라면, 300개의 정점을 가지고 있다. 이때 행렬 연산을 순차적으로 진행하게 될 시 300 * 월드 행렬 * 카메라 행렬 * 투영 행렬 만큼의 정점 연산을 수행하게 된다!
반면, 하나의 행렬로 묶어 연산한다면 현저히 줄어듬!

행렬 수행 과정

모델 행렬연산 과정

:sleeping: 이게 무슨말인가 싶겠지만 천천히 확인해보자

1.오브젝트 공간

모델의 피봇이 원점인 상태, 스스로가 세상의 중심인 공간

2.월드 공간

모델이 모델 행렬 연산을 통해 변환된 공간, 절대 좌표 위치를 기준으로 모델의 위치가 정해짐

3.뷰/ 카메라 공간

월드 공간에 카메라 행렬을 연산한 공간, 월드상의 정점 위치를 카메라의 상대적인 위치로 옮김
시야와 원근감이 존재하지 않음

4.투영 공간

카메라 위치 기준 공간을 카메라 시야(화면) 기준으로 변환된 공간으로 원근감이 존재함.


Tessellation

tessellation 렌더링이 가능한 최소 단위로 분할하는 작업. 메쉬를 형성할때 삼각형으로 쪼개진 모습을 볼수 있다. tessellation은 이처럼 큰 patch를 수많은 primitive 조각들로 쪼개는 과정이다.

  1. Tessellation Controll Shader
    patch를 primitive로 쪼갤때의 수준을 결정한다.
    제어 포인트 위치 및 기타속성, 사용자 정의를 포함해 생성함.

  2. Fixed-funtion tessellation Engine
    patch를 더 작은 primitive로 분배하는 방법을 결정함.

  3. Tessellation Evaluation Shader
    tessellation 연산의 결과를 받고, 보간할 위치를 연산하는 과정.


Geometry Shader

geometry-shader
vertex shader를 인자값으로 사용하는 셰이더로, 하나의 primitive에 대응하는 연산을 수행한다.
입력받은 primitive에 대한 위치 변환, 생성, 삭제가 가능하며 프로그래머블한 쉐이더!

:cat: geometry shader를 이용하면 동물의 털 같은 재질을 쉽게 표현할수 있다 :dog:


Clipping

clipping

뷰 좌표에 Projection Matrix 연산을 수행하는 과정에서
clip space 이외 영역 물체를 그리지 않는 과정.  

clipping은 clip space 공간에서 실행되는데, 쉽게 말해 카메라로 사진을 찍을때 화면 밖의 물체는 어차피 안보이므로 그려줄 필요가 없기에 잘라내는 것이다.

또한, clipping은 동차좌표를 이용한 4차원 (x,y,z,w)좌표에서 실행된다. 어차피 3차원 좌표로 할수 있는데 왜 굳이 4차원 좌표계를 사용할까?

orthographics-and-persfective 여기엔 몇가지 이유가 있는데 첫번째는 투영이 포함되기 때문이다.

원근감은 w의 값을 기준으로 0이면 Orthographic 직교 투영, 아닐경우 Perspective 원근 투영으로 결정된다. 위 사진을 보면 물체가 카메라에 투영될때 원근감의 차이를 확인할 수 있다. 그리고 기본적으로 정점 변환을 위한 연산은 매트릭스 행렬의 곱셈으로 나타내지는데 가령.

1. 변환의 이점

정점을 이동시킬때 행렬은 벡터 정보를 사용한다. 벡터는 1x4 matrix의 형태인데, 여기 곱해질 행렬이 4x4 matrix 가 아닐경우 행렬의 곱셈이 적용되지 않는다. 이렇듯 계산의 편의성을 위해 3차원에 w를 포함한 동차좌표계를 사용한다.

2. point와 vecotr

w의 값이 필요한 이유는 또 한가지 벡터의 속성을 판단하기 쉽기 때문이다. (x,y,z)인 3차원 좌표계의 경우 point인지 vector인지 판단하기 어렵기에 w가 0일때 vector를 1일때 point를 나타낸다.

3. 원근 표현

w값은 [0~1]의 범위를 가지는데 0일 경우 직교투영, 1일경우 원근투영이다.
만약, w의 값이 n이라면 모든 요소의 값을 n으로 나누어주는 과정을 거치며 정규화가 된다. 정규화는 perspective divide 작업으로 NDCS(정규화 좌표)가 생성된다.


Perspective divide

perspectivedivide
원근법을 구현하는 과정으로 뷰 좌포계에 투영 행렬을 곱해 NDCS (정규좌표계)가 만들어진다.
분할은 w 좌표계를 기준으로 전체 요소를 나누어 원근분할을 수행.


culling

최적화를 위해 보이지 앟는 부분을 제거하는 기능으로, 와인딩 순서 알고리증을 사용한다.

와인딩이란?
다각형을 구성하는 버텍스간의 순서를 와인딩 순서하고 한다!

culling


Viewport transform

뷰포트 변환
뷰포트 변환은 NDCS(정규화좌표) 결과를 각각의 출력 장치에 매핑하는 단계이다.

모니터 기준으로 width가 x, height가 y에 영향을 받으며, 평면에 그려질 도형의 순서는 Z 버퍼 테스트를 통해 결정되며 3D 공간에서 View volume에 존재하는 객체들을 Projection Plane에 투영하여 모니터에 출력한다.

뷰포트 변환에서는 윈도우와 윈도우 내에 출력 공간을 지정할 viewport가 필요하다.


Scan conversion

주사변환
주사변환은 래스터화라고도 한다. 내가 그릴 그래픽스 객체를 디스플레이에 표시하기 위해 픽셀 데이터로 변환하는 과정을 뜻한다.


Z 버퍼 테스트

그려야 할 물체의 픽셀들이 다른 물체보다 앞에 있는지 판단하기 위한 테스트 기법  

z버퍼테스트

Z read와 Z write로 나뉜다.


stencil test

fragment가 폐기될지 안될지를 판단하는 과정이다.

stencil
stencil buffer는 0과 1로 구성되는데 stencil의 값이 1인 fragment 영역만을 렌더링하고 나머지는 폐기시킨다.


alpha blending

alpha blending

알파 블렌딩이란?

서로 다른 두개의 물체의 RGBA에 섞어 결과물을 산출해내는것

알파블렌딩이 적용된 개체는 깊이 버퍼에 따라 차페가 결정된다.
차폐를 결정하는 방법으로는.

두 방식을 적절히 사용하는것이 좋음!

tags: Shader, Graphic