개요
이펙트에서 머티리얼 제작시, 디졸브 효과는 대부분 필수로 적용될만큼 중요한 기능이다.
하지만 막상 제작법을 찾아보면 구현법이 각양각색이며, 그 원리를 단계별로 잘 설명해둔 자료가 없다.
따라서 정보가 산재돼있어 불편하기도 하고, 구현시에는 이해했다가도 함수화해서 쓰다보면 까먹기도 한다.
그래서 원리를 정리해둘 필요성을 느껴 기록하게 되었다.
디졸브의 원리와 방법, 마지막으로 함수화 과정까지 알아본다.
디졸브의 원리
- 핵심
디졸브의 인풋은 일반적으로 0~1값으로 주어진다.
이때, 인풋이 0인 곳은 제일 처음 삭제될 곳이다.
인풋이 1인 곳은 제일 마지막에 삭제될 곳이다.
결국, 핵심은 인풋의 값의 범위를 조작하여(Remap)
시간에 따라 1에서 0으로 바꾸는 것에 있다. 왜냐면 결국 Opacity에 곱해서 적용하기 때문이다.
즉, 흰색이었다가 검은색이 되어야하는 것이다.
- Remap 하는 법
그렇다면 어떻게 Remap을 할까?
일반적으로 step 또는 smoothstep 함수를 사용한다.
step의 경우 구현법이 더 단순하나, 딱 떨어지는 마스크가 생성돼 투명도를 조절할 수 없다.
그래서 이 글에서는 smoothstep으로만 구현한다.
- smoothstep 함수
smoothstep의 함수 문법은 아래와 같다.
smoothstep(min, max, x)
x의 값이, (인풋의 값이)
min보다 작으면 0을 반환한다.
max보다 크면 1을 반환한다.
이 말을 아티스트 언어로 해석하면,
인풋이 min보다 작으면 삭제(검은색)된다는 뜻이다.
인풋이 max보다 크면 삭제 X(흰색)라는 뜻이다.
그러면 min ~ max 사이의 값은 뭔가? 삭제중(회색)이라는 뜻이다.
- smootstep의 max 초기값
따라서, 맨처음 디졸브 시작전에는 모두 삭제되면 안되므로,
인풋의 값이 max보다 커야한다.
그러려면? max의 초기값이 0이면 된다.
인풋의 값은 0~1이므로 모두 max보다 커서 삭제되지 않고 남는 것이다.
- smoothstep의 min 초기값
그렇다면 min값은 어떻게할까?
max보다 값이 작아야하므로 -를 주면 된다.
-값의 격차가 클수록 반투명 범위가 늘어나며, 부드럽게 디졸브된다.
그래서 보통 smoothness라고 이름 짓는다.
- 결론
쓰다보니 길어졌다.
그러나 위 내용들을 이해했다면 다 이해한 것과 마찬가지다.
제작법은 위 원리를 어떻게 적용했냐에 불과하다.
만약, 여전히 디졸브가 어렵게 느껴진다면 보통 smoothstep 내용을 이해하지 못한 것이다.
1단계
가장 단순화한 버전이다.
Dissovle값에 -1을 주어서 초기의 min 값은 -1, max값은 0이 되도록 했다.
주의할 점은, Dissolve값을 주면 삭제되긴 하지만
Dissolve 값이 정규화되지 않아서 0~2 범위로 컨트롤해야한다는 것이다.
2단계
정규화를 했다.
0~1값으로 컨트롤하기 위해 2를 곱했다는 것만 차이가 있다.
그러나 큰 단점이 있다. smoothness가 1이 아니라면 정규화가 되지 않는다는 것이다.
이를 해결하려면 smoothness값에 따라 곱하는 값을 보정해주어야한다.
3단계
smoothness 값에 따라 곱하는 값을 보정한다.
또한 smoothness가 0인 경우 문제가 발생하는 것을 막기 위해 clamp를 적용했다.
위 그림에서 보듯이 smoothness가 0.5여도 정규화된 채로 잘 작동한다.
함수화
- 사용 예시
- 노드 구성
- 첨부파일
언리얼 5.4.4로 제작되었다.
아래 코드를 머티리얼 함수 제작시 에디터에 복붙하여 사용한다.
참고문서
https://learn.microsoft.com/ko-kr/windows/win32/direct3dhlsl/dx-graphics-hlsl-smoothstep
'이펙트 (FX) > 이펙트 팁 : Unreal' 카테고리의 다른 글
[Unreal/Blueprint] 랜덤하게 깜빡이는 라이트 만들기 (0) | 2025.01.15 |
---|---|
[Unreal/Material] RGB 각 채널에 패킹된 텍스처를 재생하는 Flipbook 머티리얼 제작법 (Channel Packing, 파일 첨부) (0) | 2025.01.15 |
[Unreal/Material] Gradient Mapping 방식 소개 (0) | 2025.01.14 |
[Unreal/Blueprint] 시퀀서에서 블루프린트 액터 파라미터 조절하는 법 (스포너블) (0) | 2025.01.09 |
[Unreal/Material] 불투명 오브젝트 블렌딩 방법 : Pixel Depth Offset 활용 (0) | 2025.01.09 |
댓글