렌더링 파이프라인 (Rendering Pipeline)
카테고리: Shader
들어가기에 앞서,
💡 Draw Call 이란?
나중에 따로 글을 작성하겠지만…
쉽게 말해 CPU가 GPU에게 그려라! 라고 명령하는 것이다.
이 그려라! 해서 거치는 과정이 렌더링 파이프라인인 것이다.
1단계 : 오브젝트 데이터 받아오기
그래픽 카드가 버텍스 정보들을 받아온다.
버텍스는 버텍스의 인덱스 번호(index number), 포지션(Position), 컬러(Color), UV(Texcoord), 접선(Tangent), 노말(Normal) 등 이라고 한다.
이 정보들로 버텍스를 이어서 삼각형들을 생성하여 면을 만든다.
이렇게 되면 오브젝트의 기본적인 형태가 갖추어지는 것이다.
2단계 : 정점(vertex: 버텍스) 셰이더
버텍스 셰이더에서 위의 데이터들로 좌표 변환을 한다.
로컬 좌표계
버텍스의 위칫값은 초기엔 Local 좌표계이다. (*Local 좌표계 : 물체가 가지고 있는 자기 중심적
인 위칫값)
그리고 오브젝트마다 가지고 있는 본인의 피봇(중심점)은 (0, 0, 0) 위칫값인 상태이다.
이 상태의 물체 여러개가 모니터에 출력된다면, 모두 한 자리에 동시에 생성되어 모여있는 모습이 될 것이다.
왜냐하면 자신이 중심이라, 자신이 있는 곳이 원점 (0, 0, 0) 이라고 생각하고 있기 때문이다.
월드 좌표계
이제 여기에 월드 변환행렬
(월드 좌표계, 매트릭스)을 곱해서 로컬 좌표계를 월드 좌표계로 변환해준다.
(*월드 좌표계 : 절대 좌표인 월드 좌표의 중심점으로부터 각 버텍스의 상대적 위칫값을 의미)
월드 좌표계에선 이 세계의 중심점이 (0, 0, 0)이며, 다른 버텍스들이 중심점에서 얼마나 떨어져 있는지 표현된다.
여기서 잠깐! 여기까지 아직 카메라
가 없다!
카메라(뷰) 좌표계
월드 행렬로 변환된 오브젝트들은 이제 월드에 종속되는 위칫값을 갖게 되었다.
여기서 이제 카메라
가 나온다. 카메라가 있어야 화면에 출력된다는 것!
그래서 월드 좌표계의 버텍스들은 다시 카메라 행렬
(뷰, Orthographic Projection) 에 곱해져서,
월드 중심점에서의 상대적 거리 -> 카메라의 중심점으로부터의 상대적 거리로 연산된다.
이제 물체들은 화면에 출력될 수 있지만 아직 원근감은 고려되어 있지 않다.
프로젝션 좌표계
이렇게 카메라 행렬로 정렬된 버텍스들은 다시 프로젝션(Projection) 행렬
로 곱해진다.
원근감을 부여해주는 작업으로, 카메라에서 먼 곳은 좁혀진 것처럼 버텍스 위치를 조정해주는 것이다.
(카메라에서 멀어질 수록 크기가 작아지는 물체가 되는 것)
이 작업들을 거친 오브젝트는 우리가 바라보는 뷰의 모습이 된다.
그렇지만 아직 픽셀 셰이딩을 거치지 않아 텍스쳐도, 음영도 없는 폴리곤 덩어리의 상태이다.
심지어 아직 화면에 출력되지도 않아서 모니터로 볼 수도 없다.
3단계 : 레스터라이져 (Rasterizer)
이 메쉬가 모니터에서 표현될 때 어느 픽셀로 표현될 것인지 나타내는 것!
이 과정을 거치면 2D 픽셀로 표현되는 것이다.
3D로 만들어진 석고상을 카메라로 찍으면 그 순간 석고상은 2D 이미지가 되듯이,
3D 이미지가 2D 이미지로 되는 것이다. (모니터에 보이려면 2D 이미지가 되어야 하는 것처럼)
이렇게 데이터 덩어리 오브젝트는 픽셀이 되었고, 이후 픽셀 셰이더에서 이 픽셀에 접근하는 것이다.
4단계 : 픽셀 셰이더(Pixel Shader) / 프레그먼트 셰이더(Fragment Shader)
텍스쳐도 없고 라이팅도 없는 상태의 픽셀에게 픽셀 셰이더가 적용되면서
조명, 텍스쳐, 그림자 등을 연산하게 된다.
정리
정점 데이터 ->
버텍스 셰이더(정점 좌표변환)
-> (정점 위치) ->레스터라이저
-> (픽셀 위치) ->픽셀 셰이더(픽셀 색상결정)
-> 픽셀 색상
댓글남기기