본문 바로가기

Unity/Common

Unity - Shader의 정의와 공부 전 사전 조사

반응형

 

회사에서 유니티 석자가 들어있는 책을 발견하고 대충 훑어보았다. 개발의 정석이라지만 상당히 기초적인 부분만을 다루고 있어 보여 훑기만 했었는데, 2020.1f 버전이 릴리즈한 지금 이랑은 차이가 발생하겠지만 반대로 상당히 기초적인 부분에 밀착하여 설명해주어서 내가 원하는 정보를 설명해주고 있었다.

 그 중에서 쉐이더에 대한 간단한 설명이 적혀있어 이렇게 옮겨본다.(물론 원문 그 자체를 옮기진 않습니다. 오래된 책이라도 먹고 사셔야 하시고 저작권 문제가 있을까봐.)

 

 나아가 이번에 공부한 것을 통해 셰이더 그래프를 사용할 수 있도록 해보려한다.

 

읽기 전 참고사항 : 유니티의 셰이더를 공부하기 위함이라 셰이더의 순도 높은 설명보단 유니티에서 사용할 수 있는 정보까지 포함해 다 적을 예정입니다.

쉐이더(셰이더?)의 정의

 아주 기초적인 부분을 짚자면, 그래픽 하드웨어(보통 그래픽 카드)에게 명령하기 위한 방법과 구체적 방법을 적게 해주는 명령집합 정도로 볼 수 있겠습니다.

 

 유니티에선 셰이더를 "조명 입력 및 머티리얼 구성을 기반으로 렌더링 된 각 픽셀의 색상을 계산하기위한 수학적 계산 및 알고리즘을 포함하는 작은 스크립트"로 정의하고 있습니다.

 

 추가로 머티리얼은 "사용된 텍스처에 대한 참조, 타일링 정보, 색조 등을 포함하여 표면을 렌더링하는 방법에 대한 정의"로 머티리얼에 사용 가능한 옵션은 적용된 셰이더에 따라 다르단 것 입니다.

 

 또 한 텍스처는 "비트 맵 이미지"이며, 머티리얼에는 텍스처에 대한 참조가 포함되어있어 머티리얼의 셰이더가 오브젝트 표면 색상을 계산하는 동안 텍스처를 사용할 수 있고  단순히 표면 색상(알베도) 외에도 표면의 반사도나 거칠기, 높낮이 등 많은 측면에서 사용될 수 있습니다.

 

 

 

사전 지식

 바로 셰이더에 대해서만 공부하면 좋겠지만, 작년에 셰이더에 대해 공부해보면서 겪은 바, 사전 지식이 없으면 이해가 힘들더군요. 그래서 이 글에선 최대한 사전 지식에 대해 긁어 왔습니다.

 

 Window 기준 Unity에서 제공하는 그래픽스 API

Project Settings/Player/StandAlone/Other Settings/Rendering

 

3차원 컴퓨터 그래픽스에서 "렌더링 파이프라인" 혹은 "그래픽스 파이프라인"의 뜻

 3차원 이미지를 2차원으로 표현하기 위한 단계적 방법

우측(Scene) 3D 정보를 좌측(Game) 2D 이미지로 변환

모델 표현

 그래픽스 기준 장면(Scene)이란 물체나 모델의 모음이다.

 

모델링 하는 물체의 기본 구성 성분을 다각형을 폴리곤(Polygon)이라 칭하며,

다각형에서 두 개의 변이 만나는 꼭지점을 버텍스(Vertex)라 칭합니다.

 

버텍스 포맷

 그럼 버텍스는 단순히 꼭지점에 불과한가? 에 대해선 당연히 아닙니다. 그러니 용어로 까지 정의해둿겠지요.

여기선 모델을 사용하거나 셰이더를 조금이라도 도전해보셨던 분들이면 들어보았을 법한 것들이 나옵니다.

 

위치(X,Y,Z) -> 기본적으로 버텍스하면 떠올리는 것 입니다. 말 그대로 3차원 상 좌표로서의 역할입니다.

RHW(X,Y,Z,RHW) -> 2차원 화면 공간에서의 정점좌표, 카메라 변환 등의 그래픽 파이프라인 처리를 사용자가 했다고 가정하고 그대로 찍어내어 D3D를 이용한 2D 표현을 할 때 사용됩니다.

법선(NX, NY, NZ) -> RHW와 같이 사용할 수 없으며 버텍스 포맷이 변환된 정점 위치를 포함합니다. 노멀 벡터라고도 불리며, 광원처리시 사용됩니다.

Blending Weight Data(1~3개의 floats) -> 정점 블렌딩 시에 사용되는 강도 값 입니다.

Diffuse Color(Dword) -> RGBA 매크로 값으로 정점의 확산광 색입니다.

Specular Color(Dword) -> RGBA 매크로 값으로 정점의 반사광 색입니다.

Texutre Coordinate (Set 1~8) -> float 4개 값으로 텍스처 좌표를 말합니다. D3D에서는 최대 8개 까지 동시에 겹쳐서 사용이 가능합니다.

 

 

D3D의 버텍스 포맷

 

삼각형

 3D 물체의 기본 구성 요소로서, 물체를 구성하기 위한 모양과 외형을 묘사하는 단위입니다.

 

사각형을 그리기 위한 두개의 삼각형

 

인덱스

 3D 물체의 경우 삼각형들은 동일한 버텍스들을 공유하는 경우가 많습니다. 그렇기에 인덱스 리스트를 이용해 삼각형을 구성하기 위한 버텍스 리스트를 포함합니다.

 

