본문 바로가기
Unity 게임 개발/Unity 쉐이더

유니티 쉐이더 - 랜더링 파이프라인

by daisy0461 2022. 2. 20.

렌더링 파이프라인?

렌더링 파이프라인은 3D 물체를 2D화면까지 표현하는 과정입니다.

다음 사진과 같이 Unity3D물체를 사용하지만 모니터는 2D입니다.

모니터에 이 3D물체를 나타내기 위한 과정을 렌더링 파이프라인이 합니다.

이제 렌더링 파이프라인의 각 단계에 관해서 설명하겠습니다.

 

1. 정점 조립

쿼드가 있다고 합시다. 다음과 같이 생겼습니다.

Quad
정점 조립 설명 이미지

쿼드는 정점이 4개인 사각형이고 중심은 가운데에 있습니다.

다음과 같이 선을 그리고 면을 표현하는 최소가 삼각형이여야 모든 면을 표현할 수 있습니다.

이 작업은 그래픽카드가 알아서 해줍니다.

 

2. 버텍스 쉐이더

버텍스 쉐이더 설명 이미지

정점을 조립하면 면이 만들어지게 됩니다.

정점들에는 노말 벡터 또한 있습니다. 노말 벡터는 면에서 바깥로 향하는 방향입니다.

빨간색 화살표는 탄젠트 좌표입니다. 면에서 uv에서 u에 해당하는 방향이고 이러한 정보는 모든 정점이 가지고 있습니다.

이번에는 월드 좌표계로 옮겨보겠습니다.

 

Object to World

현재 화면에 보이는 좌표계가 0, 0, 0위치에 있는 좌표계입니다.

그리고 쿼드의 중심을 월드 좌표 1, 0, 0이라고 했을 때 다음과 같이 좌표가 변하게 됩니다.

 

World 좌표로 이동한 좌표

 

이번엔 카메라의 뷰좌표계로 한번 보겠습니다.

CameraProjection(투영)오쏘그레픽 원근법이 없는 직각투영으로 설정합니다.

네모난 박스처럼 나오는걸 확인할 수 있습니다.

Orthographic Box

 

그리고 Main Camera의 위치를 보면 0, 0, -2인것을 확인할 수 있습니다.

그렇다면 사각형(Qaud)의 좌표는 어떻게 될까요?

카메라를 0, 0, 0으로 위치시키는 것이 뷰좌표계이면 이전의 월드좌표에서 z좌표만 2씩 더하면 될 것 같습니다.

하지만 뷰좌표계는 z방향이 반대로 갑니다. 위 동그라미 친 부분의 반대로 z좌표가 진행된다는 것입니다.

그렇기에 월드좌표에서 z값을 2씩 더하는 것이 아닌 2씩 빼면 됩니다.

 

이제 원근감이 있도록 카메라 옵션을 바꾸어 투영을 해보겠습니다.

방금 전의 카메라와 카메라가 비추는 공간이 다르게 생긴 것을 확인할 수 있습니다.

투영 좌표계는 near planefar plane의 크기가 다릅니다. 왼쪽을 보시면 확인하실 수 있습니다.

이 두개의 plane으로 원근감을 표시 할 수 있습니다.

near plane이 가까이 있는 흰색 선으로 된 네모이고 far plane이 멀리있는 흰색 선으로 된 네모입니다.

 

near plane 값 변경

CameraNear의 값을 크게해서 카메라가 비추는 영역을 다르게 했습니다.

그렇게 하니 MainCamera쿼드가 나타나지 않는 것을 확인 할 수 있습니다.

동일하게 far의 값을 쿼드의 위치보다 작게 하면 쿼드는 나타나지 않습니다.

이것들을 이용해서 원근감 있도록 만듭니다.

 

그 다음엔 절단 좌표계입니다. 간단하게 설명하고 넘어가겠습니다.

방금 전에 카메라가 비추는 범위를 보여주었습니다. 캡슐이 카메라가 비추는 범위에 걸쳐져 있습니다.

캡슐은 Scene상에는 온전하게 존재하지만 카메라에서는 절단을 해서 보여줍니다.

이때 짤린 곳에 정점을 두고 절단을 내줍니다.

 

화면 좌표계

다음은 화면 좌표계로 표현을 해야합니다.

왼쪽 아래가 0, 0이 되고 오른쪽 위가 해상도가 현재 1920x1080이기 때문에 오른쪽 상단은 1920, 1080이 됩니다.

이렇게 2D인 화면 좌표계에 표시가 끝난 다음에는

 

레스터 라이저

레스터라이저 설명

그래픽 카드가 레스터라이저라는 과정을 하게 됩니다.

여기 노란 사각형에 그려져 있는 선은 정점이 어느 점과 이어져있다라는 정보만 담겨져 있는 선입니다. 실제로는 보이지 않습니다.

레스터라이저 과정은 픽셀마다 검사를 하며 나아갑니다. 그러다가 정점을 찾게 되면 픽셀로 나타내게 되며 정점의 위치, 노말, 탄젠트 값을 갖게 됩니다.

정점과 연결된 선에는 각 정점의 값이 보간된 값이 들어가게 됩니다. 그렇기에 각 픽셀마다 정점들을 보간한 위치, 노말, 탄젠트 값을 가지게 됩니다.

 

프레그먼트 쉐이더

프레그먼트 쉐이더

 

 

래스터라이저 과정을 거치고 나면 프래그먼트 쉐이더라는 과정을 하게 됩니다.

픽셀마다 정보가 담겨져 있는 것을 가지고 픽셀을 색칠하는 것입니다.

 

렌더링 파이프라인의 과정

이렇게

정점 조립 – 버텍스 쉐이더 – 레스터라이저 – 프래그먼트 쉐이더까지 하는 과정이 랜더링 파이프라인입니다.

 

참고한 내용 출처

(렌더링 파이프라인 과정)https://www.youtube.com/watch?v=KnueAgpUL3Y&t=1589s