자동 노출에서 Emissive가 과도하게 번지는 이유와 발광 예산 관리법
자동 노출이 어두운 장면에서 Emissive 값을 증폭해 Bloom이 과도하게 번지는 원리를 설명하고 Unreal Engine 5와 Unity HDRP에서 발광 예산·노출·톤매핑을 함께 관리하는 기준과 셰이더 검증 절차를 정리합니다.

핵심 요약
자동 노출은 어두운 장면에서 exposure multiplier를 높입니다. 이때 HDR Emissive 값도 같은 노출 배율을 받아 Bloom 입력과 톤매핑 전 밝기가 커지므로 작은 오브젝트가 화면 전체를 덮는 것처럼 번질 수 있습니다.
해결책은 Emissive 값을 무조건 낮추는 것이 아닙니다. 프로젝트의 기준 백색값을 정한 뒤 코어 밝기, Bloom 기여도, Lumen·간접광 기여도를 분리해 발광 예산을 배정하고 자동 노출의 EV100 범위와 셰이더의 HDR 상한을 함께 관리해야 합니다.
자동 노출이 바뀌면 Emissive가 왜 갑자기 번지는가?
렌더러는 보통 선형 HDR 색상으로 장면을 계산한 뒤 자동 노출과 톤매핑을 적용합니다. 장면의 평균 또는 중간 밝기가 낮으면 카메라는 더 많은 빛을 받아들이도록 노출 배율을 올립니다.
개념적으로 최종 출력은 다음과 같이 볼 수 있습니다.
여기서 L_scene에는 재질의 Emissive 출력도 포함되고 E_exposure는 자동 노출이 계산한 배율입니다. 따라서 어두운 방 안에서 작은 Emissive 간판 하나가 켜지면 다음 현상이 연쇄적으로 일어날 수 있습니다.
- 어두운 배경 때문에 자동 노출이 올라갑니다.
- Emissive의 HDR 값이 노출 배율을 적용받습니다.
- Bloom 추출 단계에서 밝은 픽셀로 분류되는 영역이 커집니다.
- 톤매핑의 하이라이트 압축과 Bloom 블러가 겹치며 빛이 과도하게 퍼집니다.
이 문제는 Emissive 자체의 값이 갑자기 변한 것이 아니라 카메라 노출과 후처리 입력의 관계가 변한 결과입니다.

