유니티 쉐이더 그래프 2

vfx 장인·2026년 3월 11일
post-thumbnail

x, y, z중 특정방향으로 진자운동하기

먼저 진자운동을 하려면 sine, cosine을 이용해야함


먼저 position노드를 이용하여 움직이고 싶은것이 오브젝트라면 space를 오브젝트로 변경하자


그리고 split을 이용하여 R=X, G=Y, B=Z중 원하는 것을 선택하자

난 Y방향을 움직이고 싶으니, 이중 R, B는 vector3노드에 그대로 연결을 하여 위치를 고정시키자

그리고 time의 sine time이나 time을 math:sine노드에 연결하여 사용하자

sine time의 단점은 sine을 움직이는 속도를 조절할 수 없다는 것임

그래서 난 time을 math:sine노드로 연결하여 speed변수를 추가해 multiply로 진자운동 속도를 설정할 수 있도록 했음

  1. multiply를 sine 앞에서 하면 "진자운동속도" 변경
  2. multiply를 sine 뒤에서 하면 "진자운동폭" 변경


전체노드는 이렇게 됨


그럼 이렇게 보임

sine을 원본 포지션에 add가 아니라 multiply를 하면?

add를 하게되면 -1~1사이의 값을 add(더하기)하는거임

따라서 위치가 어디에 있던지간에, 해당 위치를 기준으로 -1~1을 더한 값이 계속 루핑되어 진자운동하는것처럼 보이는거임

근데 multiply를 하게되면?

AddMultiply
수식G + sine(t)G × sine(t)
버텍스 이동량모두 동일 (offset)원래 Y값에 비례
Sine = 0일 때원래 위치로 이동모든 버텍스가 Y=0으로
Sine = -1일 때아래로 이동Y축 반전 (flip)
결과 느낌진자운동, 부유찌그러지다 뒤집힘

이런느낌인거임

각 평면의 수직 방향으로 이동시키기

쉐이더 그래프에는 normalVector라는 노드가 있음

각 평면에 수직방향을 나타내는 법선 벡터임

sine으로 이동되는 만큼 normalVector의 object공간을 position에 Add하여 변화를 주자


이런 평면이 사방으로 움직이는 쉐이더가 완성됨

특정 좌표만 이동시키고 싶다면
포지션과 normalVector를 split후 원하는 좌표 더하고 원본 position과 더해진 좌표를 vector3로 변환해서 position에 연결!

선형 파도효과 만들기

먼저 파도는 파형임

지진을 생각해보면 진폭, 진동수(주파수), 속도 3가지 요소로 파형이 정해짐

특정 방향의 파형을 계산하는 로직은 다음과 같음

d : xyz중 한 개의 축
A : amplitude, 진폭
F : frequency, 진동수-주파수
xx : object의 포지션 xx
P : phase, Speed * Time

d=dAsin(FxP)d = d - A * sin(F * x - P)

이걸 노드로 표현하면 다음과 같음


그럼 결과는 아래 움짤처럼 보임

근데 이런 파도말고, 물결이 솟구치는 파도도 있음

물결이 솟구치는 선형 파도

이를 위해선
X축과 Z축의 파동을 subtract한 후 이것을 Y축과 다시 Subtract를 해주면 됨

미리 수월한 작업을 위해 파동 쉐이더그래프를 SubGraph로 분리하여 작업에 용이하도록 함

SubGraph
x라고 되어있는 부분이 X, Y, Z축 중 원하는 축을 넣을 축임

그리고 아래 사진처럼 X축과 Z축의 파형을 계산하여 Subtract를 한 후
이를 Y축과 다시 Subtract를 하면 됨

그럼 아래 움짤과 같은 파도가 완성됨

선형파도와 솟구치는 파도의 차이점은 다음과 같음

  • 선형파도는 Y축으로만 파형이 생김
    • ~~~~~~ 같은 모양이 됨
  • 솟구치는 파도는 X축과 Z축으로 파형이 생김
    • X축과 Z축이 만나는 지점에서는 Y축과 연산을 통해 위로 솟구침
    • X축과 Z축이 사라지는 지점에서는 Y축과 연산을 통해 아래로 푹 꺼짐
    • 위 움짤처럼 솟구치는 파형이 만들어짐

noise를 이용하여 랜덤한 파도 생성

위의 파도는 linear파도로 항상 같은 부분이 움직여 다른 변칙을 줄 수 없다는 문제가 있다.
이를 해결하기 위해 noise를 이용한다

먼저 ScrollUV라는 것이 필요하다

기본적인 아이디어는 time과 scrollSpeed를 곱하여 흐름을 만들고, offset에 곱하여 나온 vector2를 넣어 vector2를 반환한다

simple noise

value noise라고도 불림

입력은 uv2, 출력은 float
출력은 uv의 특정 픽셀이 0(흑)~1(백) 사이 중 얼마나 흰색인지를 나타냄

이렇게 ScrollUV SubGraph와 noise를 이용해 position의 y값에 변경을 주게 되면

이렇게 꿀렁이는 파도를 얻을 수 있음

gradient noise

perlin noise로 불림

simple noise처럼

입력은 uv2, 출력은 float
출력은 uv의 특정 픽셀이 0(흑)~1(백) 사이 중 얼마나 흰색인지를 나타냄

대신 다른 알고리즘을 사용하여 다른 형태의 노이즈를 제공

simple noise부분만 gradien noise로 바꾸면

이렇게 바뀌게 됨
simple보다는 좀 더 울퉁불퉁한 느낌의 noise임

voronoi noise

cellular noise로 불림

입력은 uv2, angle offset, cell density(밀도)
출력은 float, flost(cells)

AngleOffset변수를 추가로 사용하여

AngleOffset이 0에 가까울수록 정사각형의 모양을 한 파도가 만들어지고
값이 커질수록 랜덤성이 생겨 이상한 모양이 된다

profile
인디게임개발을 하는 기획자이자 프로그래머이자 VFX디자이너입니다

0개의 댓글