언리얼 나이아가라 기초 3

vfx 장인·2026년 3월 24일

공격 따라 trail(Ribbon)

스켈레탈에 소켓붙이는건 기본적으로 안다는 가정하에...
모르면
https://monggus.tistory.com/659
ㄱㄱ

먼저 ribbon renderer를 추가한다.

그리고 frame단위로 파티클을 생성하는 spawn particle per frame을 emitter update에 추가한다.


그리고 initialize particle 에서 ribbon값을 적절히 세팅해주면...


이런 trail이 생김!

근데 칼날이랑 rotation이 일치하지 않음....

그럴때도 방법이 있음


ribbon renderer의 facing mode를 custom side vector로 변경

그리고 initialize particles에서 ribbon facing mode를 direct set으로 변경한다음 이 ribbon을 사용하는 owner의 X,Y,Z중 원하는 축으로 바라보게 만들면....


잘 정렬됨!

particle이 움직일때만 생성되도록 하는법? Rate over Distance!

이미터(Emitter)가 이동한 거리를 기반으로 파티클을 스폰하여, 속도와 관계없이 일정한 간격의 트레일(Trail) 효과를 만듬


spawn spacing옵션에 따라 얼마만큼의 거리마다 파티클이 생성될지 정하는거!

얼음 반투명, 카메라에 따라 빛반사율 달라지는 쉐이더 feat. Transform vector

먼저
원하는 텍스쳐와, 텍스쳐의 normal map을 구해야함

먼저 머터리얼을 masked롸 unlit으로 ㄱㄱㅎ

bump offset으로 반사구현

bump offset을 이용해서 일반 텍스쳐의 uv에 연결하고 height를 양수,음수로 변화시키면


이랬던 텍스쳐가

노말맵을 이용하여 transform vector와 dot product로 카메라 방향에 맞춘 검은색 부분 구현

이제 검은색 안쪽부분을 칠할 차례임

먼저 탄젠트 공간을 알아야함
transform vector는

탄젠트 공간을 월드공간으로 변화시키는 노드임

탄젠트 공간은 곡률이 있는 선이 있을때, 해당 선의 한꼭짓점에서 로컬 공간으로 접하는 평평한 벡터 공간을 의미함


이런식의 노드를 짜게되면

  1. 노말맵은 탄젠트 공간 기준 법선 저장
  2. transform vector는 탄젠트→월드 좌표로 변환
  3. camera vector는 카메라 방향
  4. 내적은 카메라 방향과 transform vector의 각도 계산
  5. 노말벡터와 카메라벡터가 수직(90°)이면 Dot = 0 → 검정
    반대 방향이면 Dot < 0 → 음수 → 더 검정
  6. 1-x 때문에 Dot=1(정면)이면 0(검정), Dot=0(수직)이면 1(흰색)으로 반전됨

one minus적용전

one minus적용후

카메라 방향에서 수직인 공간이 검은색이 될건지
카메라 방향에서 평면인 공간이 검은색이 될건지 결정!

desaturation노드를 통해 색 빼기(탈색)

디테일쪽에 더 가까운 영역이 시작됨

fresnel은 외곽선을 보여주기 위해 사용 ㅇㅇ

bump offset으로 반사가 된 텍스쳐를 desaturation을 통해 색을 뺀 회색조로 만들어줌

이걸 하는 이유는

이런 얼음큐브가 있을때,
위쪽은 무채색, 안쪽은 반사, 카메라 정면은 검은색, 아래 중앙은 옅은 파란색으로 표현된다.

desaturation은 아래 중앙부분을 제외하고 모든 부분에서 색을 빼기위해서 사용함


그래서 이런식으로 색을 같이 사용하여 desaturation된 곳에 더해주면


이렇게 됨

왜 UV에서 V를 연결하는거임?

bump offset은 깊이감을 더해주는 노드임

Unreal의 Bump Offset 노드 출력 UV에서:

Height 정보가 V채널(G)에 인코딩되어 나오기 때문임

즉, Bump Offset 노드의 출력 구조상 G채널에 변위(물체의 위치 변화량을 나타내는 물리량) 정보가 담겨있어서 G를 쓰는 거야

그래서 Texture coordinate를 나눠서 R은 U가 되고, G는 V가 되는데, R을 연결하게되면
bump offset의 깊이감과 매핑되지 않아서 효과가 없어지게 되는거임


그래서

이렇게 노드를 완성하면

이런 머터리얼이 만들어지게됨

마지막 사라지는 노드 feat. saturate

erode를 위해서 단순하게 완성된 텍스쳐의 alpha를
노이즈와 결합해서 빼면 됨

마지막 saturate는 clamp역할인데,
clamp는 사용자 지정 범위에서 오버플로우를 막는 역할이고
saturate는 0~1사이에서 오버플로우를 막는 역할임

System location 나이아가라 모듈

이 모듈은 나이아가라 시스템이 viewport위치된 곳에서 시작되는 모듈임


이런식으로 커브의 적용을 파티클단위가 아니라 이미터단위로 설정하면 이미터가 진행됨에 따라 curve가 적용되어 앞으로 쭉 지정한 방향으로 쭉 뻗어나가는 파티클이 됨

jitter position

파티클 위치에 무작위성을 추가하는거임
노이즈라고 보면 됨

system location을 이용해서 x와 y로 sine, cosine을 했을때 위처럼 원형으로 파티클이 생성된다.

이렇게 jitter position 모듈을 추가하묜

요로코롬 됨

모델 애니메이션을 파티클로 사용하기

component renderer에서 component를 skeletal mesh 로 하면

만약 뷰포트에서 안된다면
모델과 애니메이션을 블렌더로 가져와서
애니메이션을 한번 구운다음 alembic으로 추출,
언리얼에서 geometry cache로 임포트 하면 됨

텍스쳐에 깊이감 더하기 feat. parallax occlusion mapping

언리얼은 기본적으로 이런 parallax occlusion을 지원함

Input

위에서부터 순서대로

  • Height map texture
    • 검/흰으로 구분된 텍스쳐를 넣어주면됨
  • Height Ratio
    • 깊이감
  • Min/Max Steps
    • sampling의 수, 깊이의 해상도 조절
  • UV :
    • 3d오브젝트에 어떻게 텍스쳐가 매핑되는지 uv
  • Height Map Channel
    • Height Map Texture에서 어떤 채널을 참고할지 정하는 4벡터
    • height가 R채널이면 R에 1을 입력하는 식임
    • 보통의 흑백 텍스쳐면 1,0,0,0을 넣으면 됨
    • 투명 png면 alpha값이 존재하긴하는데, 이는 높이용이 아니라 투명도용이므로 사용하면 안됨
    • 그러므로 높이값 주고싶으면 흑백텍스쳐로 바꿔서 1,0,0,0으로 쓰는게 정석

아래부터는 그림자 관련 옵션

  • Render Shadows
    • self shadowing을 할지 말지 bool
  • Shadow step
    • shadow의 해상도
  • shadow penumbra
    • 아래 사진처럼 희미한 그림자 영역의 값
    • 값이 커질수록 그림자 경계부분이 부드러워짐
profile
인디게임개발을 하는 기획자이자 프로그래머이자 VFX디자이너입니다

0개의 댓글