프로필에서 볼 수 있듯이, 저는 이펙터를 지망하고 있습니다.
이펙트를 공부하면서 자연스럽게 셰이더를 만지게 되고 활용 부분을 위해 근본부터 공부하기 위해 셰이더 자체를 공부하게 되었습니다.
셰이더란 '화면에 출력될 픽셀들의 색상을 알려주는 함수'라고들 얘기합니다.
책이나 영상, 블로그들을 돌아보다보면 대체로 이런 느낌으로 셰이더를 정의하곤 합니다.
셰이더를 알기 위해서 셰이더가 사용되는 곳인 Render Pipeline부터 설명해보도록 하겠습니다.
Render Pipeline은 하나의 과정입니다. Render + Pipeline(정보 이동 경로?)두 단어의 조합으로 만들어진 이 개념은 '3D 물체를 2D 화면으로 바꾸어 송출하는 일련의 과정'이라고 합니다.
그래서 이 과정을 간략히 정리해보자면
1. 오브젝트 받아오기
2. 정점 셰이더 (Vertex Shader)
3. 레스터라이저(Rasterizer)
4. 픽셀 / 프레그먼트 셰이더 (Fragment Shader)
간략하게 이 4가지 과정을 겪습니다.
과정을 하나하나 설명해보자면,
그래픽 카드가 위치나 노말, 색상 등을 저장하고 있는 정점의 집합인 오브젝트를 가져옵니다.
오브젝트를 받아왔지만 이 오브젝트들은 모두 Local좌표계로서 존재합니다.
이를 월드 좌표로 변환하기 위해서는 월드 변환행렬을 곱해줍니다.
이후로 여러 행렬을 곱해줍니다. 카메라 행렬과 Projection행렬.
카메라 행렬은 상대적 거리를 나타내어 주기 위함이고, Projection행렬은 원근감을 표시하기 위해 곱해줍니다.
이렇게 생성된 오브젝트는 텍스쳐나 음영이 존재하지 않기 때문에 화면에 송출되지 않습니다.
레스터라이저, 레스터화라고도 합니다.
레스터화는 수학적으로 계산되어 표현된 모양(셰이프)들을 픽셀화하는 작업을 합니다.
픽셀 / 프레그먼트 셰이더는 레스터화 되어 보내진 픽셀들의 색을 정해줍니다.
텍스쳐와 조명, 여러 상황을 연산하여 픽셀의 색을 정합니다.
프레그먼트는 픽셀보다 상위의 개념을 말하는 용어이지만, 픽셀과 거의 같습니다.
이 전체적인 과정에서 사용되는 것들이 셰이더라고 볼 수 있습니다.
대체로 음영이나 색조를 위해 사용되고 그 여러 연산과정을 담은 함수 라이브러리입니다.