불 꺼진 방에서도 보이는 것
Esc

    불 꺼진 방에서도 보이는 것

    –렌더링셰이더

    네온사인, 용암, 켜져 있는 모니터 화면, 우주선 계기판의 버튼. 이것들은 빛을 받아서 밝은 게 아닙니다. 스스로 냅니다.

    앞의 항들은 전부 “빛이 얼마나 들어왔나” 를 계산합니다. 들어온 빛이 없으면 0입니다. 그런데 네온사인은 불 꺼진 방에서도 보여야 합니다.

    계산에 참여하지 않습니다

    float3 emissive = emissionColor * emissionMap.rgb;
    float3 color = ambient + diffuse + specular + emissive;

    법선도 안 쓰고, 시선도 안 쓰고, 광원도 안 씁니다. 정해진 색을 그냥 더합니다.

    Ambient 도 상수이긴 한데 역할이 다릅니다. Ambient 는 “이 표면에 최소 이만큼은 빛이 들어온다” 는 입력이고, Emissive 는 “이 표면이 이만큼을 내보낸다” 는 출력입니다. 계산 순서 어디에도 안 끼어들고 마지막에만 얹힙니다.

    광원을 꺼 보면 압니다

    아래에서 Emissive 를 켠 다음 광원 끄기 를 눌러 보세요.

    광원을 끄면 Diffuse 가 0으로 떨어집니다. 빛이 안 들어오니 당연합니다. 그런데 Emissive 칸은 폭이 그대로입니다. 들어온 빛과 무관한 값이니까요.

    Emissive 를 켜 두면 구가 균일하게 달아오릅니다. 명암이 안 생깁니다. 법선을 안 쓰니 자리마다 달라질 이유가 없어서입니다. 이게 발광체가 평평해 보이는 이유이기도 합니다.

    결정적인 제약

    Emissive 는 다른 물체를 안 비춥니다.

    네온사인을 아무리 밝게 만들어도 그 옆의 벽은 어두운 채입니다. 화면에서 그 물체만 밝을 뿐, 장면의 조명 계산에는 이 값이 들어가지 않습니다. 픽셀 색에 더해지는 것이 전부입니다.

    그래서 발광체 옆이 어색해집니다. 밝은 간판이 벽에 걸려 있는데 벽에는 아무 자국도 없습니다. 실제로 빛을 내는 물건 옆에는 반드시 번진 자국이 생기는데 그게 없습니다.

    보완하는 방법

    무엇 어떻게 값
    광원을 같이 둔다 발광체 자리에 실제 광원을 하나 넣습니다 가장 확실하고 가장 비쌉니다
    라이트맵에 구워 넣는다 발광체가 주변을 비춘 결과를 미리 계산해서 텍스처로 저장합니다 공짜로 보이지만 물체도 빛도 못 움직입니다
    에어리어 라이트 면 광원으로 다뤄서 넓게 퍼지는 빛을 냅니다 중간 비용, 실시간

    셋 다 “Emissive 가 못 하는 일을 다른 것이 대신한다” 는 구조입니다. Emissive 자체는 여전히 색을 더하기만 합니다.

    블룸은 조명이 아닙니다

    밝은 발광체 주위에 빛이 번지는 효과를 블룸이라고 합니다. 이게 있으면 발광체가 훨씬 그럴듯해 보여서 조명처럼 착각하기 쉽습니다.

    블룸은 후처리입니다. 다 그려진 화면에서 밝은 픽셀만 골라내 흐리게 뭉갠 다음 원본에 더합니다. 카메라 렌즈 안에서 빛이 산란하는 것을 흉내낸 것이라, 렌즈가 겪는 일이지 장면이 겪는 일이 아닙니다.

    그래서 블룸을 켜도 옆 벽은 여전히 안 밝아집니다. 화면상 번져 보일 뿐입니다.

    1을 넘는 값을 씁니다

    블룸이 밝은 픽셀을 골라내려면 기준이 필요한데, 모든 색이 1에서 잘려 있으면 흰 종이와 네온사인이 같은 값이 됩니다.

    그래서 Emissive 에는 1보다 큰 값을 넣습니다. 색에 세기를 따로 곱해서 5든 20이든 만듭니다. 렌더링은 그 값을 그대로 들고 가다가 화면에 낼 때 톤매핑으로 0에서 1 범위에 밀어 넣습니다. 그 사이에 블룸이 임계값을 넘은 픽셀을 골라냅니다.

    Unity 에서 Emission 색을 고를 때 Intensity 슬라이더가 따로 있는 이유가 이것입니다. 색과 세기를 나눠 둬야 1을 넘길 수 있습니다.

    PBR 로 바뀌어도 그대로 남았습니다

    요즘 엔진의 기본 셰이더는 확산과 반사를 금속성과 거칠기로 다시 쓰면서 계수를 손으로 잡던 방식을 걷어냈습니다. 그런데 Emissive 만은 이름도 역할도 그대로입니다.

    애초에 근사가 아니기 때문입니다. 확산과 반사는 “이렇게 하면 그럴듯해 보이더라” 였지만, 스스로 내는 빛을 더한다는 것은 물리적으로도 맞는 서술입니다. 고칠 게 없었습니다.

    정리

    • Emissive 는 물체가 스스로 내는 빛입니다. 들어온 빛과 무관합니다.
    • 법선도 시선도 광원도 안 씁니다. 정해진 색을 마지막에 더하는 것이 전부라 어두운 방에서도 보입니다.
    • 명암이 안 생깁니다. 법선을 안 쓰니 자리마다 달라질 이유가 없습니다.
    • 다른 물체를 안 비춥니다. 밝은 간판 옆 벽은 그대로 어둡습니다. 광원을 같이 두거나, 라이트맵에 굽거나, 에어리어 라이트를 씁니다.
    • 블룸은 조명이 아니라 후처리입니다. 화면에서 번져 보일 뿐 장면은 안 밝아집니다.
    • 블룸이 골라낼 수 있도록 1보다 큰 값을 씁니다. 그래서 색과 세기를 따로 둡니다.
    • 네 항 중 유일하게 PBR 로 넘어가면서도 안 바뀌었습니다. 근사가 아니라 맞는 서술이었기 때문입니다.