게임에서 모닥불을 도끼로 베어도 불은 그대로인 경우가 많습니다. 불이 타는 모습을 미리 그려 둔 그림(플립북)을, 카메라를 늘 마주 보는 판 위에 넘기고 있어서 그렇습니다.
이 글의 불은 불 모양을 그리지 않고, 불이 타는 공간의 공기를 작은 칸으로 나눠 매 프레임 계산합니다. 보이는 불은 그 칸들 가운데 뜨거운 칸을 셰이더가 그린 것이라, 도끼나 공이 지나가거나 냄비와 고기를 올리면 공기가 밀리고 불도 바뀝니다. 이 계산을 언리얼 엔진 안에 직접 짜서 돌려 봤고, 우리가 잰 PC 의 1080 × 1080 화면에서 냄비를 올린 이 불 하나는 불빛까지 60 fps 게임 한 프레임의 15% 를 썼습니다(그림 1).
영상판 — 화면은 언리얼 엔진 5.8 에 배경 에셋(CGHERO 의 Arabian Pack)을 놓고 장작과 불, 도끼, 공, 냄비, 고기를 얹어 찍었고 게임 화면이 아닙니다. 소품을 놓은 자리와 움직임, 불의 값은 모두 우리가 정했습니다.

보통 게임 속 불은 미리 그린 그림입니다
유비소프트의 물리 프로그래머 Shahin Rabbani 는 게임 개발자 회의 GDC 의 2021년 발표 Torch Them All 에서 게임 속 불 효과를 두고 이렇게 말했습니다. 그는 그 대안으로 2D 로 계산하는 불을 발표했습니다(마지막 절).
"These are just pre-made animations." 이것들은 미리 만든 애니메이션일 뿐이다.
스컬 앤 본즈의 VFX 테크 디렉터였던 Mederic 도 Real Time VFX 포럼 글에서, 게임의 폭발 같은 이펙트를 더 낫게 보이게 하는 흔한 방법이 애니메이션 텍스처, 곧 플립북이라고 적었습니다. 플립북은 타는 모습 수십 장을 텍스처 한 장에 모아 둔 것입니다.
미리 그린 그림을 쓰는 까닭은 비용입니다. 유니티는 2023년 블로그에서 볼륨 유체 시뮬레이션과 렌더링은 아직 게임에 널리 쓰기엔 너무 비싸 보인다며, 빛을 여러 방향에서 미리 베이크한 연기 텍스처를 소개했습니다.
플립북을 되도록 피한 게임도 있습니다. 디아블로 III 의 리드 테크니컬 아티스트였던 Julian Love 는 GDC 2013 발표에서, 플립북은 몇 분만 봐도 되풀이가 보여 환상이 깨진다며 군중 장면 말고는 되도록 피했다고 했습니다. 그래서 텍스처 여러 장을 곱하고 서로 다른 속도로 스크롤하는 셰이더를 거의 모든 이펙트에 썼고, 불에도 같은 기법을 썼다고 했습니다.
견주려고 우리도 2D 유체 시뮬레이션으로 플립북을 하나 만들었습니다. 가로세로 8장씩 64장이고, 한 장은 256 × 256 픽셀입니다(그림 2 왼쪽 칸의 오른쪽 위). 이 플립북을 늘 카메라를 마주 보는 판(빌보드)에 한 장씩 넘기면 어느 쪽에서 봐도 불처럼 보입니다. 판이 카메라를 따라 돌지 않게 일부러 멈추고 카메라가 옆으로 돌아가면, 판은 선 하나로 납작해집니다. 플립북이든 텍스처를 흘리는 셰이더든 불꽃 자체는 미리 정해 둔 그림이라 무엇이 지나가도 불꽃은 바뀌지 않습니다. 대신 불 둘레의 파티클과 나뭇잎, 머리카락은 바람을 따로 계산해 반응하게 만든 게임도 있습니다(마지막 절).

