250118

凡愚·2025년 1월 17일

개발 일지

목록 보기
55/350

✅ 오늘 한 일


  • 대마왕의 유니티 URP 셰이더 그래프 읽기


📖 대마왕의 유니티 URP 셰이더 그래프


03 원하는 타이밍에 눈이 깜빡이는 효과

노이즈를 이용해서 랜덤하게 깜빡이기

  • Simle Noise 노드를 꺼내어 UV에 Time을 넣어주면, 대각선으로 UV 좌표가 움직이며 Noise 값을 받아와서 깜빡이게 된다
  • 그걸 HDR Color와 곱해주면 Bloom에 의해 밝게 깜박인다
  • 마스킹 텍스쳐를 추가하여 특정 부분만 빛나게 할 수도 있다

이대로면 노이즈에 밝은 부분이 많아서 꺼지는 부분보다 빛나는 부분이 더 많다. power 연산을 통해 적절히 빈도를 조절할 수 있다.

참고로, Noise 노드는 사용하기 편하고 해상도도 무제한이지만, 수한 계산에 의해 만들어진 것이므로 GPU의 연산을 소모하게 되는 문제가 있다. 최적화를 위해선 이를 노이즈 텍스쳐로 바꾸어 줘야 한다.

텍스쳐를 사용하면 모스 부호로 깜빡이게 할 수도 있다.

타들어가며 없어지는 효과

몬스터가 죽을 때 타들어가면서 재가 되는 느낌 구현하기.
타들어가면서 흩날리는 재는 파티클로 처리하더라도, 실제 타들어가는 기능은 일반적으로 셰이더로 처리한다.
(물론 방법이 셰이더만 있는 건 아니다)

  • Lit 셰이더를 만들고, Alpha Clipping 옵션을 켠다
  • Simple Noise를 만들고 Alpha에 넣는데, 0.5를 더해주면 모든 면이 다 보일 것이고, 0.5를 빼주면 모든 면이 안 보일 것이다
  • 값을 더한 결과에 step 노드를 통해 이미 사라진 영역들과 잠시 후 사라질 영역들을 뽑아낸다
  • color를 곱하여 Emission에 넣어준다

처음엔 바로 이해 안됐는데, 텍스쳐가 섬이고, Alpha가 차오르는 물이라고 생각하니 이해됨.

04 흔들리는 풀 만들기

풀이나 깃발 흔들릴 때 Bone으로 처리하는 건 생각보다 훨씬 작업량이 많고, 매우 무겁다.
특정하고 정확한 애니메이션이 필요한 경우는 다르겠지만, 간단한 오브젝트들을 가볍게 흔들리게 하려면 셰이더로 처리하는 것이 훨씬 가볍고 편리하다.

  • Lit Shader를 만들고 Render Face를 Both로, Alpha Clipping 체크, Smoothness를 0으로
  • Position 노드를 꺼내서 split으로 Green(y 좌표)만 분리했다가, Time을 x축으로 갖는 Sine을 Green에 더해주고 다시 합친다. 그걸 Position에 넣어준다.
  • Time에는 2를 곱해서 더 빠르게 흔들리게 하고, sine 결과값에는 0.2를 더해서 덜 흔들리게 한다.

그럼 위아래로 흔들린다

흔들리게 하고 싶은 부분만 버텍스 칼라를 칠해준 뒤 (기본 밑색은 검은색 칠해야됨)

버텍스 칼라 R을 마스킹한 곳만 위아래로 흔들리도록 곱해준다

버텍스 칼라에 노란색을 칠해준다.
만약 G 채널이 있는 곳이라면 시간이 살짝 앞서 있어서 타이밍이 달라진다.

참고로 Vertex Color는 Vertex > Position과 Fragment > Base Color에 동시에 연결이 안된다.
코드가 양쪽에서 동시에 사용할 수 있게 만들어지지 않기 때문이다.
Preview 노드를 통해 중개하거나, Vertex Color 노드를 2개 만들어서 연결해주면 된다.

05 맷캡(Matcap)

맷캡(Matcap : Material Capture) : Ramp Texture와 비슷하게 이미지로 조명을 대신하는 방식 중 하나

  • 모바일 게임에서 조명 최적화를 위해 자주 사용된다
  • ViewDir을 기반하기 때문에 카메라를 회전하지 않는 상황에서 사용하기 좋다
  • 라이팅을 전혀 사용하지 않고도 라이팅 효과 낼 수 있다

우선 view 방향 normal vector의 x와 y를 가져온다.

검은색 부분의 끝은 0이 아니라 -1이므로 *0.5+0.5를 할 수도 있지만
remap 노드를 쓰면 더 간편하게 0에서 1로 만들어줄 수 있다. 살짝 더 무겁지만 범위를 자유자재로 조절할 수 있음.
그걸 matcap 텍스쳐의 UV로 넣어주면 된다.

노말맵으로 Matcap을 만들 수도 있다.
Transform 노드로 Tangent에서 View 공간으로 바꿔주면 된다.

0개의 댓글