사각형의 버텍스 리스트 = v0 v1 v2 v3

사각형의 인덱스 리스트 = 0, 1, 2, 0, 2, 3

따라서 (v0, v1, v2), (v0, v2, v3) 두개의 삼각형을 이용한 사각형을 그리게 되는 것 입니다.

 

가상 카메라

D3D에서 설명하는 카메라

Unity에서 카메라를 조금 다뤄보았다면 다들 아실 것 입니다.  Unity에서도 거의 유사하게 다루고 있습니다. 참고 문서중

Unity 메뉴얼 - 카메라 기법을 살펴보시면 이에 대한 설명이 나옵니다.

 

Unity - Camera Component 中 Projection

위와 같이 평면에 대해 가까운 평면, 먼 평면에 대한 거리 설정도 가능합니다.

 

로컬 스페이스

 Unity에서는 오브젝트를 중심으로 한 좌표계를 의미합니다. 보통 상위 오브젝트를 영점으로 잡고 조작합니다.

D3D에서의 로컬 스페이스

그림을 보면 D3D에서도 모델을 기준으로 한 좌표계임을 알 수 있습니다. 이렇게 하면 매번 월드 스페이스로 계산할 필요없이 오브젝트의 중심(피벗)을 기준으로 작업하면 되므로 복잡한 연산을 직접할 필요가 없어집니다.

 

월드 스페이스

 월드 좌표계는 말그대로 월드의 중심을 영점으로 잡은 좌표계입니다. 모든 오브젝트가 동일한 영점을 갖고 계산할 수 있게 됩니다.

 

D3D에서의 월드 스페이스

위와 같이 D3D에서도 모든 모델이 월드의 중심이 영점입니다.

 

뷰 스페이스

 쉽게 말해서 관측 중인 카메라를 영점으로 잡겠다는 뜻 입니다. 카메라를 기준으로 작업하면 되므로 카메라가 무엇을 보고 무엇을 안보고 등의 작업을 하기가 좀더 수월하고 효율적이 됩니다.

 

 모델링 프로그램을 다뤄보신 분들은 카메라를 기준으로 작업하는 경우도 있으시더군요. 그런 개념이 되지 않을까 싶습니다.

 

 

후면 추려내기

 폴리곤은 두 개의 면을 가지고 있습니다. 전면과 후면은 방향에 따라 다르며 보통 후면은 그려지지 않아 보이지 안습니다. 이 이유는 보통의 카메라는 오브젝트의 내부를 들여다 보지 않기 때문입니다. 이를 후면 추려내기라 하며 후면이 보일 수 있는 경우엔 이 것이 발생하지 않습니다.

 

관찰점 기준에서의 전면, 후면

위와 같이 카메라(관찰점) 기준 전면과 후면이 나뉘면 후면을 제거함으로서 처리량을 감소시키는 등의 이점을 취할 수 있습니다 이를 후면 추려내기(Backface Culling)이라 합니다.

 

후면이 처리 된 후의 장면

 

카메라 입장에서야 이렇게 되더라도 볼 수 없는 부분이 사라진 것이므로 실제 보는것은 큰 차이가 없습니다. 다만, 컴퓨터 입장에선 처리할 연산이 감소하니 효율적이게 되는 겁니다.

 

따라서 폴리곤의 방향을 알아야 전면인지 후면인지 판단 할 수 있는데, 보통은 뷰 스페이스 기준 시계 방향의 인덱스로 되어 있는 폴리곤이 전면이 되는 것 입니다.

 

조명

 광원은 월드 스페이스에서 정의 되지만 뷰 스페이스 기준으로 처리할지 안할지 판단됩니다. 기능적인 측면에선 물체에 명암이나 색상을 추가하여 사실감을 더해줍니다. 

 

Unity 메뉴얼 - 라이팅을 보면 Unity에서 소개하는 광원에 대해 알 수 있습니다.

 

클리핑

 볼 수 있는 범위 (시야 볼륨, 절두체) 외부의 기하물체를 추려내는 과정을 클리핑이라 합니다.

절두체에서의 위치를 다음 세 가지로 분류합니다.

 1. 완전한 내부 - 절두체 내에 완전히 포함되어 전체가 보이는 형태

 2. 완전한 외부 - 절두체 외부로 시야 내에 일부도 포함되어 있지 않는 형태

 3. 부분적 내부 - 전체가 아닌 일부만 절두체 내에 걸쳐있는 형태, 따라서 절두체 내에 걸쳐 있는 부분만 보존해야합니다.

 

위치에 따른 분류

투영

 뷰 스페이스에서는 3D 장면을 2D 표현을 얻는 과정이 남아있습니다. 이와 같이 n 차원에서 n-1 차원의 그림자를 얻는 과정을 투영(Projection)이라 합니다.

 

Unity 메뉴얼 - 카메라 레퍼런스/카메라에서는 카메라에 대한 사용법이 담겨있는데 이 중에도 투영에 대한 방식을 설명하고 있는 부분이 있습니다.

 

 

 

 


일단은 이정도만 알면 기초적인 지식은 갖출 수 있게 된 것 같습니다.

다시금 적지만 이 글은 스스로 공부함에 있어서 궁금했던 부분을 긁어보고 다음 파트로 넘어가기 위한 초석입니다. 혹여나 추후에 더 자세히 알게되고 후발주자 분들을 위해 작성하게된다면 좀 더 추려내서 오도록 하겠습니다.

반응형