칸마다 바람과 열, 연료, 연기를 적어 둡니다
우리 불은 장작을 감싼 상자(바닥 110 × 110 cm, 높이 220 cm)를 96 × 96 × 192개, 약 177만 개의 칸으로 나눕니다. 한 칸은 1.15 cm 입니다. 칸마다 바람(속도), 열(온도), 연료(장작에서 나와 공기에 섞인, 아직 타지 않은 기체), 연기 네 가지 값을 16비트 숫자로 적어 두고, 1초에 60번 다시 계산합니다.
불 모양은 열이 어디로 실려 가느냐로 정해지고, 실어 나르는 것은 바람입니다. 한 번의 계산은 이런 순서입니다. 장작 겉면의 칸에 연료를 넣고, 뜨거운 칸에는 뜨거운 공기가 뜨는 힘(부력)을, 열이 있는 칸에는 작은 흔들림을 줍니다. 계산을 거듭하면 작은 소용돌이가 뭉개지기 쉬워서, 그 소용돌이를 되살리는 힘도 더합니다. 그다음 바람을 제 흐름을 따라 옮깁니다(이류, advection). 칸마다 바람을 거슬러 올라간 자리의 값을 가져와 제 값으로 삼는 식입니다. 이렇게 옮기고 나면 공기가 한쪽에 몰리거나 빈 곳이 생기므로, 칸마다 이웃과 맞추는 계산을 20번 되풀이해 몰리거나 빈 곳이 없는 바람에 가까워지게 고칩니다(투영, projection). 마지막으로 고친 바람을 따라 열, 연료, 연기를 옮기는데, 이때 일정 온도를 넘은 연료가 타서 열과 연기가 되고 열은 조금씩 식습니다.
이 순서의 뼈대(힘 → 이류 → 투영)는 컴퓨터 그래픽스 연구자 Jos Stam 의 Stable Fluids(1999)와 그가 게임용으로 풀어 쓴 GDC 2003 글의 방식이고, 두 글에 있는 점성 확산 걸음은 뺐습니다. 부력과 소용돌이를 되살리는 힘(vorticity confinement)은 Fedkiw, Stam, Jensen 의 연기 논문(2001)에 나오고, 논문은 소용돌이를 되살리는 힘을 Steinhoff 의 방법에서 가져왔다고 적었습니다. 우리는 이 계산을 컴퓨트 셰이더로 짜서 언리얼 엔진 안에서 돌립니다. 불 한가운데를 세로로 자르면 네 값이 이렇게 퍼져 있습니다(그림 3).

보이는 불은 뜨거운 칸을 셰이더가 그린 것입니다
계산이 끝나면 칸마다 연기의 짙기와 온도를 볼륨 텍스처 한 장에 담고, 상자 모양의 메시에 붙인 셰이더가 이것을 그립니다. 셰이더는 화면의 픽셀마다 시선을 따라 상자 안을 96걸음으로 나눠 걸으며 값을 쌓는 레이 마칭 방식입니다. 걸음마다 온도가 그리는 문턱을 넘으면 그 온도에 맞는 불꽃 색을 더하고, 연기는 뒤를 가리면서 위에서 내려오는 빛과, 그 자리 온도로 정한 불꽃 빛을 받습니다.
그래서 화면의 불은 따로 그린 그림이 아니라 칸의 온도를 그대로 그린 것입니다. 계산을 멈춘 한 순간의 칸을 4 × 4 × 4개씩 묶어 정육면체로 그려 보면, 그리는 문턱이 낮을 때는 불 위로 올라간 더운 공기까지 칸이 차 있고, 문턱을 올리면 뜨거운 칸만 남습니다. 셰이더는 이 뜨거운 칸을 불꽃으로 그립니다(그림 4).

