2D Sprite의 Outline을 만들고 싶어서 강좌를 찾아보고 따라해봤다. 하면서 헤맸던 점과 Unity 최신 버전에서 바뀐 부분을 설명한다.
참고한 강좌는 이쪽
https://www.youtube.com/watch?v=MqpyXhBIRSw&t=911s
2D Outline Shader Graph 제작
2D Sprite Unlit Shader Graph
2D Sprite Unlit Shader Graph를 하나 만든다. 강좌에서는 Experimental 기능이었는데 최신 Unity에서는 정식으로 지원한다. 경로는 Assets > Create > Shader Graph > URP > Sprite Unlit Shader Graph
Node 추가
Blackboard에서 3가지 Node를 만들어둔다. Texture2D의 이름은 반드시 MainTex로 해줄 것.* 안 그러면 에러난다. Float와 Color의 이름은 크게 상관 없다.
* 보다 정확히 이야기하자면 Texture2D의 Reference를 _MainTex로 해주어야 한다. 하지만 처음부터 이름을 MainTex로 지으면 알아서 Reference가 _MainTex로 잡힌다.
팁) 혹시 Blackboard나 Graph Inspector가 안 보인다면 Shader Graph 창의 우상단을 확인할 것!
MainTex의 설정 (Default Sprite 설정)
Float의 설정 (Slider로 변경하고 Default, Min, Max 값을 설정)
Color의 설정 (Default color, Mode 설정)
여기서 좀 헤맸는데, Color의 Mode를 HDR로 설정해야 나중에 빛나는 효과를 줄 수 있다. HDR 옵션이 안 보여서 헤맸는데 알고보니 처음부터 Color 노드의 설정을 HDR로 해줬어야 했다...
Simple Texture 2D : X 방향으로 UV 옮기기
- MainTex를 끌어다놓고 Simple Texture 2D에 연결한다.
- MainTex를 끌어다놓고 또 다른 Simple Texture 2D와 연결해 Sample Texture를 추가로 만들어둔다.
- Tiling And Offset을 만들고 둘 중 하나의 Sample Texture 2D-UV에 연결한다.
- 위에서 만들었던 Thickness를 끌어다놓고 Vector2-X에 연결한다. Vector2의 Out을 Tiling And Offset - Offset에 연결한다.
Sample Texture Alpha 값끼리 뺄셈
- Subtract 노드를 만든다.
- 만들어진 2개의 Sample Texture 2D 중 Tiling & Offset이 들어간 노드의 A값에서 MainTex만 들어간 Sample Texture의 A값을 뺄 것이다.
- UV 옮기는 작업을 한 Sample Texture 2D 노드의 Alpha값을 Subtract 노드의 A에 연결한다.
- MainTex만 연결한 Sample Texture 2D 노드의 Alpha값을 Subtract노드의 B에 연결한다.
주의) 여기서 나는 실수로 Subtract 노드의 B에 RGBA를 연결하는 실수를 저질렀다.... 그렇게 되면 나중에 결과물 이미지가 꼭 피를 흘리는 것처럼 빨갛게 나온다. Alpha 값끼리 뺄셈해야 한다는 것을 꼭 기억하자.
Multiply
만든 Alpha 값에 색을 곱해 테두리에 색을 넣는다.
Multiply 노드를 만들고 Subtract 노드의 결과물을 A에, Blackboard에서 끌어다놓은 Color를 B에 연결한다.
Add Colors
UV 옮기는 작업을 하지 않았던 Sample Texture 2D에서 색을 뽑아와서 테두리 색과 더한다.
- Add 노드를 만든다.
- Add 노드의 입력값으로 Sample Texture 2D의 RGBA값과 Multiply의 결과물을 각각 연결한다.
Fragment의 Base color, Alpha에 연결
최종적으로 만들어진 RGBA를 RGB, A로 Split해 Fragment에 각각 넣어준다. 이전 Unity 버전에서는 Color와 Alpha 부분이 나뉘어있지 않았지만 최신 Unity에서는 나뉘어있기에 Split으로 RGB파트와 Alpha 파트를 나누어 넣어주었다.
- Split 노드를 만들어 Add의 결과물을 입력으로 넣어준다.
- Vector3를 만들어 RGB를 XYZ에 연결한 뒤 그 결과물을 Base Color에 연결한다.
- Split 노드에서 나온 A값을 Alpha에 연결한다.
결과물 확인
Save Asset을 누른 뒤, 지금 만든 Shader Graph를 우클릭해 Create > Material을 선택한다. 그러면 내가 만든 Shader Graph에서 나온 Material이 생성된다.
Scene의 Hierarchy 창에서 2D > Sprites > Square로 Sprite Renderer를 가진 오브젝트를 생성한 뒤, Sprite Renderer의 Sprite 부분에 MainTex에 넣어주었던 것과 같은 Sprite를 넣어준다.
해당 오브젝트의 Material을 Shader Graph에서 나온 Material로 넣어주면 외곽선 효과를 가진 Sprite가 완성된다.
상하좌우 모두 윤곽선 만들기
- UV 옮기는 작업을 4방향 모두 해주면 된다. X방향으로 -Thickness만큼, Y방향으로 +Thickness, -Thickness만큼 해주면 된다. Thickness 노드에 Negate를 연결하는 방법으로 같은 값을 음수로 만들 수 있다.
- Simple Texture 2D : X 방향으로 UV 옮기기에서 했던 내용에서 노드 몇개만 다르게 연결하면 된다.
- 이후 좌우 Sample Texture 2D끼리 Alpha 값을 더하고(1), 상하 Sample Texture 2D의 Alpha값끼리 더하고(2), (1)과 (2)를 더하면 상하좌우의 윤곽선 Alpha값을 얻을 수 있다.
- 이때 이 결과값이 1을 넘길 수 있는데 Alpha는 무조건 0부터 1 사이여야 하므로 Clamp를 이용해 값을 0부터 1 사이로 맞춰준다. 상하좌우 덧셈의 결과물을 Clamp의 in에 넣고 Min 0, Max 1로 설정하면 된다.
- Clamp의 결과물을 기존 Subtract 노드의 A 자리에 넣어주면 상하좌우 윤곽선을 만들 수 있다.
후기
Color Mode를 HDR로 설정하는 부분과 Subtract 노드에 Alpha값을 연결해야 한다는 것을 조금 더 빨리 알아차렸더라면 시간을 낭비하지 않을 수 있었을 텐데....
'Unity 공부' 카테고리의 다른 글
[Unity] In-App Purchase 테스트 (1) | 2023.02.19 |
---|---|
[Unity] URP Inspector에서 HDR 컬러 피커 (Color Picker) 사용하고 싶을 때 (0) | 2023.02.15 |
[Unity] Json으로 게임 Player, Stage, Level 데이터 관리 (0) | 2023.01.29 |
모바일 게임 성능 최적화 (0) | 2023.01.23 |
[Unity] 유니티에서 사용 가능한 디자인 패턴 (1) | 2022.12.18 |
댓글