셰이더를 시작하기 앞서 Rasterization Pipeline에 대하여
레스터라이제이션은 렌더링 파이프라인의 일부분이다. 전체 파이프라인 중 Rasterization은 3D 모델이 2D 스크린에 어떻게 나타낼 것인가에 대한 처리과정을 담고 있다.
포스팅의 주제가 버텍스와 프래그먼트인데 Rasterization을 언급하는 이유는 렌더링 파이프라인에서 우리가 직접적으로 건드릴 수 있는 영역이 바로 Rasterization이며 이 영역이 Vertex와 Fragment로 이루어져 있기 때문이다.
따라서 우리는 Rasterization에 대한 정보를 알고 있으면 더 쉽게 셰이더를 이해할 수 있다.
Rasterization이란?
위에서 언급하였듯이 Rasterization은 가상의 3D 모델을 우리의 모니터인 2D 스크린으로 변경해 주는 작업을 수행한다.
그렇기에 우리는 3D 모델이 먼저 어떻게 이루어져 있는가에 대해 알아야한다.
3D 모델은 정점(Vertices), 법선(Normal), 접선(Tangents), UV로 이루어져있다.
이러한 정보는 각 오브젝트의 기준 좌표계마다 존재한다. 이를 카메라 좌표계로 이동시키는 게 Rasterization이 첫 번째로 할 일이다.
이를 Vertex Processing 이라고 하며 구체적인 진행과정은 다음과 같다. (엔진마다 다르지만 대부분 비슷)
- model space에서 world space으로의 변환.
- world space에서 view space로 변환.
- 카메라의 투영 방식(FoV)에 따른 3d에서 2d로의 변환.
- 추가적인 프로세스(normal calculate, skinning, morph blending 등).
두 번째로 하는 일은 Primitive Processing이다.
이는 정점들의 순서에 따라 기준(primitive) 도형으로 채우는 일이다. 그리고 Unity에서는 삼각형을 사용한다. 따라서 Unity의 모든 매쉬(mesh)는 모두 삼각형의 집합으로 이루어져 있다. 따라서 매쉬를 절차적으로 변경하더라도 가장 기준이 되는 도형인 삼각형을 수정해야한다.
이어서 세 번째로는 Rasterization Stage이다.
이 단계에서는 이전 단계의 도형들의 내부를 pixel들로 가득 채운다. 그리고 각 픽셀이 어떤 음영을 가지고 어떤 텍스쳐를 가지며 어떤 조명을 받는지에 대한 계산을 한다.
네 번째는 Fragment Processing이다.
Fragment Processing Stage는 실질적으로 각 pixel들을 색칠하게 된다.
마지막은 Depth & Color Processing이며 buffer를 통해 처리된다.
이를 모두 거치면 2D 스크린상으로 3D 모델을 볼 수 있게 되는 것이다.
Vertex Shader
버텍스 셰이더는 정점과 관련된 일을 수행한다.
Fragment Shader
프래그먼트 셰이더는 정점들로 생겨난 primitive의 pixel들을 색칠하는 역할을 한다.
'유니티 > 셰이더 및 VFX' 카테고리의 다른 글
[Unity] 셰이더 코드 (2) - ShaderLab과 HLSL 기본 구조 (0) | 2024.01.19 |
---|---|
[Unity] 셰이더 코드 (1) - 셰이더 언어 (Cg, GLSL and HLSL) (0) | 2024.01.17 |
[Unity] 셰이더란 무엇인가? (0) | 2023.02.15 |