본문 바로가기
그래픽스ㆍDirectX

렌더링 파이프라인 - 래스터라이저와 프래그먼트 셰이더

by imagineer_jinny 2022. 5. 21.

유니티 셰이더&렌더링 에센스 E04 : 렌더링 파이프라인 (3/3) - 래스터라이저와 프래그먼트 셰이더 - YouTube

 

렌더링 파이프라인 - 래스터라이저와 프래그먼트 셰이더

 

레스터라이저에서는 기본적으로 전달받은 정점들로부터 삼각형을 구성하고

그 삼각형을 채우는 프래그먼트를 생성해서 프래그먼트 셰이더에게 전달하게 됨

 

 

레스터라이저

- 뷰포트 변환: 클립공간(NDC) -> 스크린 공간

- 스캔 변환: 프리미티브(삼각형)를 이루는 프래그먼트 생성

- 정점들의 값을 보간하여 프래그먼트의 속성 값들을 결정

 

 

뷰포트 변환

클립 공간(NDC) -> 스크린 공간

정규화된 공간 -> 스크린(윈도우 화면)에 맞춘 공간으로 변형

 

즉, 2 x 2 x 1 짜리 직육면체 공간에 있던 정점들을 스크린에 대응되는 공간인 스크린 공간으로 옮겨줌

x, y 범위가 -1 ~ 1 사이라서 2 x 2의 가로 세로 길이를 가지던 클립 공간과 달리 스크린 공간은 가로 세로 길이가 실제 윈도우 화면에 맞춰서 계산됨

즉, 창의 해상도에 맞춰진다는 얘기임

 

 

직전까지의 결과에 뷰포트 변환을 적용하게 되면 클립 공간에 있던 정점들이 -1~1 사이의 x, y 값이 아니라 

공간의 범위를 좌측 상단이 (0,0), 우측 하단을 화면의 가로와 세로 길이인 (500,500)으로 구성하게 되는 스크린 공간으로 옮겨가게 됨

다만 z 값은 0~1 값으로 유지됨. 이건 깊이를 비교할 때 사용됨. 즉 누가 앞에 그려지고 누가 뒤에 그려질지 결정할 때 사용됨

 

스크린 공간으로 옮겨간 세 개의 정점은 이렇게 표현이 됨

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

그걸 스캔변환이라고 함

 

 

스캔 변환

- 정점 세 개 -> 이것으로는 화면을 채울 수 없다

- 정점으로 이루어진 프리미티브(삼각형)를 채우는 프래그먼트 생성

 

프래그먼트: 픽셀 후보

프래그먼트

 

보간

- 정점들 사이에 위치한 프래그먼트들의 속성 값을 보간을 통해 결정

- 레스터라이저의 가장 중요한 일

- 레스터라이저는 정점 컬러 이외에, UV 좌표, 노말 등 다른 정점 속성들도 보간함

 

 

레스터라이저가 수많은 프래그먼트들을 생성한 후 그 프래그먼트들은 프래그먼트 셰이더로 전달되게 됨

 

 

프래그먼트 셰이더

 

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

- 래스터라이저가 전달한 프래그먼트 수만큼 실행

 

예를 들어 300개의 프래그먼트가 전달되었다면 프래그먼트 셰이더가 300번 실행됨

 

 

프래그먼트 셰이더의 출력

- 프레임 버퍼에 쓰여질 컬러 값

- 깊이값(Z)

 

이 컬러 버퍼를 나중에 GPU가 읽어서 화면에 매 프레임마다 그리게 됨

 

입력

 

 

컬러 버퍼에 전달된 컬러들은 최종 화면에 그려지게 됨

마지막으로 한단계가 더 남음

 

 

출력 병합

 

- 알파(A)와 깊이 값(Z)을 통해 프래그먼트는 프레임 버퍼에 같은 위치의 픽셀과 경쟁하여 색을 정하거나 합침

 

이 단계에서는 불투명도를 뜻하는 알파값(A)과 깊이값을 뜻하는 Z값을 통해서 각 프래그먼트를 픽셀로써 사용해야할지 아니면 직전까지 컬러 버퍼에 있던 값과 혼합을 해서 사용할지 탈락시킬지를 결정

 

댓글