후처리 마법: 컬러 그레이딩으로 어두운 고딕 분위기 완성하기

컬러 그레이딩은 장면의 감정을 통일하는 후처리 작업이다. Unity와 Unreal에서 어두운 고딕 분위기를 만들 때 필요한 톤 설계, 노출 관리, LUT 적용 순서를 실용적으로 정리한다.

✓ 복사 완료!
챕터렌더링 파이프라인 & 배칭
난이도중급
상태● 검토 완료
대상 엔진
UnityUnreal Engine
최종 업데이트
후처리 마법: 컬러 그레이딩으로 어두운 고딕 분위기 완성하기

컬러 그레이딩은 분위기를 덧칠하는 작업이 아니다

어두운 고딕 분위기는 화면을 단순히 어둡고 푸르게 만든다고 완성되지 않는다. 검은색 안에서도 재질과 공간의 깊이가 읽혀야 하고 횃불이나 창문 빛처럼 제한된 따뜻한 색은 시선의 목적지가 되어야 한다.

컬러 그레이딩은 조명과 머티리얼이 만든 기본 이미지를 바탕으로 명도, 대비, 색상 관계를 정리하는 마지막 단계다. 따라서 조명이 무너진 장면을 후처리만으로 고치려 하기보다 먼저 기준 노출과 광원의 역할을 잡아야 한다.

flowchart LR
    A[조명과 머티리얼] --> B[노출 기준 설정]
    B --> C[화이트 밸런스와 대비]
    C --> D[색상 분리]
    D --> E[LUT 또는 컬러 그레이딩]
    E --> F[실제 플레이 화면 검증]

이 순서를 따르면 색을 과도하게 밀어 넣는 일을 줄일 수 있다. 특히 게임 플레이 중에는 카메라가 움직이고 밝은 이펙트가 등장하므로 정지 화면 한 장만 보고 판단하면 안 된다.

차가운 청록 그림자와 제한된 주황 광원이 공존하는 고딕 성당 내부의 컬러 그레이딩 예시

먼저 정할 것: 명도 구조

고딕 분위기에서 가장 중요한 것은 색상보다 명도 구조다. 화면 전체를 어둡게 만들면 공포감 대신 답답함만 남고 플레이어는 길과 상호작용 대상을 구별하기 어려워진다.

검은색에도 계층을 만든다

완전한 검은색은 정보가 없는 영역이다. 벽, 바닥, 실루엣을 모두 같은 검정으로 보내면 공간감이 사라진다. 그림자 영역은 아주 약한 청색이나 녹색 기운을 남기고 주요 실루엣은 배경보다 조금 밝거나 어둡게 분리한다.

일반적인 목표는 다음처럼 잡을 수 있다.

  • 배경 그림자: 형태가 겨우 읽힐 정도의 낮은 명도
  • 플레이 경로와 상호작용 물체: 배경보다 한 단계 높은 명도 또는 색상 대비
  • 주요 광원과 보상 대상: 화면에서 가장 밝은 범위
  • UI와 피격 효과: 환경 색과 충돌하지 않는 별도 명도 범위

상대 휘도는 RGB의 선형 값 기준으로 다음처럼 근사할 수 있다.

Y=0.2126R+0.7152G+0.0722BY = 0.2126R + 0.7152G + 0.0722B

여기서 중요한 점은 수식 자체가 아니라 비교다. 예를 들어 붉은 횃불이 밝아 보여도 휘도가 너무 낮으면 어두운 배경 속에서 목적지 역할을 하지 못한다.

자동 노출은 의도한 어둠을 무너뜨릴 수 있다

자동 노출은 카메라가 바라보는 장면의 평균 밝기에 맞춰 노출을 바꾼다. 어두운 복도에서 밝은 창문을 향해 카메라를 돌릴 때 화면이 급격히 어두워지는 이유가 여기에 있다.

고딕 게임에서는 자동 노출을 완전히 끄거나 최소·최대 EV 범위를 좁히는 편이 안전하다. 플레이어가 긴 복도를 이동할 때도 노출이 눈에 띄게 흔들리지 않도록 적응 속도를 낮춰야 한다. 컷신처럼 연출을 고정해야 하는 구간에는 수동 노출을 사용한다.

색상 팔레트는 적게, 역할은 분명하게

