모닥불 하나 켜려다
조명을 다 뜯어고쳤다
2026.09.14 · 9월 13~14일 작업 기록
밤에 모닥불을 피워 놓고 한참 봤습니다. 불꽃은 잘 흔들리는데 주변이 하나도 안 밝습니다. 열 칸 밖이나 불 바로 옆이나 똑같이 캄캄했습니다.
분위기 있는 연출이라고 우길까 하다가 코드를 열어 봤습니다. 모닥불에 광원이 아예 없었습니다.
3D로 만들던 시절에는 있었는데, 2D로 옮기면서 통째로 빠져 있었더군요. 그 한 줄 붙이러 들어갔다가 조명이랑 그림자를 전부 다시 보게 됐습니다.
색이 날아가는 문제
시간대별로 조명 색을 입히고 있었는데, 새벽에 보면 초록 나무가 갈색이었습니다. 밤에는 나무도 땅도 캐릭터도 전부 같은 보라색이었고요. 계절감이라고 하기에는 좀 심했습니다.
범인은 둘이었습니다.
하나는 곱하는 빛. 파란 빛을 잔디에 곱하면 잔디가 파래질 것 같지만, 실제로는 그냥 검어집니다. 초록에는 파랑 성분이 거의 없으니까요. 없는 걸 곱하면 0이죠. 학교에서 배운 내용인데 화면에서 보기 전까지는 감이 안 왔습니다.
다른 하나는 덧칠하는 빛입니다. 모든 픽셀에 같은 값을 더하니까 어두운 부분까지 똑같이 들려 올라갑니다. 그림 위에 물감을 얇게 한 겹 칠하는 셈입니다. 재어 보니 그 물감이 원본 그림보다 두 배 진했습니다.
여기까지 고치고 나서도 낮에 캐릭터 얼굴이 허옇게 떴습니다. 빛 세기가 1을 넘고 있었습니다. 3D였으면 톤매핑이 알아서 받아 줬을 텐데, 2D 스프라이트는 이미 다 그려진 그림이라 1을 넘기는 순간 그냥 잘려 나갑니다. 살색이랑 모래 바닥이 딱 그렇게 증발했습니다.
결론은 조금 허무합니다. 이 게임의 조명은 어둡게 하고 살짝 물들이는 일만 하면 됩니다. 밝히는 건 아트가 이미 다 해 놨더라고요.
하늘이 없는데 달을 보여주기
아이소메트릭 뷰라 하늘이 안 보입니다. 그러니까 달도 안 보입니다. 게임에 달이 있긴 한데 아무도 못 봅니다.
그래서 물에 비치게 했습니다. 물가를 걸으면 수면에 달이 맺히고, 달빛 길이 나를 따라옵니다. 밤에 호숫가 걸을 때 실제로 그렇게 보이니까요.
이왕 하는 김에 위상도 넣었습니다. 태양이랑 똑같은 계산에 시각만 위상만큼 늦게 넣으면 됩니다. 보름달은 자정에 제일 높이 뜨고, 삭이면 낮에 태양이랑 같이 다닙니다.
삭망월은 8일로 잡았습니다. 실제로는 29.5일인데, 이 게임의 1년이 16일입니다. 그대로 넣으면 한 해에 보름달을 반 번 봅니다.
햇살과 새벽 안개
해가 내리쬘 때 화면 위쪽으로 아주 옅게 햇살이 내려오게 했습니다. 위쪽의 나무랑 건물에 살짝 얹히면서 역광처럼 읽힙니다.
처음에는 당연히 조명으로 하려고 했습니다. 그런데 조명은 화면 전체에 똑같이 깔립니다. 위쪽만 밝히고 아래쪽은 두는 게 안 됩니다. 그래서 화면 위쪽에만 있는 얇은 판으로 만들었습니다. 캐릭터가 서 있는 아래쪽은 한 톤도 안 건드립니다.
새벽에는 물가에 안개를 깔았습니다. 화면 전체를 뿌옇게 만드는 게 아니라 물과 뭍의 경계를 찾아서 거기에만 얹습니다. 해 뜨면 걷힙니다.
그림자가 옮겨 가던 문제
모닥불에 불빛을 붙이고 나니 욕심이 생겼습니다. 불 옆에 선 나무는 그림자가 반대쪽으로 누워야 하잖아요.
그래서 있던 그림자를 불빛 쪽으로 꺾었습니다. 켜 보니 해가 멀쩡히 떠 있는 대낮에 모닥불 하나가 태양을 이기고 있었습니다.
그림자는 꺾는 게 아니라 하나 더 생기는 거였습니다. 지금은 같은 물체를 두 번 그립니다. 한 번은 태양, 한 번은 불빛. 태양 그림자는 제자리에 있고 불빛 그림자가 한 장 더 깔립니다.
검 휘두를 때 나오는 섬광도 처음에는 그림자에 넣었다가 뺐습니다. 0.2초짜리 광원이라 한 대 칠 때마다 온 동네 그림자가 경련을 일으켰습니다.
표본을 늘려도 나아지지 않습니다
그림자 가장자리가 계단처럼 각져 있어서 부드럽게 만들기로 했습니다. 표본을 4개에서 13개로 늘렸습니다. 세 배 넘게 늘렸으니 세 배쯤 부드러워지겠거니 했습니다.
얼룩덜룩해졌습니다.
재어 보고 나서야 알았습니다. 그림자 판정이 "가렸다 / 안 가렸다" 둘 중 하나라서, 13개를 평균해 봐야 값이 14단계밖에 안 나옵니다. 부드러워지는 게 아니라 계단이 열네 칸이 될 뿐이고, 표본 자리가 픽셀마다 다르니까 그게 얼룩으로 보입니다.
필요한 건 개수가 아니라 표본 한 번이 연속된 값을 내는 거였습니다. 이웃한 네 칸의 판정을 위치에 따라 섞으니 한 번에 매끄러워졌습니다. 그림자 맵 해상도는 오히려 낮췄습니다. 칸이 굵어질수록 저절로 부드러워지고, 덤으로 굽는 비용이 절반 이하가 됐습니다. 처음부터 이렇게 할 걸 그랬습니다.
눈이 38초 만에 쌓였습니다
겨울에 눈이 오면 설원이 되는 건 맞습니다. 그런데 눈발 몇 개 날린 지 38초 만에 그러는 건 좀 아니었습니다.
땅이 완전히 하얘 보이는 지점이 실제 적설량의 4분의 1 지점이라는 걸 몰랐던 게 원인이었습니다. 나머지 4분의 3은 화면에서 거의 티가 안 납니다. 그것도 모르고 "1까지 쌓이는 데 3분"으로 맞춰 놨으니 하얘지는 데는 38초였던 거죠.
지금은 그 지점까지 3분 30초쯤 걸립니다. 긴 눈 한 번이 거의 다 덮고, 겨울 내내 여러 번 내리면서 쌓입니다.
내리는 눈에는 원근도 넣었습니다. 가까운 눈은 크고 빠르게, 먼 눈은 작고 느리게 내립니다. 깊이를 제곱해서 뽑으면 먼 눈이 많고 가까운 눈이 드물어져서 실제 눈 오는 풍경에 가까워집니다.
지붕에 눈을 쌓는 가장 게으른 방법
건물 위에도 눈이 쌓이면 좋겠는데, 건물이 33종입니다. 눈 덮인 그림을 33장 더 그릴 자신이 없었습니다.
그래서 그리지 않기로 했습니다. 대신 스프라이트에서 머리 위가 비어 있는 픽셀을 찾습니다. 위쪽이 투명하면 그게 지붕이고 차양이고 기둥 머리입니다.
그림 한 장 없이 33종이 전부 덮였습니다. 앞으로 건물을 더 추가해도 알아서 따라옵니다. 이런 건 좀 뿌듯합니다.
모닥불이나 제련소처럼 불 쓰는 시설에는 안 쌓입니다. 땅에서 열원 주변 눈이 녹는 것과 같은 판정을 씁니다. 녹을 때는 눈 아랫단이 처지고 처마에서 물방울이 떨어져 바닥에 작은 고리를 남깁니다.
시작하면 모닥불이 곁에 있습니다
새 세계에 들어가면 플레이어 옆에 모닥불이 하나 놓여 있게 했습니다.
원래는 재료를 가방에 쥐어 주고 원하는 자리에 직접 짓게 했습니다. 그런데 빈손 시작으로 바꾸는 과정에서 그 지급 코드가 어느 순간 호출되지 않고 있었습니다. 거점도 재료도 없이 허허벌판에서 시작하고 있었던 겁니다. 한동안.
이제 첫 화면부터 불이 타고 있고, 밤이면 그 주위가 밝고 그림자가 집니다. 불꽃도 예전의 삼각형 두 개 대신 제대로 타오르는 이펙트로 바꿨습니다.

남은 이야기
이번 작업은 기능을 새로 넣었다기보다 이미 있던 게 제대로 보이게 만든 쪽에 가깝습니다. 불은 있는데 빛이 없었고, 눈은 내리는데 너무 빨리 쌓였고, 조명은 있는데 색을 먹고 있었습니다.
생활하는 게임이면 계속 보고 있는 것들이 자연스러워야 하니까요. 밭이나 물처럼, 빛과 그림자도 그렇습니다.
여기 적은 내용은 Windows 1.5.47에 들어 있습니다. 참고로 이 빌드를 만들다가 셰이더 하나가 컴파일에 실패해서 나무랑 바위랑 건물이 전부 분홍색으로 나올 뻔했습니다. 배포 전에 잡았습니다.