본문 바로가기

유니티 쉐이더 스타트업

[ 유니티 쉐이더 스타트업 ] 03 - 2 . 렌더링 파이프 라인 - 레스터라이저와 프래그먼트 셰이더

[ 레스터라이저]

[직전의 상황]

버텍스쉐이더에서 정점3개를 클립공간의 정점3개로 변환하여 레스터이저에게 전달함

레스터라이저는 전달받은 정점으로부터 삼각형을 구성하고,

삼각형을 채우는 프래그먼트를 생성하여 프래그먼트 쉐이더에게 전달할 것이다 .

 

[ 레스터 라이저 ]

이때 , 프리미티브란 원시적인 도형을 말한다 . 스캔변환은 정점들도부터 프리미티브 생성 ,

프리미티브를 채우는 점들을 찾아낸다 .

레스터라이저는 생성된 프래그먼트의 값들을 정점들 사이 어떤 위치에 있냐에 따라 보간하여 값 결정한다 .

 

뷰포트 변환

2*2*1짜리 직육면체 공간에 있던 정점들을 스크린에 대응되는 공간인 스크린 공간으로 옮겨준다 .

스크린 공간은 실제 윈도우 화면(창의 해상)에 맞춰서 구성된다 .

뷰포트 변환을 적용하게 되면 공간의 범위가 스크린에 맞추어져 옮겨간다 .

다만 , 깊이를비교할때 사용하는 z값은 0-1로 그대로 유지된다 .

 

결론적으로 스크린 공간으로 옮겨간 3개의 정점은 다음과 같이 구성된다 

이제 레스터라이저는 3개의 정점으로 이루어진 삼각형을 채우는 점들을 찾아낸다 

이를 스캔변환이라고 한다

화면은 수많은 픽셀의 집합 , 이 정점 3개로 이루어진 삼각형에 포함되는 픽셀 위치를 찾아 픽셀을 칠해줄것이다 .

즉 , 소묘법 실행의 준비과정과 같다 . 이 스캔변화의 결과물을 프래그먼트라고 한다 .

프래그먼트 파편 는 픽셀의 후보를 의미한다 .

프레그먼트는 픽셀의 예비군이다 . 현재 생성된 프래그먼트가 다른 프래그먼트와의 경쟁으로 최종 픽셀로 사용 못되고 탈락 할 수 있음 (겹침)

 

여튼 위와 같이 프래그먼트는 생성, 이 프래그먼트를 생성하는 알고리즘은 GPU에 내장 , 건들지 못한다 .

또한 정점의 개수보다 프래그먼트의 개수가 더 많다

레스터 라이저는 보간 역시 중요한 역할이다

예시와 같이 , 색상값의 보간을 통해 프래그먼트의 컬러를 정해준다 .

결국 이런 식의 분포를 가짐. 이외에도 UV좌표 , 노말등 다른 속성들도 보간한다 .

레스터라이저가 정점들을 구성하는 프리미티브로부터 프래그먼트 생성, 프래그먼트 쉐이더로 전달된다 .

 

[ 프래그먼트 쉐이더 ]

[ 프래그먼트 쉐이더 ]

전달받은 프래그먼트에 어떤 색을 채울지 결정한다

래스터라이저가 전달한 프래그먼트 수만큼 각각 실행될것이다 300개의 프래그먼트 -> 300번의 프래그먼트 쉐이더 실행

프래그먼트 쉐이더의 출력값은 프레임 버퍼에 쓰여질 컬러 깊이값

기본적으로 프래그먼트 쉐이더의 출력은 각 프래그먼트에 대응되는 픽셀에 대한 컬러값이다 .

컬러값들은 프레임버퍼에 컬러버퍼에 쓰게되고 컬러버퍼를 GPU가 읽어 화면에 1프레임마다 그릴 것이다 .

프레그먼트의 셰이더의 입력으로 들어올 즉 ,버텍스 쉐이더와 레스터라이저를 거쳐 정점으로부터 생성된 프래그먼트의 구성을 (그 구조체)를 직접 선언 , 구성 가능하다 .

각 프레그먼트의 정점 컬러를 그대로 사용하는 프래그먼트 쉐이더

x값에 따라 최종색을 결정하는 프래그먼트 셰이더와 결과

 

프래그먼트 셰이더는 이미 위치가 결정된 프래그먼트를 받아서 각 프래그먼트의 색의. 결정, 컬러버퍼에 전달하는 방식으로 화면에 그려지도록 한다

 

이렇게 최종 화면에 그려지기전 한 단계가 남아있다 .

 

[ 출력병합 ]

[ 출력병합]

렌더링 파이프라인의 마지막 단계인 출력병합은 불투명도의 알파A / 깊이값 Z를 통해 각 프래그먼트를 픽셀로서 사용할지직전까지 컬러버퍼에 쓰인 값과 혼합하여 쓸지 탈락시킬지 결정한다

 

위의 예시는 Z값에 따라 파란색의 프래그먼트가 동일한 위치의 픽셀의 컬러와 경쟁하여 컬러버퍼에 들어가지 못하고 탈락함을 보여준다 .

 

(일부분임)