툴/유니티

6-way lighting smoke / 6 방향 라이트를 활용한 사실적인 연기 이펙트 표현

스튜디오 오버그래픽스 2023. 6. 6. 20:27

https://blog.unity.com/engine-platform/realistic-smoke-with-6-way-lighting-in-vfx-graph

Realistic smoke lighting with 6-way lighting in VFX Graph | Unity Blog

For performance considerations, probe contributions are evaluated in the vertex shader and then interpolated to the pixel shader. This means that if you are using a quad output, the probes will only be evaluated at the four corners of the quad. For spatial

blog.unity.com

https://www.youtube.com/watch?v=ib6xIBdbanM 

https://www.youtube.com/watch?v=uNzLQjpg6UE 

https://drive.google.com/drive/folders/1_oh0UkAOW6hISqouCXjYwKQ0lkoj0CIF

Six-Way-Lighting-Textures - Google Drive

이 폴더에 파일이 없습니다.이 폴더에 파일을 추가하려면 로그인하세요.

drive.google.com

 


3D에서 사실적인 연기를 구현하려면 유체의 움직임, 연기의 밀도와 투명도, 셀프 쉐도우 등 시뮬레이션 연산이 많이 필요함. 
리얼타임 엔진에서 연기를 직접 시뮬레이션하는건 연산이 과하기 때문에 대부분 DCC툴에서 시뮬레이션 후 이미지만 가져와서 엔진에서 재생하는식으로 처리하거나 혹은 연기 2D텍스쳐를 반투명으로 왜곡하고 중첩하는 식으로 그림.
 
 
 
기존 방식 - 2D 텍스쳐를 활용한 연기 이펙트 표현 튜토리얼
https://www.youtube.com/watch?v=R6D1b7zZHHA 

 
연기 flipbook이미지를 재생하고, 시간의 흐름에 따라 색상의 변화, 랜덤한 크기, 투명도 등 한정된 2D 이미지를 다양하게 변형해서 보여주고 중첩해서 그럴듯한 연기를 표현함.
연기를 직접 시뮬레이션 하는것 보다 연산이 가볍고, 비주얼도 나쁘진 않음.
그러나 시뮬레이션된 이미지라서 동적인 라이트에 사실적인 반응을 하지 못함.
동적 조명이 있는 환경에서는 다른 오브젝트과 특히 비교되어서 부자연스러워 보이게 됌.
 
 
 
6-way light smoke
기존 방식처럼 시뮬레이션 된 연기 2D텍스쳐를 사용하되, 동적인 라이팅에 더 사실적인 표현을 할수 있도록 6개 방향에 따른 라이팅 정보를 가진 2D 텍스쳐를 사용하는 방식.
후디니, 블렌더 등 DCC툴에서 연기를 시뮬레이션 하고 export할때 6개 방향의 라이팅 정보를 담아서 2개의 텍스쳐로 익스포트함.

첫번째 텍스쳐 = R(우측면), G(윗면), B(뒷면), A(투명도)
두번째 텍스쳐 = R(좌측면), G(아랫면), B(앞면), A(emissive 혹은 다른 정보)
이렇게 6개의 라이팅 방향 정보를 포함해서 총 8개의 정보를 2개의 텍스쳐에 담아서 가져옴
 
 
 

같은 프레임에서 디렉셔널 라이팅을 바꿨을때의 차이.
조명 방향에 영향을 받아서 Volumetric 느낌을 줌.
 
 

두번째 텍스쳐 A값이 Emissive로 쓸수 있는 채널로 되어 있으면 Emissive를 적용해볼수 있음.
실시간으로 Emissive의 intensity나 Color를 제어가능.
 
 
이처럼 텍스쳐 1장을 더 추가하고 정보를 더 가져오게되면서 제어할수 있는 기능과 좀 더 사실적인 표현이 가능.
 
 
그림자 표현
단점으로는 그림자까지 사실적인 표현은 힘듬.
결과적으로 Quad의 형태에 이미지가 그려지고 라이팅에 따라 음영 표현을 더 사실적으로 그릴뿐.

옵션에서 그림자를 키면 볼수 있는데 불투명으로 덩어리만 져서 표현됌.
첫번째 텍스쳐의 알파값을 활용해서 자연스럽게 만들거나 가짜 그림자를 따로 생성해주는 등 방법은 있겠지만 실제 Volumetric이 아니다보니 사실 적인 그림자 표현에는 제한이 있을듯.
 
 
VFX Graph에서 적용 방법
위 깃헙 링크에서 샘플 텍스쳐 다운 받고 임포트 후 텍스쳐 사이즈는 4k이상으로 적용해줌

VFX Graph에서 LitQuad로 만들어 주고 Inspector에 가서 Material Type을 Six Way Smoke Lit으로 변경
밑에 옵션 Emissive Mode, Use Emissive Channel..., Use Exposure Weight, Use Alpha Remap 등 설정해서 Emissive나 Transparency 사용.
 

LItQuad에서 Flipbook blend로 설정하고 텍스쳐에 맞게 Flipbook사이즈 설정
Age over Lifetime은 해당 파티클의 라이프타임에 맞춰서 0~1까지만 증가하는 값
(lifetime이 총 5초면 0->5로 갈때, age over lifetime은 0->1로 변함)
sample curve는 flipbook속도를 제어하기 위한 용도(일정한 프레임으로 재생할거면 없어도 됌)
multiply에는 총 프레임 수만큼 곱해주고 set tex index에 연결