어두운 고딕 팔레트는 보통 차가운 그림자와 제한된 따뜻한 광원의 대비로 설계한다. 핵심은 화면의 모든 색을 청록색으로 바꾸는 것이 아니라 어떤 색이 어떤 기능을 가지는지 정하는 일이다.

영역추천 경향역할
그림자청록, 남색, 탁한 녹색습기, 석재, 밤의 차가움
중간톤낮은 채도의 회색, 갈색벽과 바닥의 재질 정보 유지
광원황색, 주황색, 어두운 적색시선 유도와 안전 지점
위험 요소선명한 적색 또는 보라색즉각적인 경고와 비일상성

채도는 그림자보다 중간톤에서 조절한다

채도를 낮출 때 그림자를 먼저 모두 무채색으로 보내면 화면이 평평해지기 쉽다. 반대로 그림자에 강한 색을 넣으면 검은 영역이 지저분해 보인다. 대체로 중간톤의 채도를 약간 낮추고 그림자에는 좁은 색조 편향만 남기는 방식이 안정적이다.

따뜻한 광원은 화면 전체에 많이 둘수록 특별함을 잃는다. 횃불, 제단, 문, 적의 공격처럼 플레이어가 주목해야 할 요소에만 사용하면 작은 색 대비로도 강한 분위기를 만들 수 있다.

차가운 그림자와 따뜻한 횃불이 명도와 채도로 분리된 게임 화면 비교

Unity Volume에서 조정하는 순서

Unity URP 또는 HDRP에서는 Volume 컴포넌트에 컬러 조정 효과를 추가해 빠르게 기준을 만들 수 있다. 파이프라인과 버전에 따라 항목 이름은 다를 수 있지만 작업 순서는 비슷하다.

  1. 전역 Volume을 만들고 프로필을 연결한다.
  2. Exposure 또는 노출 관련 항목으로 기준 밝기를 정한다.
  3. White Balance로 장면 전체를 차갑거나 따뜻한 방향으로 미세 조정한다.
  4. Color Adjustments에서 대비와 채도를 조절한다.
  5. Split Toning, Shadows Midtones Highlights 또는 LUT로 그림자와 하이라이트의 색상 관계를 다듬는다.
  6. Bloom과 비네트를 마지막에 아주 약하게 추가한다.

다음은 Volume 프로필을 런타임에 조절하는 간단한 예다. 지역 진입 시점에 노출과 대비를 바꾸는 용도로 사용할 수 있다.

using UnityEngine;
using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;

public class GothicGradeController : MonoBehaviour
{
    [SerializeField] private Volume volume;
    [SerializeField] private float targetPostExposure = -0.7f;
    [SerializeField] private float targetContrast = 18f;

    private ColorAdjustments colorAdjustments;

    private void Awake()
    {
        if (volume.profile.TryGet(out colorAdjustments))
        {
            colorAdjustments.postExposure.value = targetPostExposure;
            colorAdjustments.contrast.value = targetContrast;
            colorAdjustments.saturation.value = -12f;
        }
    }
}

volume.profile을 직접 수정하면 해당 프로필을 공유하는 다른 Volume에도 영향이 갈 수 있다. 씬마다 독립적인 변화가 필요하면 런타임용 프로필 인스턴스를 사용하거나 지역 전용 Volume을 별도로 구성하는 편이 낫다.

Unreal Engine Post Process Volume의 핵심

Unreal Engine에서는 Post Process Volume을 배치하고 Infinite Extent (Unbound)를 켜면 맵 전역에 적용할 수 있다. 지역마다 다른 분위기가 필요하면 경계가 있는 Volume을 겹치고 블렌드 반경과 우선순위를 조절한다.

고딕 장면의 초기값을 잡을 때는 다음 항목을 우선 확인한다.

  • Exposure: 자동 노출의 최소·최대 범위와 보정값
  • Global, Shadows, Midtones, Highlights: 각 명도 영역의 색조 편향
  • Contrast와 Gamma: 검은 영역을 뭉개지 않는 범위의 대비 조절
  • Color LUT: 여러 조정값을 하나의 룩으로 고정할 때 사용
  • Bloom: 밝은 광원 주변의 퍼짐을 표현하되 하이라이트를 덮지 않도록 제한

