쉐이더(Shader)
- 3D 컴퓨터 그래픽에서 최종적으로 화면에 출력하는 픽셀의 색을 정해주는 함수
- 그래픽 데이터의 음영과 색상을 계산하여 다양한 재질을 표현하는 방법
렌더링 파이프라인(Rendering Pipeline : 렌더링 순서)
렌더링 파이프라인 과정
1단계. 오브젝트 데이터 받아오기
2단계. 정점(버텍스: Vertex) 쉐이더
3단계. 래스터라이져(Rasterizer)
4단계. 픽셀쉐이더(Pixel Shader) / 프레그먼트 쉐이더(Fragment Shader)
1단계. 오브젝트 데이터 받아오기
- 그래픽 카드는 버텍스로 이루어진 물체의 데이터 값을 받아옴
- 버텍스는 버텍스의 Index number, Position, Normal, Color, UV 등의 정보를 가짐
- 그래픽 카드에서는 위 버텍스 정보를 가지고 삼각형 면들을 생성하여 기본적인 오브젝트 형태를 만듦
2단계. 정점(버텍스: Vertex) 쉐이더
- 1단계에서 넘어온 데이터들을 이용해서 좌표 변환을 함
1) 로컬 좌표계 상태
2) 월드 좌표계로 변환
3) 뷰 좌표계로 변환
4) 프로젝션 좌표계로 변환
5) 뷰포트 좌표계로 변환
로컬 좌표계?
- 물체가 가지고 있는 자기 중심적인 위치 값
- 오브젝트 자신의 피봇이 원점(0, 0, 0) 위치 값인 상태
- 유니티에서는 오브젝트 좌표계라고도 부름
월드 좌표계?
- 로컬 좌표계에 월드 변환 행렬을 곱하면 변환되는 좌표계
- 절대 좌표인 월드 좌표계의 위치로부터 각 물체의 상대적 위치 값을 의미
- 자신의 피봇이 원점이었던 로컬 좌표계와 달리 월드의 중심점이 원점(0, 0, 0)이 되고, 다른 물체들은 여기서 얼마나 떨어져있는지로 표현됨
뷰 좌표계?
- 월드 좌표계의 버텍스들에 '카메라 행렬'을 곱해서 카메라 중심점으로부터의 상대적 거리로 다시 연산
- 카메라의 중심점이 원점(0, 0, 0)이 됨
- 카메라 행렬은 뷰(View)라고 불리며, 오쏘그래픽 프로젝션(Orthographic Projection)이라고도 불림
- 원근감은 고려되어 있지 않은 상태
프로젝션 좌표계?
- 뷰 좌표계에 프로젝션(Projection) 행렬로 곱해진 상태
- 원근감을 부여해주기 위한 방법으로, 카메라에서 먼 곳은 좁혀진 것처럼 버텍스 위치를 조정해줌
- 위 사진처럼 Unity 카메라에도 Projection 옵션에 Perspective(default)와 Orthographic이 있는데, 렌더링할 때 프로젝션 행렬을 곱해주는지 마는지에 대한 차이가 아닐까 생각된다
여기 단계까지 하면 픽셀 쉐이더를 거치지 않아서 모니터로는 볼 수 없는 3D 공간에서 존재하는 오브젝트가 된다고 한다
3단계. 래스터라이져(Rasterizer)
래스터라이져?
- 오브젝트가 모니터에서 표현될 때 어느 픽셀로 표현될 것인지를 나타내는 장치
- 3D 오브젝트가 2D 픽셀로 표현되는 과정
참고
- Direct-X에서는 버텍스 쉐이더와 픽셀 쉐이더의 중간에 여러가지 쉐이더가 추가로 들어간다고 함
- Hull Shader, Tessellator, Domain Shader, Geometry Shader, Compute Shader 등
4단계. 픽셀쉐이더(Pixel Shader) / 프레그먼트 쉐이더(Fragment Shader)
- 3D 그래픽 데이터가 화면에 픽셀로 찍히게 된 상태
- 픽셀쉐이더가 가동되면서 조명, 텍스쳐, 그림자, 각종 특수효과 등을 연산하게 됨
이와 같은 렌더링 파이프라인을 거치면 정점 데이터가 픽셀 색상이 됨
참고