본문 바로가기

Game/Unity & C#

rendering pipeline & monitor right

1) 렌더링 파이프라인

  • 01단계 : 오브젝트 데이터 받아오기

    • 우리가 알고 있는 그래픽 카드는 버텍스(Vertex)로 이루어진 물체의 데이터 값을 받아온다.

      • 버텍스 : 인덱스 넘버(Index number), 포지션(Position), 노멀(Normal), 컬러(Color) 등의 정보이다.

      • 그래픽 카드에서는 이 버텍스의 정보들을 가지고 버텍스들이 이어진 삼각형 면을 생성한다.

      • 오브젝트의 기본적인 형태가 갖추어졌고, 이 정보들을 버텍스 쉐이더로 넘길 준비가 되었다.

  • 02단계 : 정점(버텍스 : Vertex) 쉐이더

    • 이제 이 데이터를 가지고 본격적인 쉐이딩 작업이 가동되기 시작한다.

    • 첫 번째 과정이 '정점 쉐이더'라고도 불리는 버텍스 쉐이더(Vertex Shader)이며, 이 데이터를 이용해서 다음과 같은 좌표 변환을 한다.

      • 1 : 버텍스의 위치 값은 현재 로컬(Local) 좌표계 상태이다. 여기에서는 게임 안에 존재할 수 있는 다른 오브젝트의 위치는 전혀 고려되지 않는다.

      • 2 : 여기에 '월드 변환 행렬(월드 좌표계)'을 곱해줌으로써, 로컬 좌표계를 월드 좌표계로 변환해준다.

        (유니티에서는 이 월드(World) 좌표계를 '모델(Model)'이라고 부른다.)

      • 3 : 월드 행렬로 변화된 물체들은 이 월드의 위치 값을 가지게 되었다. 월드 좌표계의 버텍스들은 '카메라 행렬'로 곱해서 월드 좌표계에서 살고 있던 오브젝트의 버텍스 위치 값들이 카메라의 중심점으로부터의 상대적 거리로 다시 연산된다. 즉, 이 세계에서는 카메라의 중심점이 0, 0, 0이며, 다른 물체들은 여기에서 얼마나 상대적으로 떨어져 있는지로 표현된다.

        (이 상태에서는 원근감이 고려되어 있지 않다. 카메라 행렬은 뷰(View)라고 불리며, 오쏘그래픽 프로젝션(Orthographic projection)이라 불리기도 한다.)

      • 4 : 이렇게 카메라 행렬로 정렬된 버텍스들은 다시 한번 '프로젝션(Projection) 행렬'로 곱해진다. '프로젝션 행렬'이란 원근감을 부여해주기 위한 방법으로, 카메라에서 먼 곳은 좁혀진 것처럼 버텍스 위치를 조정해주는 것이다.

        (이 과정은 퍼스펙티브(Perspective) 프로젝션일 경우에만 일어나는 과정이다.)

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

  • 03단계 : 래스터라이져(Rasterizer)

    • 이번 단계에서는 오브젝트가 모니터에서 표현될 때 어느 픽셀로 표현될 것인지를 나타내는 장치를 거치게 되는데 이것을 래스터라이져(Rasterizer)라 부르며, 2D 픽셀로 표현되는 세계로 넘어오게 된다.

      • 3D 오브젝트는 모니터에 보이도록 '픽셀(Pixel)'이 되었고 이 과정을 '래스터화'라고 한다.

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

  • 04단계 : 픽셀쉐이더(Pixel Shader) / 프래그먼트 쉐이더(Fragment Shader)

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

2) 모니터에 표현되는 색과 빛의 기본원리

  • 01: 모니터의 색은 어떻게 표현되는가?

    • 우리가 알고 있는 모니터에서 표현되는 색은 가산혼합으로 만들어진다.

      (가산혼합 : RGB로 이루어진 색을 더하면 더할수록 밝아지며, 모두 더하면 흰색이 되는 색의 체계를 의미한다.)

  • 02: 모니터에 나타내는 색을 숫자로 표현하기

    • 컴퓨터에서는 R, G, B 3가지의 조명 밝기를 %로 생각한다.
  • 03: 컬러를 숫자로 나타내보기

    • 이렇게 우리는 픽셀마다 특정한 색상을 출력해주는 일을 하게 될 것이다. 텍스쳐를 받아오기도 하고, 색상을 받아오기도 하면서 이 모든 일을 숫자로 더하고, 곱하고, 빼서 최종적으로 모니터에 출력하는 컬러를 결정한다. 그리고 이 한 픽셀의 색을 결정하는 코드를 '픽셀 쉐이더(Pixel Shader)'라고 부른다.