본문 바로가기

Unity3D C#/유니티 쉐이더 공부

렌더링 파이프라인과 모니터에서의 컬러

렌더링 파이프라인


1. 오브젝트 데이터 받아오기

 그래픽카드는 버텍스로 이루어진 물체의 데이터 값을 받아옴

 화면에는 아무것도, 그래픽 카드 내부의 값으로만 존재하는 데이터일 뿐

 버텍스의 인덱스 넘버, 포지션, 노멀, 컬러 등의 정보

 그리고 그 정보들을 가지고 버텍스들이 이어진 삼각형 면을 생성하게 됨

 오브젝트의 기본적인 형태.


2. 정점(버텍스 : Vertex) 쉐이더

 버텍스의 위치 값은 현재 Local 좌표계(=Object 좌표계) 상태(자기중심적인 위치값 본인 pivot이 0,0,0).

 월드 변환 행렬(World 좌표계)을 곱해줌으로써, 로컬 좌표계를 월드 좌표계로 변환(월드 좌표계 : 절대 좌표인 월드 좌표계의 위치로부터 각 물체의 상대적 위치 값)

 '카메라 행렬(View = Orthographic Projection)'로 곱해서 월드 좌표계에서 살고 있던 오브젝트의 버텍스 위치 값들이 카메라의 중심점으로부터의 상대적 거리로 다시 연산

 이 상태에서는 화면에서 볼 수 있지만, 원근감은 고려되어 있지 않음

 일반적인 Perspective 프로젝션일 경우

 프로젝션 행렬로 곱해지는데 원근감을 부여하기 위해 카메라에서 먼 곳은 좁혀진 것처럼 버텍스 위치를 조정해주는 것

 화면에 오브젝트를 출력할 준비(픽셀 쉐이더를 거치지 않았기 때문에 단지 3D 공간에 존재하는 오브젝트)


3. 래스터라이져(Rasterizer)

 레스터라이져라는 오브젝트가 모니터에서 표현될 때 어느 픽셀로 표현될 것인지를 나타내는 장치를 거치게 되고, 2D 픽셀로 표현되는 세계로 넘어옴

 모니터에 보이도록 픽셀이 되는 것. 이 과정을 래스터화라 함.

 

4. 픽셀쉐이더(Pixel Shader) / 프레그먼트 쉐이더(Fragment Shader)

 픽셀쉐이더가 가동되며 조명과 텍스쳐, 그림자와 각종 특수효과 등을 연산하게 됨


모니터의 색과 빛


 모니터에서 표현되는 색은 가산혼합(빛의 삼원색) <-> 잉크에서의 감산혼합(색의 삼원색)

 모니터의 한 픽셀을 이루는 기본구조는 마치 RGB의 색으로 빛나는 3개의 조명이 붙어 있는 모습

 빨강은 100%, 0%, 0% 회색은 50%, 50%, 50% 노란색은 100%, 100%, 0%

 

 한 픽셀의 색을 결정하는 코드 '픽셀 쉐이더(Pixel Shader)' 

 모든 쉐이더는 한 픽셀당 한 번씩 계산되어 한 픽셀씩 컬러를 결정하게 됨. 화면 해상도가 높아서 픽셀이 많아지면 픽셀 쉐이더 계산도 많이 해야 하므로 느려지는 것.

 

컬러의 연산


 회색 + 회색 = 흰색, 노랑 + 빨강 = 노랑, 빨강 - 파랑 = 빨강, 회색 * 회색 = 짙은 회색

 연산으로 인해 1을 초과하거나 0보다 작은 색상 만들어질 수 있지만 표현은 불가능. 다만 값은 유지되고 있으니 유의해야함

 나눗셈도 동일하게 계산 가능하지만, 상대적으로 느리고 곱연산으로 대체 가능.

 색 반전은 1-x(어떤 색) 계산. 포토샵의 Invert와 같음.