이 셰이더는 직접 짰습니다. 처음에는 언리얼 엔진의 유체 이펙트 도구인 나이아가라 플루이드에 들어 있는 불 재질로 그렸는데, 우리 칸 크기에서는 불꽃 가장자리가 계단처럼 딱딱하고 속이 하얗게 꽉 차 보였습니다. 그래서 불꽃이 뒤를 조금만 가리게 해 반투명하게 하고, 픽셀마다 걸음의 시작 자리를 조금씩 어긋나게 해 계단 무늬를 지웠습니다.
무엇이 지나가면 그 칸의 공기가 밀립니다
그러니 공기를 움직이는 것은 무엇이든 불을 바꿉니다. 도끼에서는 세 점(날 하나, 자루 둘)만 봅니다. 한 번 계산하는 동안 세 점이 지나간 길을 양 끝이 둥근 막대(캡슐)로 보고, 그 안의 바람을 그 점의 속도 쪽으로 바꿉니다(가운데일수록 세게). 날 쪽 캡슐의 반지름은 12 cm, 자루 쪽은 4 cm 남짓입니다. 바람이 너무 빨라지면 불이 줄무늬처럼 찢어져서, 상자 전체에는 바람 속도의 상한(초속 3.4 m)을 두고 날과 자루가 막 지나간 자리에만 초속 12.4 m 까지 풀었습니다.
날이 지나간 칸의 뜨거운 공기는 날을 따라 쓸려 가고, 그 자리에는 둘레의 찬 공기가 들어옵니다. 그 칸의 온도가 그리는 문턱 아래로 내려가면 셰이더가 그 칸을 그리지 않아, 불이 날이 지나간 자리를 따라 갈라져 보입니다(그림 5).

공과 냄비, 고기 같은 물체는 차지한 칸을 단단한 칸으로 바꿉니다. 단단한 칸의 바람은 물체의 속도(돌고 있으면 도는 몫까지)가 되고, 공기는 단단한 칸을 지나가지 못하며, 단단한 칸 안의 열과 연기는 0 입니다. 물체 쪽으로 파고드는 바람은 지우고 물체 겉면을 따라 미끄러지는 바람은 남겨서, 냄비 밑에 부딪힌 불이 옆으로 퍼져 냄비를 타고 올라갑니다(그림 6). 물체 겉면에서 9 cm 쯤 안쪽의 칸 값을 옮길 때는 단단한 칸을 빼고 둘레의 공기 칸에서만 가져옵니다. 물체 안의 0 이 섞여 들면 불이 물체에 닿자마자 끊긴 것처럼 보이기 때문입니다.
물체 모양은 구, 캡슐, 상자, 원기둥 넷으로 넘깁니다. 냄비는 경계에 맞춘 원기둥으로, 고기는 가장 긴 축을 따른 캡슐로 넘겼습니다. 물체가 공기를 밀기만 하고 공기가 물체를 밀지는 않습니다.

불빛도 칸의 열에서 나옵니다
둘레의 땅과 돌을 비추는 라이트도 칸에서 정합니다. 매 프레임 GPU 에서 온도가 그리는 문턱을 넘은 칸을, 불의 가운데를 지나는 두 선으로 나눈 네 구역마다 모아, 온도가 문턱을 넘은 몫의 합과 그 무게 중심을 구합니다. 구역마다 불빛을 하나씩 두고, 자리는 그 구역의 무게 중심, 세기는 그 구역이 가진 몫으로 정합니다. 그래서 공이 불을 밀면 불빛의 자리와 세기도 따라 바뀝니다(그림 7).

