Wave

FlowMap

플로우맵이란 UV를 노이즈나 기타 텍스처를 활용하여 변형을 주는 것을 말한다. 단순한 UV (0에서 1로 리니어하게 흐르는)를 사용한다면, 그 VFX가 보기에 굉장히 단조로워 보일 것이다. 늘 똑같은 이미지만 반복될 것이기 때문이다. 이를 방지하고 늘 새로움을 주기 위해, 약간의 출렁거림을 UV 변형을 통해 메인 텍스처에 적용시켜서 변화를 준다.
image
위는 MI에서 편집가능한 단순한 FlowMap이다. 상단에서 볼 수 있는 노이즈는 비교적 부드럽기 때문에 텍스처에 자잘한 변형을 준다. 하단의 노멀맵은 R/G 채널을 마스킹하여 사용하는데, 일부 지점에 높은 값들이 집중되어있기 때문에, 텍스처에 꽤 큰 변형을 준다.
image
두 예시 모두 변형이 아주 심하지만, 상단은 그래도 어느정도 흐물흐물한 원형 텍스처가 있나? 싶지만, 하단은 전혀 알아볼 수 없는 형태가 되었다. 따라서, 적용되는 FlowMap의 강도를 조절해야한다. 위쪽 예시를 보면 상단에는 0.5, 하단에는 0.1의 가중치를 뒀다.
image
이를 반영하면, 비교적 원본의 형태를 유지하는 것을 볼 수 있다. 또한 fig1을 보면 알 수 있듯이, 이러한 Flowmap 여러개를 섞어서 사용할 수 있다. 가산혼합을 활용해 더한 후 UV에 합쳐주는 것으로 이를 구현한다. fig1에서 이미 더해서 FlowMap이라는 name을 정했으므로, 이를 활용한다.
image
오른쪽이 살짝 말려올라가는 상단 FlowMap의 변화와 연기 줄기부분이 좀 더 흐물텅해지는 하단 FlowMap의 효과가 섞인 것을 관찰할 수 있다. 또한, Fig1을 보면 각 플로우맵에 사용되는 노이즈에 UV 타일링을 적용할 수 있다. 현재 작업중인 TX_Line은 가로로 길게 그려진 텍스처이므로, UV.X에 대한 타일링을 반복하고, UV.Y는 타일링을 낮춰서 좀 더 위 아래로 흐르는 느낌을 강조해주겠다는 의도로 파라미터를 설정한다.
image

Procedural Opacity Mask

텍스처의 생김새를 봤을 때 아래에서 위로 오르는 (위쪽에 에너지가 실린) 형태의 텍스처이다. 좌우로는 타일링이 될 것이므로 신경쓰지 않는다. 이 때, 위 아래로 이동하는 텍스처가 사각형 끝 외곽선에서 그대로 1 -> 0으로 사라진다면 굉장히 어색하게 보일 것이다. 마치 선이 잘려서 사라진듯한 느낌이 들 것이다. 연출 의도라면 그럴 수도 있지만, 일반적으로는 그렇지 않을 것이다. 따라서 나타날 때(Fade In)와 사라질 때(Fade Out) 등 텍스처가 외곽선과 만나는 지점에대한 처리를 해 줄 필요가 있다.
image
Power는 지수함수이다. Power(Uv.G, 2.0)은 UV.G^2의 결과를 반환한다. 일반적으로 UV는 0~1의 값을 가지므로, 이는 수를 감쇠시키는 결과를 가져온다. 단, 1에 가까울수록 감소가 적고, 0에 가까울수록 감소가 크다. 따라서 지수 숫자가 커질수록 밝은부분만 남게 된다.※ Exp(?,2.0)에서, 1 → 1, 0.5 → 0.25이다. 따라서 기존 2배차이가 4배차이로 벌어지게 된다. Multiply는 곱연산함수이다. Power함수의 결과에 곱연산을 수행한다면, 밝은 부분을 더 강조하는 결과가 생길 것이다. 다만, 이런 연산을 통해 각 값이 (0,1) 범위를 벗어날 수 있다. 이 경우, 이후 연산에서 원했던 Opacity결과가 변질될 수 있으므로, (0,1)범위로 좁여줘야하고 이를 Saturate 함수가 지원한다.※ 텍스처 Opacity 0.5가 유지되기를 원했으나, Mask가 Opacity 2.0을 가져오면 0.5 * 2.0으로 결과 Opacity가 1.0이 되버린다. 절반투명과 불투명을 합쳤더니 불투명이 나오는 결과는 기대하지 않았을 것이다. 위와 같은 방식으로, OpacityMask는 UV.G 채널에 대해 위쪽 끝부분과 아랫부분에 Fade In/Out을 적용하는 마스크가 생겼다. 이는 ParticleColor.A * Texture * OpacityMask로 사용된다.

Sampling Type

image
UV.G 채널에 약간의 오프셋을 더하자, 이렇게 TX_Line이 아래로 이동한다. 이 때, 위쪽에 텍스처 아랫부분이 Looping되서 내려온 것을 관찰할 수 있다. 이 또한, 연출 의도에 따라 다르겠지만 일반적으로 의도치 않은 상황일 것이다. 이를 방지하기 위해 텍스처 에셋이나 텍스처 샘플에서 Sample Source를 변경해 Wrap(반복), Clmap(반복X)로 설정할 수 있다. 또한, 이 경우 Shared로 사용되면서 머티리얼 최대 사용 텍스처 수도 상승한다. 다만, 하나의 텍스처를 여러 사용처로 쓰려고 하는 경우, Wrap으로 쓰면서 Clamp로도 하나의 머티리얼에서 쓰고싶어질 수 있다. 따라서, UV 값을 Break Float2나 Mask등으로 R,G 채널을 분리한 후 Clamp하려는 쪽에만 Saturate를 걸어서 강제로 (0,1)만 보여주게 만들 수 있다. 기본 동작이 Wrap이므로 Wrap을 원한다면 아무것도 하지않아도 된다.
image

Dynamic Parameter

image
Dynamic Parameter 는 Niagara VFX 내부에서 함수를 이용해 설정 가능한 외부공개 파라미터이다. 이를 바탕으로 MT/MI 에서 설정한 머티리얼을 런타임에서 추가적으로 변경하거나 애니메이션 등에 맞게 변형해서 사용할 수 있다. 현재는 Flow_Dist(FlowMap의 전체 weight)와 uv_g(UV맵의 Y방향 Offset)에 대해 작성하게 해놨다. UV 오프셋에 -1이 더해진 이유는, -1일 때 TX_Line의 모든 선이 사각형 바깥으로 밀려나는 데 이를 파라미터 0.0 지점과 일치시키기 위해, 일종의 편의성 기능으로 더해진 수치이다.