top of page

(UnityShader) 01 Rendering Pipeline

작성자 사진: NobodyNobody

최종 수정일: 2020년 1월 9일


본 게시글의 내용은 모두 비엘북스의 '유니티 쉐이더 스타트업' 에서 발췌했음을 알립니다. 저와 같은 초보 그래픽 아티스트가 알기 쉽게 정리가 잘 되어있어서 따로 포스팅으로 가져왔습니다.


-


쉐이더를 공부하기에 앞서서 가장 먼저 알아야 할 것은 그래픽카드가 연산한 결과물이 모니터에 픽셀으로 출력되는 과정입니다. 그것이 이번 포스트에서 다룰 렌더링 파이프라인 개념이고 이러한 원리를 이해하면 그래픽 아티스트가 겪는 많은 문제를 쉽게 해결 할 수 있습니다.


(정점 데이터)


먼저 그래픽카드가 물체의 정점(Vertex) 데이터를 받아옵니다. 화면에는 아무것도 출력되지 않는 상태고 그래픽 카드 내부에 존재하고 있습니다. 버텍스는 오브젝트라는 하나의 그룹 안의 목차(Index number), 각각의 버텍스 3차원 위치 값(Position), 빛의 반사를 연산할 법선 값(Normal), 그리고 버텍스 고유의 색(Color)등의 정보를 가지고 있습니다.



(삼격형 면 생성)


그래픽카드가 상술한 정보들을 가지고 (DirectX 혹은 OpenGL을 통해) 버텍스들이 이어진 삼각형 면을 생성합니다. 이 정보들을 버텍스 쉐이더에서 받아서 그래픽 아티스트가 처음으로 쉐이더를 제어하는 데이터에 접근 할 수 있게 됩니다.


(로컬 좌표계)


버텍스의 위치 값은 현재 로컬(Local) 좌표계 상태입니다. 로컬 좌표계란 물체의 중심 피벗(Pivot)이 xyz 0, 0, 0 값인 상태입니다. 여기에서는 게임 안에 존재할 수 있는 다른 오브젝트의 위치는 전혀 고려되지 않습니다. 모든 오브젝트는 자기가 세상의 중심인 상태입니다. 유니티에서는 로컬 좌표계를 오브젝트(Object) 좌표계라고 부릅니다.


(월드 좌표계)


로컬 좌표계에 월드 변환 행렬(Matrix)을 곱해줌으로써, 로컬 좌표계를 월드(World) 좌표계로 변환해줍니다. 월드 좌표계란 절대 좌표인 월드 좌표계의 위치로 부터의 각 물체의 상대적 위치 값을 의미합니다. 월드 좌표계에서는 실제 이 월드의 중심점이 xyz 0, 0, 0이며 다른 물체들을 여기서 얼마나 떨어져 있는지로 표현됩니다. 유니티에서는 월드 좌표계를 모델(Model)이라고 부릅니다.



(Orthographic 카메라 좌표계)


월드 행렬로 변화된 오브젝트들은 이제 월드에 위치값을 가지게 되었습니다. 그러나 여기에 아직 고려되지 않은 것이 있는데, 바로 카메라입니다. 월드에 존재하는 것은 알겠지만 카메라가 없으면 모니터에 보일 수 없습니다. 그래서 월드 좌표계의 버텍스들은 카메라 행렬로 곱해서 카메라 중심점으로부터의 상대적 거리로 다시 연산됩니다. 물체들은 화면에서 볼 수 있게 되었지만 원근감은 고려되어 있지 않습니다. 카메라 행렬은 뷰(View) 혹은 오쏘그래픽 프로젝션(Orthographic Projection)이라고 불리며, 이 시점에서 부터 모니터에 출력하는 것이 가능한 상태가 됩니다.



(Perspective 카메라 좌표계)


이렇게 카메라 행렬로 정렬된 버텍스들은, 다시 한번 원근감을 부여하는 퍼스펙티브 프로젝션(Perspective Projection) 행렬로 곱해집니다. 카메라에서 멀 수록 좁혀지도록 버텍스 값을 조정하는 것입니다. 드디어 우리가 엔진이나 맥스, 마야 등에서 흔히 볼 수 있는 모습이 되었습니다.



여기까지의 작업을 그대로 모니터에 출력한다면 여전히 텍스쳐도 음영도 없는 말 그대로의 폴리곤 덩어리가 생성됩니다. 화면에 찍힐 수 있는 준비는 되었지만 이 오브젝트는 아직 픽셀쉐이더를 거치지 않았기 때문에 결과적으로 우리가 모니터로 볼 수도 없는 단지 3D공간에서 존재하는 오브젝트일 뿐입니다.


우리는 이렇게 좌표계가 조정된 버텍스를 이용해서 화면에 오브젝트를 출력할 준비가 되었습니다. 이번에는 모니터에 이 오브젝트를 출력해줄 것입니다. 그래서 이 오브젝트가 모니터에서 표현될때 어느 픽셀로 표현될 것인지를 나타내는 장치를 거치게 되는데 이것을 래스터 라이져(Resterizer)라 부르며 2D픽셀로 표현되는 세계로 넘어오게 됩니다.


(Resterize 된 3D 오브젝트들)


이제 3D 오브젝트는 모니터에 보이도록 픽셀이 되었고 이 과정을 래스터화 라고 합니다 3D로 있었던 석고상을 촬영하는 순간 석고상은 2D 이미지가 되듯이 3D이미지가 2D이미지가 되는 순간입니다. 모니터에 보이려면 2D 이미지로 만들어야 하니 말입니다.

수학적인 가상공간 안에서 입체로 떠돌던 오브젝트는 픽셀이 되고, 드디어 픽셀 쉐이더에서 픽셀에 접근할 수 있게 되었습니다.



이렇게 모니터까지 넘어온 3D 그래픽 데이터는 본격적으로 화면에 픽셀로 찍히게 됩니다. 물론 아직 텍스쳐도 없고 라이팅도 없는 상태입니다. 이제 여기에서 픽셀 쉐이더(프래그먼트 쉐이더)가 가동되면서 조명과 텍스쳐, 그림자와 각종 특수효과등을 연산하게 되는 것입니다.


OpenGL

간략하게 정리하자면 버텍스 데이터를 받아온 다음 버텍스 쉐이더에서 좌표계 변환을 거친 뒤 래스터라이져로 가져가 픽셀 좌표를 계산하고 픽셀 쉐이더에서 픽셀의 색을 결정합니다.




 
 
 

Comments


bottom of page