Lumen이나 강한 동적 광원을 사용하는 장면은 시간대와 광원 상태에 따라 입력 이미지가 크게 달라진다. LUT 하나를 모든 시간대에 강제 적용하면 낮 장면은 탁해지고 밤 장면은 과도하게 뭉개질 수 있다. 시간대별 LUT를 준비하거나 공통 LUT 위에 노출과 색온도만 동적으로 보정하는 구성이 관리하기 쉽다.

LUT는 룩을 고정할 때 사용한다

LUT는 입력 색상을 원하는 출력 색상으로 대응시키는 색상표다. 기본 조정으로 방향을 찾은 뒤 팀이 합의한 룩을 재현성 있게 적용할 때 유용하다.

다만 LUT에 너무 많은 문제를 담으면 디버깅이 어려워진다. 노출 문제는 노출에서 흰색 광원이 이상하게 보이는 문제는 화이트 밸런스나 광원 색에서 먼저 해결한다. LUT는 장면의 색상 관계를 마무리하는 용도로 남겨 두는 편이 좋다.

간단한 셰이더 수준의 색상 분리는 다음과 같은 개념으로 구현할 수 있다. 실제 프로젝트에서는 색 공간과 톤 매핑 순서를 렌더 파이프라인에 맞춰 확인해야 한다.

float3 GradeGothic(float3 color)
{
    float luminance = dot(color, float3(0.2126, 0.7152, 0.0722));
    float shadowWeight = 1.0 - smoothstep(0.08, 0.45, luminance);
    float highlightWeight = smoothstep(0.55, 0.95, luminance);

    float3 coolShadow = float3(0.82, 0.94, 1.08);
    float3 warmHighlight = float3(1.08, 0.96, 0.82);

    color *= lerp(1.0.xxx, coolShadow, shadowWeight * 0.18);
    color *= lerp(1.0.xxx, warmHighlight, highlightWeight * 0.10);
    return saturate(color);
}

이 예시는 그림자에는 약한 청색 편향을 하이라이트에는 약한 황색 편향을 준다. saturate를 무심코 적용하면 HDR 범위를 잘라낼 수 있으므로 실제 후처리 패스에서는 톤 매핑 전후의 데이터 범위를 명확히 알고 사용해야 한다.

자주 생기는 문제와 점검 방법

검은색이 뭉쳐 길을 찾기 어렵다

대비를 낮추기보다 먼저 그림자 리프트를 아주 조금 올리고 경로와 상호작용 물체에 제한적인 림 라이트나 색 대비를 준다. 고딕 분위기는 정보 부족이 아니라 정보의 선택적 노출에서 나온다.

Bloom 때문에 화면이 흐릿하다

Bloom 강도만 낮추지 말고 임계값과 광원 자체의 밝기를 함께 점검한다. 낮은 임계값은 벽의 반사광과 안개까지 퍼뜨려 화면을 탁하게 만든다.

색이 예쁘지만 UI와 이펙트가 묻힌다

후처리 전후 중 어느 단계에 UI가 합성되는지 확인한다. 월드 공간 이펙트는 컬러 그레이딩의 영향을 받으므로 위험 신호에 필요한 색상 대비를 장면 팔레트 안에서 다시 확보해야 한다.

에디터에서는 괜찮은데 실제 플레이에서 다르다

게임 카메라, 품질 설정, HDR 출력, 톤 매퍼, 자동 노출 상태가 모두 같은지 비교한다. 특히 씬 뷰와 게임 뷰의 노출 조건이 다르면 그레이딩 판단도 달라진다.

마무리

어두운 고딕 룩의 컬러 그레이딩은 어둡게 만드는 기술이 아니라 제한된 빛과 색이 더 의미 있게 보이도록 정리하는 기술이다. 노출로 명도 구조를 안정시키고 차가운 그림자와 따뜻한 광원을 분리한 다음, 마지막에 LUT와 미세 조정으로 룩을 고정하자.

가장 좋은 검증 방법은 밝은 광원 하나, 넓은 그림자 하나, 플레이어가 찾아야 할 목표 하나가 동시에 들어오는 실제 플레이 구간을 반복해서 보는 것이다. 그 화면에서 길이 읽히고 광원이 목적지를 만들며 색이 세계관을 지지한다면 그레이딩은 제대로 작동하고 있다.