불빛은 불꽃 크기쯤의 세로로 긴 모양(반지름 25 cm, 길이 60 cm)으로 두고, 그림자는 가장 센 하나만 드리웁니다. 무게 중심이 냄비 겉면 가까이 오면 큰 불빛이 냄비에 닿아 냄비가 등처럼 빛나므로, 불빛은 물체 겉면에서 10 cm 밖에 두고 물체에 닿지 않게 크기를 줄입니다.
이 불은 2.43 ms 를 씁니다
1080 × 1080 화면에 냄비를 올린 불을 두고 카메라를 고정한 뒤, 2초마다 다 켜고, 계산만 하고, 불빛까지 다 끄기를 되풀이하며 한 프레임의 GPU 시간 차이를 쟀습니다. 흔들림을 줄이려고 구간마다 가운데 값을 썼습니다.
이 불은 2.43 ms 로 60 fps 게임 한 프레임 16.7 ms 의 15% 였습니다. 유체 계산 0.60 ms, 그리기 0.68 ms, 불빛 넷(그 빛이 안개에 번지는 몫과 그림자 하나 포함) 1.14 ms 입니다(그림 8 · 각각 반올림한 값). 다 끈 때에도 불빛은 켜 두고 재면, 곧 불빛 몫을 빼면 1.29 ms 였습니다. 보통의 모닥불도 불빛 하나는 켜 두니, 우리 방식이 더하는 몫은 2.43 ms 보다 작을 것입니다. 영상의 놋쇠 냄비는 올리면 0.33 ms 쯤 늘었습니다. 잰 PC 는 i5-14600KF, RTX 5070 Ti(16 GB), RAM 32 GB 입니다.