Bloom을 낮추면 항상 문제가 해결되는가?
아닙니다. Bloom은 이미 밝은 픽셀 주변에 만드는 후광입니다. Emissive의 코어가 흰색으로 뭉개지거나 주변 오브젝트까지 과도하게 밝아지는 문제는 Bloom Intensity만 낮춰서 해결되지 않습니다.
| 증상 | 주된 원인 | 우선 조정할 항목 |
|---|---|---|
| 코어가 흰색으로 뭉개짐 | Emissive HDR 값과 노출 배율이 과도함 | 셰이더 상한, Exposure Compensation, EV100 범위 |
| 주변에 큰 후광이 생김 | Bloom 추출 영역과 블러 강도가 과도함 | Bloom Threshold, Intensity, Size |
| 간판이 장면 전체를 밝힘 | Lumen 또는 간접광에 Emissive가 기여함 | GI용 Emissive 분리, Lumen 기여도, 라이트 대체 |
| 어두운 방에서만 심해짐 | 자동 노출이 장면을 과도하게 밝힘 | 미터링 마스크, Min·Max EV100 |
| 카메라 이동 때 깜빡임 | 노출 적응 시간과 밝기 변화가 충돌함 | Adaptation Speed, 노출 변화 제한 |
발광 예산은 어떤 단계로 나눠야 하는가?
발광 예산은 단일 Emissive Intensity 값이 아닙니다. 같은 오브젝트의 화면상 밝기, Bloom 크기, 간접광 기여도는 서로 다른 목표를 가집니다.
프로젝트의 기준 백색값을 선형 HDR 값 1.0으로 정하고 다음 세 가지 예산을 별도로 관리하는 방식이 실용적입니다.
| 예산 | 의미 | 관리 방법 |
|---|---|---|
| Core Budget | 톤매핑 전 Emissive 코어가 가질 최대 밝기 | 재질 파라미터와 셰이더 상한으로 제한 |
| Bloom Budget | 후광을 만드는 밝은 영역의 허용량 | Bloom Threshold와 별도 마스크로 제어 |
| GI Budget | Lumen, Light Probe, 광원 베이크 등에 기여할 양 | GI 전용 Emissive와 실제 라이트를 분리 |
예를 들어 UI 버튼의 발광은 Core Budget은 작게 두고 Bloom Budget만 약간 허용할 수 있습니다. 네온 간판은 Core Budget과 Bloom Budget을 모두 사용하지만 GI Budget은 낮게 제한할 수 있습니다. 반대로 용접 아크나 폭발은 짧은 시간 동안 높은 Core Budget을 허용하되 지속 시간을 제한하는 편이 좋습니다.
예시 상대 예산
아래 값은 Unreal Engine 5의 특정 프로젝트에 고정되는 절대 표준이 아니라 기준 백색값이 1.0일 때 사용할 수 있는 출발점입니다. ACES 계열 또는 프로젝트의 커스텀 톤매퍼와 노출 범위에 따라 반드시 재조정해야 합니다.
| 에셋 유형 | Core Budget | Bloom Budget | 권장 제어 |
|---|---|---|---|
| UI 상태 표시 | 0.5~2.0 | 0.1~0.5 | 작은 Bloom 마스크와 고정된 색상 |
| 네온 간판 | 2.0~6.0 | 0.5~2.0 | 소프트 클램프와 영역별 미터링 |
| 마법 문양 | 1.0~4.0 | 0.5~3.0 | 애니메이션 커브로 피크 시간 제한 |
| 총구 섬광 | 4.0~12.0 | 2.0~8.0 | 짧은 지속 시간과 별도 VFX 레이어 |
| 폭발 중심부 | 8.0 이상 | 상황별 | 화면 노출과 후처리 피크를 별도로 테스트 |
핵심은 숫자 자체가 아니라 에셋 유형 × 노출 상태 × 지속 시간으로 예산을 검증하는 것입니다.
Unreal Engine 5에서 자동 노출과 Bloom을 어떻게 관리할까?
Unreal Engine 5.4 이상에서는 Post Process Volume의 Exposure와 Bloom 설정을 장면 목적에 맞게 함께 조정합니다. 프로젝트에서 사용하는 버전에 따라 세부 속성 이름과 기본값은 달라질 수 있습니다.
1. 자동 노출 범위를 먼저 제한한다
Post Process Volume의 Exposure에서 다음 항목을 먼저 확인합니다.
- Metering Mode: Histogram 또는 Basic
- Min·Max EV100: 프로젝트 설정에서
Extend default luminance range in Auto Exposure settings를 켠 경우 표시되는 자동 노출 범위 - Min·Max Brightness: 위 설정을 끈 경우 사용하는 자동 노출 범위
- Exposure Compensation: 전체 장면에 적용할 보정값
- Speed Up과 Speed Down: 노출 적응 속도
자동 노출 범위가 넓으면 장면에 따라 밝기 변화가 커질 수 있습니다. 그렇다고 범위를 무조건 좁히면 실내와 실외의 밝기 차이를 표현하기 어려워지므로 레벨의 시야 구간별로 별도 Post Process Volume을 사용하는 것이 안전합니다. EV100 범위를 조절하려면 프로젝트 설정에서 Extend default luminance range in Auto Exposure settings를 켜야 하며, 그렇지 않으면 Min·Max Brightness를 조절합니다.
화면의 특정 위치가 자동 노출에 미치는 영향을 조절하려면 Exposure Metering Mask를 사용해 화면 좌표별 가중치를 지정할 수 있습니다. 이 마스크는 객체 종류를 식별하지 않으므로, HUD나 장식용 Emissive를 제외할 수 있는지는 해당 요소가 씬 컬러와 노출 측광에 포함되는 렌더 경로인지 확인해야 합니다.
2. Bloom은 상한이 아니라 후광 연출로 사용한다
Bloom 설정은 Emissive의 물리적 밝기를 대신 결정하지 않습니다. 다음 순서로 판단하는 것이 좋습니다.
- 톤매핑 전 HDR 뷰에서 Emissive 코어의 상한을 확인합니다.
- 노출을 바꿔도 코어가 의도한 형태를 유지하는지 검사합니다.
- 그다음 Bloom Threshold로 후광이 시작되는 밝기 영역을 정합니다.
- Bloom Intensity와 Size로 후광의 시각적 크기를 조절합니다.
Bloom Threshold를 너무 낮추면 반사광이나 흰색 머티리얼처럼 밝은 픽셀이 더 많이 Bloom 대상이 됩니다. UI도 씬 컬러와 후처리 경로에 포함된 경우 영향을 받을 수 있습니다. 반대로 Threshold를 높이는 것만으로는 이미 클리핑된 Emissive 코어를 복구할 수 없습니다.
3. GI용 발광과 화면용 발광을 분리한다
Lumen을 사용하는 장면에서는 Emissive가 간접광에 기여할 수 있습니다. 화면에서 빛나는 효과가 필요하다는 이유만으로 높은 Emissive 값을 넣으면 벽과 바닥까지 비현실적으로 밝아질 수 있습니다.
실제 광량이 필요하다면 다음처럼 역할을 나눕니다.
- 화면의 자기 발광 표현: 낮거나 제한된 Emissive
- 주변 오브젝트를 밝히는 효과: Point Light, Rect Light, VFX Light
- Lumen에 전달할 간접광: GI 전용 스칼라 또는 별도 재질 패스
- 후광 표현: Bloom용 마스크 또는 별도 포스트 프로세스 입력
이 구조는 발광 값을 낮췄을 때 화면의 색감과 주변 조명이 동시에 무너지는 문제를 줄여줍니다.
셰이더에서 Emissive 상한을 어떻게 구현할까?
가장 단순한 방법은 선형 RGB의 휘도를 계산하고 허용된 발광 예산을 넘는 부분을 압축하는 것입니다. 텍스처와 색상 값은 반드시 선형 공간에서 계산해야 합니다.
다음은 Unreal Material Custom 노드나 Unity HDRP Shader Graph의 Custom Function에서 응용할 수 있는 HLSL 형태의 예시입니다.
float3 colorLinear = max(EmissiveColorLinear, 0.0) * EmissiveIntensity;
float luma = dot(colorLinear, float3(0.2126, 0.7152, 0.0722));
// BudgetMask는 0~1 범위의 아트 데이터 마스크
float allowedLuma = lerp(0.5, 4.0, BudgetMask);
float scale = min(1.0, allowedLuma / max(luma, 1e-4));
float3 emissiveCapped = colorLinear * scale;
return emissiveCapped;
이 방식은 상한을 확실하게 지키지만 강한 색상이 모두 같은 비율로 줄어들기 때문에 하이라이트가 평평해질 수 있습니다. 밝은 부분의 색상과 디테일을 보존하려면 하드 클램프 대신 소프트 니를 사용합니다.
float3 colorLinear = max(EmissiveColorLinear, 0.0) * EmissiveIntensity;
float luma = dot(colorLinear, float3(0.2126, 0.7152, 0.0722));
float allowedLuma = lerp(0.5, 4.0, BudgetMask);
float kneeStart = allowedLuma * 0.75;
float headroom = max(allowedLuma - kneeStart, 1e-3);
float excess = max(luma - kneeStart, 0.0);
float compressedLuma = luma <= kneeStart
? luma
: kneeStart + excess / (1.0 + excess / headroom);
float scale = compressedLuma / max(luma, 1e-4);
return colorLinear * scale;
노출 배율을 셰이더 상한에 반영할 때의 주의점
화면에 표시되는 목표 밝기를 직접 제한하려면 다음과 같이 노출 배율을 고려할 수 있습니다.
하지만 머티리얼 셰이더에서 현재 카메라의 최종 노출 배율을 항상 안전하게 읽을 수 있는 것은 아닙니다. Unreal Engine의 프리 익스포저, Unity HDRP의 내부 노출 처리처럼 렌더 파이프라인이 중간 스케일을 사용할 수도 있습니다.
따라서 일반적인 제작 파이프라인에서는 다음 조합을 권장합니다.
- 셰이더에는 보수적인 HDR 상한을 둡니다.
- Post Process Volume에서 Min EV100과 Max EV100을 제한합니다.
- 카메라 노출에 따라 변해야 하는 효과만 별도 노출 보정 신호를 사용합니다.
- 최종 캡처는 노출 고정 상태와 자동 노출 상태에서 모두 검증합니다.
Unity HDRP에서는 어떤 항목을 확인해야 하는가?
Unity HDRP의 Volume에서 Exposure와 Bloom을 같은 방식으로 분리해 관리할 수 있습니다.
- Exposure Mode: Automatic, Automatic Histogram, Fixed, Curve Mapping, Use Physical Camera
- Exposure Compensation: 전체 노출 보정
- Limit Min과 Limit Max: 자동 노출 범위 제한
- Bloom Threshold: Bloom 추출 기준
- Bloom Intensity: 후광 강도
- Bloom Scatter: 후광 확산 정도
HDRP에서도 Bloom Threshold는 Emissive 코어의 최대 밝기를 보장하지 않습니다. Shader Graph에서 Emission 출력을 제한하고 Volume의 Exposure Limit으로 장면 전체의 노출 변동폭을 제한해야 합니다.
머티리얼 텍스처에서 발광 마스크를 데이터로 사용할 때는 색상 텍스처와 구분해야 합니다. 마스크는 일반적으로 sRGB 변환을 끄고 선형 값으로 샘플링합니다. sRGB 변환이 적용된 마스크는 중간 값이 달라져 예산 곡선이 의도와 다르게 동작할 수 있습니다.
발광 예산을 실제 작업 흐름에 적용하는 4단계
Step 1. 기준 백색값과 측정 공간을 고정한다
먼저 프로젝트의 기준 백색값을 정합니다. 예를 들어 선형 HDR 값 1.0을 일반적인 흰색 머티리얼의 기준으로 두고 모든 Emissive 예산을 상대값으로 기록합니다.
검증 시에는 다음 뷰를 구분합니다.
- Linear HDR 또는 HDR 디버그 뷰: 셰이더 출력 확인
- Pre-exposure 적용 뷰: 카메라 노출 반영 상태 확인
- Tonemapped 뷰: 최종 플레이어 화면 확인
- Bloom only 뷰: 후광에 기여하는 픽셀 확인
최종 화면만 보고 값을 조절하면 셰이더의 과도한 HDR 출력과 톤매퍼의 하이라이트 압축을 구분하기 어렵습니다.
Step 2. 에셋에 예산 메타데이터를 붙인다
아트 데이터에 다음 파라미터를 공통으로 둡니다.
| 파라미터 | 예시 범위 | 용도 |
|---|---|---|
| EmissiveIntensity | 0~12 | 기본 발광 세기 |
| CoreBudget | 0.5~8 | 코어 밝기 상한 |
| BloomWeight | 0~1 | Bloom 전용 기여도 |
| GIBudget | 0~1 | 간접광 기여 비율 |
| PulsePeak | 1~4 | 애니메이션 피크 배수 |
| PulseDuration | 0.05~1초 | 피크 지속 시간 |
디자이너가 재질마다 임의의 100, 500, 1000 같은 값을 넣지 않도록 Material Parameter Collection, ScriptableObject, Data Asset 등 중앙 설정으로 범위를 공유하는 것이 좋습니다.
Step 3. 애니메이션 피크를 별도 예산으로 계산한다
깜빡임이나 맥동 효과가 있는 Emissive는 평균값보다 피크값이 문제를 일으킵니다. 다음과 같은 곡선이 있다고 가정해 봅니다.
I_base만 검사하면 A와 Pulse(t)가 곱해지는 순간의 최대값을 놓칠 수 있습니다. 따라서 다음처럼 피크를 별도로 검사합니다.
애니메이션 커브의 Pulse_max가 1이라면 I_base가 4이고 A가 2일 때 피크는 12입니다. 자동 노출이 올라가는 장면에서는 이 값이 더 크게 보일 수 있으므로 피크 예산을 별도로 승인하는 편이 안전합니다.
Step 4. 스트레스 씬에서 노출과 카메라 이동을 검증한다
최소한 다음 테스트 케이스를 만듭니다.
- 밝은 실외에서 어두운 실내로 이동합니다.
- Emissive가 화면의 1%, 10%, 50%를 차지하도록 배치합니다.
- 자동 노출과 고정 노출을 각각 캡처합니다.
- Emissive를 켜고 끌 때 주변 오브젝트의 밝기 변화를 비교합니다.
- 카메라 이동 중 Bloom 크기와 코어 색상 변화를 확인합니다.
- Lumen 또는 간접광을 끈 상태에서 화면용 발광과 GI용 발광을 분리해 비교합니다.
이 테스트에서 특정 장면만 문제가 생긴다면 재질 값 하나보다 노출 미터링 범위, 화면 점유율, 적응 속도를 먼저 확인해야 합니다.
flowchart LR
A[Scene Luminance] --> B[Auto Exposure]
C[Emissive Mask] --> D[Emissive Budget]
D --> E[HDR Emissive]
B --> F[Exposure Scale]
E --> G[Bloom and Tone Mapping]
F --> G
D --> H[GI Budget]
H --> I[Lumen or Light]
흔한 실패 패턴과 개선 방법
모든 Emissive를 같은 값으로 낮추기
간판의 후광은 줄어들지만 마법 이펙트의 색상 대비와 시인성까지 사라집니다. 재질 유형별로 Core Budget과 Bloom Budget을 분리하세요.
Bloom Threshold만 올리기
후광은 줄어들지만 코어가 클리핑되는 문제는 남습니다. HDR Emissive 상한과 자동 노출 범위를 먼저 확인해야 합니다.
Exposure Compensation으로 특정 오브젝트를 보정하기
Exposure Compensation은 카메라 전체에 적용됩니다. 한 오브젝트의 문제를 해결하려다 배경과 캐릭터까지 어두워질 수 있습니다. 오브젝트별 해결에는 셰이더 예산이나 전용 Bloom 마스크가 적합합니다.
밝은 Emissive로 실제 조명을 대체하기
화면에 보이는 발광과 주변을 밝히는 조명은 서로 다른 표현입니다. 실제 조명이 필요하면 라이트나 VFX Light를 사용하고 Emissive는 화면 코어와 후광에 집중시키는 것이 안정적입니다.
노출 적응 속도를 무조건 빠르게 설정하기
빠른 적응은 밝기 변화의 지연을 줄이지만 Emissive 애니메이션과 결합되면 화면이 깜빡일 수 있습니다. 먼저 발광 피크를 제한한 뒤 노출 적응 속도를 조절해야 합니다.
자주 묻는 질문 FAQ
Emissive 값을 낮추지 않고 Bloom만 줄여도 되나요?
후광만 과한 경우에는 가능합니다. 하지만 코어 클리핑, 주변 조명 과다, 자동 노출에 따른 전체 화면 변화가 함께 있다면 Emissive 상한과 노출 범위도 조정해야 합니다.
자동 노출을 끄면 문제가 완전히 사라지나요?
대부분의 노출 변동 문제는 줄어들지만 HDR 값이 과도하면 고정 노출에서도 코어가 클리핑되고 Bloom이 커질 수 있습니다. 자동 노출은 원인 중 하나일 뿐입니다.
발광 예산을 모든 플랫폼에서 같은 숫자로 사용해도 되나요?
렌더 스케일, 톤매퍼, Bloom 구현, HDR 디스플레이 여부가 다르면 같은 숫자도 다르게 보입니다. 공통 기준값을 두되 플랫폼별 Post Process와 최종 캡처로 재검증해야 합니다.
정리
자동 노출에서 Emissive가 과도하게 번지는 문제는 단순한 Bloom 설정 문제가 아닙니다. 어두운 장면에서 올라간 exposure multiplier가 HDR Emissive와 후처리 입력을 함께 증폭하는 현상입니다.
안정적인 해결 순서는 다음과 같습니다.
- 선형 HDR 기준 백색값을 정합니다.
- Core, Bloom, GI 발광 예산을 분리합니다.
- 셰이더에 하드 클램프 또는 소프트 니를 적용합니다.
- Unreal Engine 5 또는 Unity HDRP의 자동 노출 범위를 제한합니다.
- Bloom은 후광 연출용으로만 조절합니다.
- 애니메이션 피크와 카메라 이동을 포함한 스트레스 씬에서 검증합니다.
이렇게 관리하면 Emissive의 시각적 존재감은 유지하면서도 자동 노출 변화에 따라 화면 전체가 번지는 문제를 예측 가능한 범위 안에서 제어할 수 있습니다.



