게임 엔진에서의 재질 표현 중 연출이 가장 까다롭다는 물에 대해서 연구해보았습니다.
(과제로 했던 거라 같은 수업 들으신 분들은 익숙하실지도)
실제 물의 특징
1. 빛을 반사하는 표면
2. 빛의 굴절로 인해 왜곡되어 보이는 현상
3. 표면의 물결(파동)
4. 표면장력에 의해 구 형태로 만들어지는 물방울
애니메이션이나 영상 속의 액체는 다르겠지만,
게임 속의 물, 바다가 어렵다고 하는 이유는 이것들을 실시간으로 계속 렌더링해야 하기 때문입니다.
이건 특히 프로그래머 관점에서 머리 아픈 부분이겠고,
이펙터에게 어려운 걸 고르자면 개인적으로 4번이 아닐까 싶습니다. (지극히 개인적)
아무튼 위 특징들을 엔진에서 하나씩 표현해보겠습니다.
1. 빛의 반사
물 표면의 반사 표현은 자글자글한 빛 반사 디테일을 위한 Normal 맵과 표면의 거칠기를 제어하는 Roughness/Smoothness 맵을 활용합니다.
값 적용 시 아래 값을 참고하여 텍스처나 셰이더를 제작하면 됩니다.
- 러프니스 = 0 → 거울 반사(정반사)
- 러프니스 = 1 → 무광(난반사)
정반사나 난반사에 대한 설명이 필요하다면 언리얼과 유니티 문서에서 확인해주시기 바랍니다.
- 언리얼 머티리얼 문서 : https://docs.unrealengine.com/4.27/ko/RenderingAndGraphics/Materials/PhysicallyBased/
- 유니티 스무드니스 문서 : https://docs.unity3d.com/kr/2022.1/Manual/StandardShaderMaterialParameterSmoothness.html
참고로 유니티의 Smoothness는 언리얼의 Roughness와 값이 반대로 적용됩니다!
만들어 둔 Roughness 텍스처를 유니티에서 사용하고 싶다면,
1. 포토샵 등에서 색상 반전을 시키거나
2. 셰이더 그래프에서 One Minus 노드를 활용해서 쓰면 됩니다.
2. 빛의 굴절로 인한 왜곡
[Unreal] - Refraction 활용
언리얼에서는 머티리얼의 Refraction(굴절)에 값을 연결하면 바로 표현할 수 있습니다.
이때 머티리얼 옵션은 다음과 같이 설정해줍니다.
▪ Blend Mode : Translucent(반투명)
▪ Lighting Model : Surface Trasluceny Volume (표면 반투명 볼륨)
= Metallic, Specular, Roughness 조정 가능한 라이팅 모델
▪ Refraction에서 값을 조정하여 연출
유니티는 언리얼의 Refraction처럼 값 하나로 한번에 연출할 순 없고, 셰이더로 만들어 주어야 합니다.
- Amplify Shader : Grab Screen Position / Color 활용
- Shader graph : Screen Position / Scene Color 활용
*앰플리 파이와 셰이더 그래프에 쓰인 노드들은 모두 메시가 그려진 화면의 위치 값과 컬러 값을 가져온다고 보시면 됩니다.
※ 노드 관련 문서
- Amplify Shader - Grab Screen Position : https://wiki.amplify.pt/index.php?title=Unity_Products:Amplify_Shader_Editor/Grab_Screen_Position
- Amplify Shader - Grab Screen Color : https://wiki.amplify.pt/index.php?title=Unity_Products:Amplify_Shader_Editor/Grab_Screen_Color
- Shader graph - Screen Position : https://docs.unity3d.com/kr/Packages/com.unity.shadergraph@10.8/manual/Screen-Position-Node.html?q=screen%20position
- Shader graph - Scene Color : https://docs.unity3d.com/kr/Packages/com.unity.shadergraph@10.8/manual/Scene-Color-Node.html