유니티 셰이더&렌더링 에센스 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값을 통해서 각 프래그먼트를 픽셀로써 사용해야할지 아니면 직전까지 컬러 버퍼에 있던 값과 혼합을 해서 사용할지 탈락시킬지를 결정
'그래픽스ㆍDirectX' 카테고리의 다른 글
DirectX와 OpenGL (0) | 2022.05.21 |
---|---|
짐벌락과 쿼터니언 + Spherical Linear Interpolation (0) | 2022.05.21 |
렌더링 파이프라인 - 정점 조립과 정점 변환 (0) | 2022.05.20 |
셰이더 (0) | 2022.05.20 |
렌더링 파이프라인 - 그래픽스 API 초기화와 드로우 콜 (0) | 2022.05.20 |
댓글