Shader graph 스터디 (shader, property)

셰이더는 3D 모델의 표면을 렌더링하고 빛을 계산하며, 재질의 시각적 효과를 제어하고 그래픽 프로그래밍에서 사용된다. 이것은 그래픽 처리 장치(GPU)에서 실행된다.

앞서 대마왕J님의 티스토리에 올린 튜토리얼을 보다가 URP라는 들어보지 못한 새로운 개념이 나와서 검색해봤다.

 

URP(Universal Render Pipeline) 셰이더는 Unity의 URP를 사용하는 프로젝트에서 사용되는 셰이더이다. 간단하게 URP는 Unity의 새로운 렌더링 파이프라인 중 하나이다.

(URP 이전에는 Built-in 렌더링 파이프라인(레거시)에서 사용되는 셰이더가 있었다. 이것은 이전 버전의 Unity에서 기본적으로 제공되는 렌더링 파이프라인이며, 새로운 그래픽 기능 및 최적화가 URP와 같은 새로운 렌더링 파이프라인에 비해 제한적일 수 있다.)

 

 

 

Shader 만들기

 

Project 창에서 +를 누르고  Shader Graph > Universal Render Pipelint / URP > Unlit Shader Graph 

이것으로 셰이더를 만들어주고, 만든 셰이더에서 마우스 우클릭으로 create > material로 메테리얼을 만들어준다.

그걸 오브젝트에 적용시켜서 우리가 제대로 셰이더를 만들었는지 확인할 수 있다.

이 방법 외에 코드로도 셰이더를 만들 수 있다. (위의 방법은 노드로만 만드는 방법. 코드는 HLSL카테고리에서..)

 

 

셰이더가 어느 폴더에 저장되어있을까 (이름바꾸기)

우리가 만든 셰이더의 이름 New Shader Graph(아직 이름 수정안함)을 확인하고자, 적용된 material을 눌러 폴더를 확인해보면

이와 같은 경로에 있는 것을 확인할 수 있다.

여기서 폴더 경로와 셰이더의 이름은 어떻게 바꿀 수 있을까?

셰이더의 이름은 프로젝트창에서 아이콘을 눌러서 바꿀 수있다

 

그럼 이런 의문이 들 수 있다. 셰이더 그래프의 블랙보드에 있던 이름은 뭐지?

그건 적용된 메테리얼을 통해 경로와 이름을 설정할 수 있는 공간이다.

더블클릭으로 이름을 바꾸고

 

셰이더가 적용된 메테리얼에서 셰이더의 경로를 확인해보면

경로의 이름이 바뀐 것을 확인할 수 있다.

여기서 경로의 이름에 /를 사용하여 폴더를 구분할 수 있다.

 

 

 

Property가 뭐지

 

셰이더를 만들면 메테리얼의 inspector 창에 우리가 만든 셰이더에 대한 정보가 나온다.

이와같이 여러 수치들을 조절할 수 있는 기능들이 프로퍼티이다. 간단하게 interface라고 생각한다.

 

 

 

프로퍼티 만들기 

프로퍼티들을 만들 때 사용할 창은 Blackboard와 Graph Inspector이다.

앞서 우리가 어떤 작업을 하고 있는지 알기 위해서 셰이더의 이름을 알기 쉽게 변경해줘야 한다. 

노드로 이름을 바꾸는 방법은 그래프 인스펙터에서 Name을 바꿔준다. 참 간단하다.

 

 

블랙보드의 +버튼을 클릭하여 메테리얼의 인스펙터에서 보여지는 프로퍼티들(인터페이스)를 만들 수 있다.

그래프 인스펙터는 이렇게 만든 프로퍼티들의 설정을 변경할 수 있다. 이름, reference 바꾸기 등..

 

우선 블랙보드의 +버튼을 클릭하여 float 프로퍼티를 만들어보자.

이렇게 프로퍼티를 만들어서 save asset을 눌러 저장한 다음, 이 셰이더가 적용된 메테리얼의 인스펙터창을 보면 프로퍼티가 추가된 것을 확인할 수 있다. 

우리가 만든 프로퍼티(float)를 누르고 그래프 인스펙터의 노드세팅을 클릭하여 더 자세한 설정을 할 수 있다.

여기서 name은 유저에게 보여지는 프로퍼티의 이름이다.

reference는 유저가 아닌 프로그래머가 코드에서 사용하는 이름이다. 변수명 이라고도 한다.

default는 초기값

mode의 아래 화살표를 눌러보면 default, slider 등등 나오는데 나머지는 사용하지 않으니 그냥 default로 둬도 상관없다. slider는 범위를 제한하여 사용하고 싶을 때 (최대 최소값) 사용한다.

precision은 정밀도로 사용하지 않는다.

exposed는 체크 시 인스펙터에 인터페이스가 나오고 체크를 해제하면 보이지 않는다.

override property declaration은 Dots같은 고급 기법에 사용한다고 한다. 일단 넘어간다.

 

 

float 프로퍼티를 만들었으니 다른것도 살펴보자.

우리가 주로 볼 것은 float, Vector2 3 4, color, boolean, texture 2D, cubemap 이렇게만 사용한다. 이외의 것들은 특별한 상황에서 쓰이거나 수학적인 부분이 강해서 일단은 다루지 않는다.

 

Vector2 3 4

Vector는 여러개의 float를 한번에 사용하고 싶을 때 쓴다. 근데 2 3 4는 어떤 경우 사용하는 걸까?

각각 Vector2, Vector3, Vector4를 만들고 인터페이스에서 확인하면 막상 똑같은 것을 확인할 수 있다.

그럼 왜 나눠둔거지? 싶다면 이유는 셰이더의 태생적 한계 때문에 임시로 구현만 해놓은 것이다.

그냥 노드를 만들어서 이것을 프로퍼티에 등록시키는 방식으로도 사용 가능하기 때문에 이러한 태생적 한계를 위해 구현해두었다고 이해했다. 코드상으론 사용하지 않지만 셰이더 그래프에만 있는 기능인 것으로..

 

 

Color

말 그대로 RGBA 로 이루어진 색깔이다.

 

 

Boolean

0과 1 값으로 이루어진 참, 거짓 개념이다. 

 

 

Texture2D

텍스쳐를 입력받을 수 있는 프로퍼티이다. 여기서 default는 적용해도 프로퍼티에 적용되진 않는다. 이것은 셰이더 그래프 내부에서만 사용하는 defalut texture이다. 이것보단 mode가 초기값의 의미를 갖는다. 위 이미지의 프로퍼티가 갖는 의미는 아무것도 안넣었을 때 흰색 텍스쳐를 넣는 것 이다.

 

 

Cubemap

일반적인 텍스쳐는 받을 수 없고 큐브맵 텍스쳐만 받을 수 있다.

그럼 큐브맵 텍스쳐가 무엇일까

텍스쳐 한장에 주변의 정보를 저장하여 반사하는 곳에 사용하는 등의 형식의 텍스쳐이다.