Publish:

태그: ,

카테고리:

들어가기에 앞서,
💡 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)

텍스쳐도 없고 라이팅도 없는 상태의 픽셀에게 픽셀 셰이더가 적용되면서
조명, 텍스쳐, 그림자 등을 연산하게 된다.

정리

정점 데이터 -> 버텍스 셰이더(정점 좌표변환) -> (정점 위치) -> 레스터라이저 -> (픽셀 위치) -> 픽셀 셰이더(픽셀 색상결정) -> 픽셀 색상


이슈 및 공부한 것을 기록해두는 개인 블로그 입니다. 댓글, 피드백 환영합니다 🙂

Update:

댓글남기기