이슈: 언리얼의 이미시브는 왜 이렇게 밝은걸까

관련 사례들
https://realtimevfx.com/t/high-intensity-material-going-white/24152
High intensity material going white
Hello! I am trying to make the look of unity’s bloom in unreal engine. unity have this nice saturated color inside the texture, while maintaining bloom. but, in unreal engine, when I boost the intensity until it has the amount of bloom I wanted, the text
realtimevfx.com
ㄴ 이 사람도 유니티의 bloom 느낌을 언리얼에서 구현해보려고 하는데, 유니티에서는 텍스처 안쪽 색이 잘 포화된 상태를 유지하면서도 블룸이 이쁘게 나오는데 언리얼에서는 원하는 만큼 블룸이 나올 때까지 인텐시티를 올리면 텍스처 색이 전부 하얗게 떠버리는 현상을 경험
해결 방법을 찾기 위해 포스트 프로세싱의 블룸 값을 바꿨는데 (intensity: 30, threshold: 0.2), 이렇게 하니까 다른 오브젝트들의 전체적인 화면 느낌까지 같이 바뀌는 이슈..
ㄴ 문제는 언리얼의 photo realistic tonemapper가 포스트 프로세스 기본값이라 이미시브 값을 너무 높게 올리면 그 tonemapper가 값을 날려버리면서 하얗게 보이는 것임. 그래서 전반적으로 언리얼에서 이미시브를 쓸 때 이런 문제를 겪는 사람들이 많고, 씬 전체의 룩을 바꾸지 않고서는 쉽고 깔끔한 해결책이 거의 없는 편이라고 함
ㄴ 이 튜토리얼은 언리얼에서 핸드페인팅 아트를 표현할 때, 하이라이트가 날아가고 씬의 색들도 먼가 뒤죽박죽인 문제를 해결하는 방법을 보여줌. 핸드페인터 관점에서 현실적인 라이팅보다는 더 확산되고 손으로 그린 듯한 느낌을 내기 위해 여러 기법을 적용하는데, 색을 다루는 방식 때문에 이미시브가 날아가지 않도록 유지하는 뎅에도 도움이 됨
ㄴ 톤매퍼를 다루는 법을 공부하면 도움이 될지도. 라고 함 (레거시 톤매퍼에 비해 색을 훨씬 더 일관되게, 그리고 물리적으로 더 올바르게 처리해줄 수 있는 현대식 톤매퍼들이 존재하니까)
ㄴ 다른 의견) 근데 스타일라이즈드 이펙트를 만드는 사람들 입장에서, 더 물리적으로 정확한 색 반응을 원치 않는 경우가 정말 많다. 이미시브 색을 1.0 이상으로 올릴 때 사람들이 가장 바라는 동작은, 도형 바깥으로 퍼지는 블룸이 같은(or 매우 비슷한) 색으로 나와주는 것. 그래서 기본 톤매퍼를 그대로 쓰면서 색조나 채도를 잃지 않고 이 느낌을 얻으려면, 대개 아주 낮은 불투명도(opacity)로 블러 처리된 스프라이트 텍스처를 사용하는 두 번째 파티클 스프라이트를 위에 한 겹 더 올려야 함. 개인적으로는, 이렇게 시간이 많이 흘렀는데도 에픽이 아직까지 스타일라이즈드 게임을 만드는 개발자와 스튜딩옹를 위해 설계된 별도의 렌더 셋업을 제공하지 않은게 놀랍다. 수많은 스튜디오가 프로젝트 초반에 현실적인 톤매퍼를 역으로 상쇄시키기 위해 들이는 공력이 말도 안되게 크다.
Is there a way to disable emissive contribution from a static mesh in lumen... it really does look terrible... and if i have a l
Is there a way to disable emissive contribution from a static mesh in lumen… it really does look terrible… and if i have a light with a spot light on it i really dont need the added emissive.
forums.unrealengine.com
ㄴ 루멘에서 정적 메시의 발광 효과를 비활성화하는 방법이 있나요? 정말 보기 안좋네요..
ㄴ Lumen/ 반사/ 글로벌조명에서 그 이미시브를 실제 광원처럼 취급하면서, 주변까지 과하게 밝아지는 경우에 대한 고찰
https://www.reddit.com/r/unrealengine/comments/1dzpman/anyone_else_deal_with_emission_output_in/
Reddit의 unrealengine 커뮤니티
unrealengine 커뮤니티에서 이 게시물을 비롯한 다양한 콘텐츠를 살펴보세요
www.reddit.com
ㄴ 엔진 톤매퍼 때문에 하이라이트가 다 날아가며, 내부에서 강도 클램프/톤매핑하는 방향이 맞나?
흔한 해결책
* 셰이더 내부에서 밀도 to 광원 변환을 비선형 곡선/ log/ sqrt 등으로 먼저 압축하고
* 최종 이미시브에 들어가는 값은 아트적으로 의미 있는 범위 (ex. 0-50, 0-100 cd 계열) 정도에서 클램프 또는 톤매핑하는 것
https://youtu.be/eDYyBc3cRmw?si=dkHXSgJVC5k3eiAN
ㄴ 여기 33분~에서도 누적 density를 Beer-Lambert 노드(exp(-density))와 1-x로 opacity에 연결하는 구조를 그대로 보여줌 (즉, 누적 density에 단순 스케일만 하 는게 아니라, 파라미터를 곱해서 감쇠 속도를 조절하거나 커브 에셋을 통해 밝기 분포를 비선형으로 바꾸는 식의 처리)
https://shaderbits.com/blog/creating-volumetric-ray-marcher
ㄴ 구조와 누적 방식 설명
https://gamefx.co.kr/bbs/board.php?bo_table=Trans_001&wr_id=17
ㄴ 바로 위에꺼 학습 및 번역본. 밀도 필드를 그대로 쓰지 않고, pow나 커브로 페이드/폴오프를 주면서 중심과 가장자리 밝기 차를 조정 (이게 곧 누적 density에 대한 비선형 곡선 처리)
ㄴ 밀도 필드를 비선형 조정하거나, 스케일링/클램핑해서 시각적으로 제어하는 전형적인 패턴 설명
https://blog.maximeheckel.com/posts/real-time-cloudscapes-with-volumetric-raymarching/
ㄴ 이거 좀 짱인듯 단계별로 시각화해둠. 구체적으로는 노이즈 샘플과 SDF를 [-1,1]로 리맵하고, fBm·리매핑 등을 거쳐 구름 밀도를 다듬는데, 이 과정에서 여러 번 pow·리스케일 같은 비선형 변형을 적용해 density→광도 곡선 바꾸기
언리얼 설명
https://youtu.be/lU74t88Uk98?si=7_0hV_aTYJONtLKG&t=1253
언리얼 엔진의 포스트 프로세스가 기본적으로 제공하는 노출 보정 기능 때문에 .. 작은 광원이 엄청나게 밝아지는 효과가 있음
노출 보정의 효과를 보고 싶다면 outliner > PostProcessVolume > Details > Exposure > Auto Exposure Histogram 활성화
이걸 Manual로 설정해서 끄면 현실적인 (물리적으로 정확한) 라이팅 밝기를 확인할 수 있음. (like 어두운 밤에 보는 노트북 화면)
눈이 반응하듯이 (눈순응 효과를 통해) 적절한 밝기로 맞춰주는데, 이게 적절하지 않음
광원이 좁고 화면 전체가 어두운 특수한 경우에 노출 보정이 정상적으로 작동하지 않음
노출 보정을 끄거나 완전 줄여놓고 작업하는 경우가 있는데 정답이 없음
라이팅도 두 가지 방식이 있음.
1) 물리적으로 정확한 수치를 넣고 실제 현실과 똑같은 형태의 라이팅을 구성하고 싶을 때 → 노출을 끄면 안됨.
정확한 라이팅의 효과를 잡으려면 화면을 보면서 잡아야 함. 눈에서 노출 보정을 못끄니까 오히려 잡기 힘듦
2) 아트적으로 원하는 색감, 원하는 분위기의 라이팅을 세팅해야 할 때.
→ 노출 보정을 끄고 눈에 보이는거에 맞춰서 원하는 느낌으로 라이팅 조정
나의 해결책
1 — Density 비선형 압축
오로라가 중첩되는 부분이 너무 밝은거니까. 아무리 중첩되더라도 얇은 쪽일 때의 밀도? 정도로 한정시키기.
sqrt, log 압축을 통해 누적 density가 커질수록 추가로 밝아지는 효과를 둔감하게 한다.
2 — MaxDepth 클램핑
하드리미터. 아무리 겹쳐도 이 이상은 안가게.
BaseDensity(단위 길이당 밀도) * RayLength(이 레이가 박스 안에서 이동한 총 거리)까지만 하면.. 정확한 적분 결과라 사실상 상한으로 걸어주는게 효과가 없을 것. 그래서 전체 두께 중 몇 %까지만 반영할지?라는 SaturationRatio 같은걸 곱해주면 이론상 효과가 있어야 하는데. 큐브 버전에서는 있었지만 밀도차가 심한 오로라에 적용했을 때는 암순응의 영향력이 더 쎄서 차이가 안나타나는 느낌? (잘 모르겠음)
+) Beer-Lambert Law 적용
우주에서 오는 배경광이 오로라를 통과해서 내 눈에 도달한다는 관점에서, exp(-밀도)는 배경광 투과율로 정의할 수 있음
density가 0이면 오로라가 없고, exp(-0)는 1. 그래서 배경광이 100% 통과하니까 우주 배경이 그대로 보이고 오로라가 투명함
0.7이면 배경광 50% 통과(반투명 오로라), 3.0이면 배경광 50%만 통과(불투명 오로라). 그렇다면 1- exp(...)는 곧 오로라 불투명도(Opactiy)와 이어지고, 선형 매핑이 아니라 1로 수렴. 암튼 자연의 빛 감쇠 현상을 근사하는 시뮬레이션을 통해 오로라가 겹쳐도 부드럽게 포화되도록 하는 역할.
그럼 1번과의 차이는?
soft compression이 누적 밀도 자체를 압축해서 밀도에서 밀도로의 매핑을 나타낸다면,
* OpticalDepth = 2.0 → CompressedDensity = 0.69
* OpticalDepth = 10.0 → CompressedDensity = 1.79 (큰 값을 작은 값으로 압축했을 뿐, 여전히 선형적 관계임)
Beer-Lambert는 압축된 밀도를 불투명도로 비선형 변환해서 밀도에서 불투명도로의 매핑을 나타냄.
* CompressedDensity = 0.69 → Opacity = 0.50 (50%)
* CompressedDensity = 1.79 → Opacity = 0.83 (83%)
그래서 값이 커질수록 증가율이 둔화하는 포화 곡선의 형태를 그리도록 (1을 넘지 않음)

3 — PostProcessing
혹은 컬러 그레이딩 혹은 톤 매핑
UDS처럼 오로라 액터가 post process, sky setting 등의 컴포넌트까지 가지고 있게 함으로써 해당 액터가 배치된 레벨에 효과가 적용되고, 오로라도 그 영향을 받도록 하는거? 그래서 이미시브를 눌러주면서도 대충 넣으면 다 이뻐보이게 (우리 오로라도 uds의 필터 속에 넣으면 이미시브 이슈가 해결됨)


안되면 그냥 density를 낮춰주는 방향으로 갈건데, 그러면 균일도가 떨어짐
이유: emissive 발광하는 부분이랑 얕은 부분이랑 차이가 커서?
의문점: 압축 및 클램핑..이 제대로 동작 안하나? 적용했을 때 전후 차이가 보이긴 한데, 암순응의 영향력이 더 큰거 아닐까. 아무리 갭을 줄였어도 갭이 존재하는 이상 그걸 다시 벌려버리는 느낌

댓글