처음 엔진에 옮긴 판은 칸이 128 × 128 × 256개(한 칸 0.86 cm)에 32비트 숫자였고 3.22 ms(계산 2.33 ms)였습니다. 칸을 지금 크기로 키우고 숫자를 16비트로 줄이자 1.00 ms 가 됐습니다(둘 다 냄비 · 불빛 없이, 나이아가라 플루이드의 불 재질로 그린 판). 지금의 1.29 ms 는 여기에 직접 짠 셰이더와 냄비를 더한 값입니다.
반대로 칸을 256 × 256 × 512개(한 칸 0.43 cm)로 촘촘히 나누고 압력 반복도 40번으로 늘린 판은 218 ms 로 한 프레임의 13배가 걸렸습니다.
같은 PC 에서 같은 칸 수(128 × 128 × 256)의 나이아가라 플루이드 불 템플릿은 2.7 ms 였습니다(불씨는 장작 대신 공 모양 · 카메라 위치가 조금 다름 · 계산과 그리기 합). 에픽 문서는 나이아가라 플루이드의 3D 템플릿을 실시간에서는 주인공 효과용, 그리고 시네마틱용이라고 적었습니다.
지금은 불이 없는 빈 칸까지 상자 전체를 매번 다 계산합니다. 엔비디아는 GDC 2015 에서 유체가 든 블록만 계산하는 방식(Sparse Fluid Simulation)을 발표했습니다. 우리도 넣어 봤지만, 칸 128 판에서는 불 둘레에도 열과 연기가 퍼져 있어 블록의 82%(연료까지 치면 98%)를 그대로 계산했고 시간은 2.81 → 2.69 ms 로 거의 그대로였습니다. 두 배 넓은 상자에서는 블록의 18% 만 계산해 13.36 → 3.43 ms 로 줄었지만, 빈 칸의 바람과 연료가 빠지면서 불이 가는 기둥처럼 돼 쓰지 않았습니다.
게임 쪽에서도 계산을 줄이는 길을 찾습니다. Rabbani 의 발표는 불을 2D 로 계산하고 카메라 쪽으로 세워 입체처럼 보이게 하는 방식(Torch)이었고, Xbox One 에서 그리기를 뺀 계산만 133 마이크로초였다고 했습니다. 갓 오브 워(2018)의 GDC 2019 발표는 플레이어를 둘러싼 바람만 32 × 16 × 32칸으로 계산해 파티클과 나뭇잎, 머리카락을 흔든다고 했습니다. 주 그래픽 파이프에서 돌린다고 치면 0.1 ms 쯤이고 실제로는 다른 일과 비동기로 돌리며, 열은 다루지 않고, 주인공 크레이토스의 도끼질도 그 바람을 만든다고 했습니다.
참고 자료
- Jos Stam, Stable Fluids (SIGGRAPH 1999). 이류와 투영 https://www.dgp.toronto.edu/public_user/stam/reality/Research/pdf/ns.pdf
- Jos Stam, Real-Time Fluid Dynamics for Games (GDC 2003). 같은 방식을 게임용으로 https://www.dgp.toronto.edu/public_user/stam/reality/Research/pdf/GDC03.pdf
- Ronald Fedkiw, Jos Stam, Henrik Wann Jensen, Visual Simulation of Smoke (SIGGRAPH 2001). 부력과 소용돌이를 되살리는 힘, Steinhoff 의 방법 http://graphics.ucsd.edu/~henrik/papers/smoke/smoke.pdf
- Shahin Rabbani(Ubisoft), Torch Them All: How I Learned to Stop Worrying and Make Fire (GDC 2021). 미리 만든 애니메이션, 2D 시뮬레이션, Xbox One 에서 계산 133 마이크로초 https://gdcvault.com/play/1027401/
- Mederic, Smoke Lighting and texture re-usability in Skull & Bones (Real Time VFX). 플립북 https://realtimevfx.com/t/smoke-lighting-and-texture-re-usability-in-skull-bones/5339
- Rupert Renard(Santa Monica Studio), Wind Simulation in 'God of War' (GDC 2019). 32 × 16 × 32, 주 그래픽 파이프 기준 0.1 ms, 바람에 흔들리는 것(파티클 · 나뭇잎 · 머리카락), 도끼질 바람 https://media.gdcvault.com/gdc2019/presentations/Renard_Rupert_Wind_Simulation.pdf
- Julian Love(Blizzard), Technical Artist Bootcamp: The VFX of Diablo (GDC 2013 · 발표 녹화 사본). 플립북을 되도록 피하고 텍스처를 곱해 스크롤하는 셰이더, 불에도 같은 기법 https://www.youtube.com/watch?v=UJI7vPiu-g4
- Mathieu Muller(Unity), Realistic smoke lighting with 6-way lighting in VFX Graph (2023). 볼륨 유체는 아직 비싸다, 여러 방향 빛을 베이크한 연기 https://unity.com/blog/engine-platform/realistic-smoke-with-6-way-lighting-in-vfx-graph
- Alex Dunn(NVIDIA), Sparse Fluid Simulation in DirectX (GDC 2015). 유체가 든 블록만 계산 https://gdcvault.com/play/1021767/
- Epic Games, Niagara Fluids in Unreal Engine(문서). 3D 템플릿은 실시간 주인공 효과와 시네마틱용 https://dev.epicgames.com/documentation/en-us/unreal-engine/niagara-fluids-in-unreal-engine
- 배경 에셋: Arabian Pack, CGHERO(Fab) https://www.fab.com/listings/2f06f74d-db49-4ce9-83e5-0f08e51af597
- 도끼: Wooden Axe 02, Ulan Cabanilla(Poly Haven, CC0) https://polyhaven.com/a/wooden_axe_02
- 냄비: Brass Pot 01, Rico Cilliers(Poly Haven, CC0) https://polyhaven.com/a/brass_pot_01
- 고기: Smoked Deer Leg(Quixel Megascans, Fab)
'게임개발뜯어보기' 카테고리의 다른 글
| 이 게임 캐릭터는 다음 동작을 고르지 않고 다음 자세를 찾는다 - 모션 매칭 (0) | 2026.10.22 |
|---|---|
| 팩토리오 벨트는 아이템 자리 대신 간격을 적는다 - 팩토리오의 최적화 (0) | 2026.10.20 |
| 게임 핵 vs 안티치트, 끝나지 않는 싸움 - 커널부터 TPM과 DMA 카드까지 (1) | 2026.10.17 |
| 게임 속 총알은 총알이 아닙니다 - 투사체 판정과 레이캐스트 (0) | 2026.10.15 |
| 게임 속 주민은 냉장고 쓰는 법을 모릅니다 - 스마트 오브젝트 (0) | 2026.10.14 |