1P by GN⁺ | ★ favorite | 댓글 1개
  • Daniel Schroeder는 90년대 3D 게임의 픽셀화된 표면 감각을 작은 복셀 표면 디테일로 확장하는 실시간 렌더러를 개발 중이며, 입력 자산은 익숙한 저폴리 삼각형 메시와 텍스처를 사용함
  • 장면 전체를 복셀 격자로 만들지 않고 디스플레이스먼트 맵으로 표면만 복셀처럼 보이게 해 Doom, Quake, Duke Nukem식 정적 환경에 맞춘 시각 스타일을 노림
  • CPU는 삼각형 메시와 제한된 디스플레이스먼트 정보를 GPU용 지오메트리 데이터로 변환하고 텍스처를 전처리하며, 프레임 렌더링은 GPU가 거의 독립적으로 처리함
  • 데모는 Radeon RX 5700 XT에서 1440p 기준 4~9ms 프레임 타임을 보이고, Steam Deck OLED의 800p에서는 60FPS 이상과 많은 구간의 90FPS 고정에 도달함
  • 환경을 여전히 삼각형 메시로 다룰 수 있어 충돌, 캐릭터 컨트롤러, 경로 탐색은 기존 물리 라이브러리와 메시 기반 처리로 해결하고, 필요한 일부 시스템만 복셀 세부 형상을 의식하면 됨

90년대 3D 미학을 복셀 표면으로 확장

  • 목표는 고전 90년대 3D 게임의 단순한 환경 지오메트리와 선명한 텍스처 경계를 유지하면서, 표면에 블록형 3D 디테일을 더하는 것임
  • Doom, Quake, Duke Nukem 같은 초기~중기 90년대 3D 게임은 기술과 게임플레이 양쪽에 큰 영향을 줬고, 최근에는 당시의 시각적 한계 자체가 레트로 매력으로 받아들여짐
  • 출발점은 “픽셀 대신 복셀로 표면 디테일을 만들면 어떨까”라는 질문임
    • 예를 들어 조약돌 벽은 가까이서도 픽셀화된 느낌을 유지하면서 기하학적 깊이를 가질 수 있음
  • 결과물은 90년대 게임의 외형과 더 현대적인 표현 사이에 놓이도록 설계됨

일반적인 복셀 방식의 제약

  • 일반적인 복셀 메시는 각 큐브형 셀이 채워졌는지 비어 있는지를 나타내는 3차원 격자임
    • Minecraft처럼 큰 복셀에 텍스처를 입힐 수 있음
    • Teardown처럼 작고 단색인 복셀을 사용할 수도 있음
  • 복셀 기반 환경을 만들려면 모든 지오메트리를 공유 격자에 배치하거나, 여러 독립 복셀 메시를 같은 공간에 배치해야 함
  • 복셀 지오메트리를 직접 제작하는 도구는 있지만, 제작 과정이 오래 걸리고 작은 메시 제작에 제한되는 경우가 많음
  • 타일형 벽이나 바닥 같은 빌딩 블록을 만들어 큰 구조물을 조립할 수 있지만, 격자 정렬 건물에는 잘 맞고 자유로운 지형에는 잘 맞지 않음
  • 절차적 생성은 자연 환경과 빌딩 블록 조합에 유용하지만 자체적인 어려움이 있으며, 특정 종류의 게임에만 적합함
  • 기존 삼각형 메시를 복셀 격자로 래스터화할 수도 있지만, 결과 지오메트리가 하나의 복셀 격자에 놓이면서 원하지 않는 미학적 결과가 생길 수 있음
    • 축 정렬된 면은 평평한 복셀 판처럼 보이고, 45도 면은 계단처럼 보일 수 있음
  • 장면의 정식 표현이 복셀이 되면 렌더링뿐 아니라 물리, 캐릭터 컨트롤러, NPC 경로 탐색 같은 게임 로직도 복셀 수준에서 동작해야 할 수 있음
  • 대신 Minecraft와 Teardown처럼 복셀 메시에서 지오메트리를 추가하거나 제거하기 쉬운 장점이 있음

일반적인 디스플레이스먼트 방식의 한계

  • 디스플레이스먼트 매핑은 텍스처와 함께 디스플레이스먼트 맵을 사용해, 텍스처의 각 픽셀이 메시 표면에서 안쪽이나 바깥쪽으로 얼마나 이동할지 정의함
  • 3D 모델링 소프트웨어는 메시를 세분화한 뒤 새 정점을 이동시켜 디스플레이스먼트를 실제 지오메트리로 만들 수 있음
    • 이 방식은 물체의 실루엣에도 영향을 줌
    • 결과 메시의 폴리곤 수가 크게 증가함
    • 단단한 모서리나 코너가 있는 입력 메시는 좋은 결과를 위해 수정이 필요함
  • 실시간 그래픽에서는 parallax occlusion mapping 같은 표면 셰이딩 효과로 실제 형상을 바꾸지 않고 세밀한 지오메트리처럼 보이게 만들 수 있음
    • 큰 바닥과 벽에서는 좋아 보일 수 있음
    • 물체 가장자리에서는 지오메트리가 여전히 평평해 환상이 깨짐
  • shell mapping은 고도로 세분화된 메시 없이도 물체 실루엣에서 디스플레이스먼트를 볼 수 있게 하는 중간적 접근임
    • 입력 메시의 곡률이 높은 영역에서는 다루기 어려움
    • 단단한 모서리나 코너가 있는 입력 메시를 이 기법에 맞추기도 쉽지 않음

구현 방식: 복셀과 디스플레이스먼트 매핑 결합

  • 이 렌더러는 고전 3D 게임 같은 환경을 저폴리 삼각형 메시로 만들고, 디스플레이스먼트 맵으로 복셀 스케일 표면 디테일을 정의한 뒤, 실제 복셀로 조립된 것처럼 보이게 렌더링함
  • 건물 코너처럼 날카로운 에지가 많은 환경을 대상으로 하므로, 일반 디스플레이스먼트 매핑이 어려워하는 영역에서도 복셀 같은 결과가 필요함
  • 현재 구현은 독립 실행형 C++ / Vulkan 프로젝트임
  • 인프라는 세 가지 주요 작업을 수행함
    • 삼각형 메시와 제한된 디스플레이스먼트 맵 정보를 받아, GPU가 변형된 메시를 그릴 때 사용할 지오메트리 데이터로 변환함
      • 이 과정은 프레임 렌더링 전에 CPU에서 실행됨
      • 출시 게임에서는 결과를 디스크에 베이크할 수 있음
      • 영상의 데모 환경 전체 변환은 단일 스레드에서 0.5초가 걸림
    • 텍스처를 전처리해 렌더링 중 필요한 노멀 맵 같은 정보를 생성함
      • 작업 자체는 기본적이지만 느리므로 베이크가 적합함
    • 생성된 메시와 텍스처 상태를 사용해 GPU에서 복셀 디스플레이스먼트 지오메트리를 그림
      • 프레임당 CPU 관여는 거의 없음
  • 성능은 이미 실사용 가능한 수준임
    • Radeon RX 5700 XT에서 데모 시퀀스는 1440p 기준 4~9ms 프레임 타임으로 렌더링됨
    • 이는 250~110FPS에 해당함
    • Steam Deck OLED의 네이티브 800p에서는 60FPS 이상을 유지하고, 많은 구간은 90FPS에 고정됨

아트 자산 제작 방식

  • 콘텐츠 제작에는 텍스처와 메시 두 종류의 자산이 필요함
  • 각 텍스처는 albedo map과 displacement map으로 작성됨
    • albedo는 레트로 게임의 제한된 팔레트를 흉내 내면 시각 스타일을 설득력 있게 만드는 데 도움이 됨
    • displacement map은 세밀한 높이 값을 제공하며, 렌더러에서 스케일을 조정해 강도를 바꿀 수 있음
    • 스케일 조정 후 높이 단위는 표면을 안쪽이나 바깥쪽으로 몇 복셀 이동할지임
  • 렌더러는 가장 가까운 정수 복셀 단위로만 변위시키지만, 정확한 높이 값은 노멀 맵 계산에 사용함
    • 복셀 하나보다 낮은 특징도 조명에는 영향을 줄 수 있음
  • 메시는 셰이딩 노멀을 가진 일반적인 저폴리 텍스처 매핑 삼각형 메시임
    • 노멀은 어떤 부분이 부드럽게 휘어진 표면인지, 어떤 에지가 날카로운 에지인지 나타냄
    • 렌더러는 날카로운 에지에서 좋은 결과를 만들기 위해 추가 작업을 수행함
  • 시각 스타일을 위해 텍스처 매핑 시 복셀 크기를 일정하게 유지하려 하지만, 필수 조건은 아님
  • 메시 구조와 텍스처 매핑에는 제한이 있음
    • 일부 제한은 향후 제거 가능함
    • 일부 제한은 렌더러 동작 방식 때문에 피할 수 없음
  • 자산은 전용 복셀 표현이 아니라 삼각형 메시이므로 여러 도구로 만들 수 있음
    • 데모 환경은 Blender로 모델링됨
    • 현재 Blender에서 데모로 내보내는 형식은 OBJ 파일임

게임 제작에서의 장점과 적용 범위

  • 이 방식은 특수한 복셀 편집 도구 대신 익숙한 워크플로로 콘텐츠를 만들 수 있게 함
  • 좋은 텍스처 제작은 어려울 수 있지만, 한 번 만들면 여러 지오메트리에 재사용하기 쉬움
    • 영상 데모의 지오메트리 상당 부분은 세 가지 색상의 단일 석재 블록 텍스처를 사용함
  • 환경은 삼각형 메시로 제작되고 복셀 특징은 표면 장식이므로, 편할 때는 환경을 폴리곤 지오메트리로 취급할 수 있음
  • 데모 애플리케이션은 1인칭 시점 이동, 충돌, 계단 오르기, 벽 충돌을 지원함
    • 자체 물리 엔진이나 캐릭터 컨트롤러를 작성하지 않음
    • 오픈소스 Jolt Physics를 통합함
    • 원래 삼각형 메시를 충돌 지오메트리로 사용함
  • 적 이동과 경로 탐색도 같은 메시 기준으로 해결할 수 있음
  • 일부 게임플레이 시스템만 복셀을 의식하면 됨
    • 예를 들어 1인칭 슈터에서는 총알이 변위된 지오메트리의 정확한 형상을 따르도록 displacement-aware raycast 함수를 구현할 수 있음
  • 많은 복셀 기반 게임은 여러 게임 시스템을 맞춤 제작해야 해서 자체 엔진을 사용하지만, 이 접근은 렌더링 외 대부분의 로직이 복셀 스케일 디테일을 몰라도 됨
  • 기존 엔진에 이 렌더링 기법을 통합하는 경로가 가장 현실적인 방향임

남은 과제와 다음 단계

  • 현재 구현은 레벨 지오메트리 제작에는 잘 맞지만, 게임 환경에는 작은 오브젝트, 장식, 적 같은 동적 요소도 필요함
  • 향후에는 작은 오브젝트나 애니메이션 오브젝트를 이 아트 스타일에 통합하는 방법을 추가할 계획임
  • 데모의 조명은 이미 좋아 보이지만 현재 구현에는 제한이 있음
    • 작은 수의 조명만 지원함
    • 그림자, 앰비언트 오클루전, 더 고급 기능은 없음
  • 이 렌더러는 일반적인 복셀 게임처럼 매우 동적인 지오메트리보다 대부분 게임이 가진 대체로 정적인 환경을 대상으로 함
    • 특정 애플리케이션 필요에 따라 베이크 방식 등을 포함해 다양한 조명 처리 여지가 있음
  • 현재 안티앨리어싱이 없으며, 특히 먼 바닥에서 눈에 띔
  • 프로젝트의 향후 계획과 개발자·스튜디오를 위한 논의는 두 번째 글에서 이어짐

댓글과 토론

Hacker News 의견들
  • 2400 baud 모뎀으로 게임을 받던 시절을 기억할 만큼 나이가 있어서인지, 이 미학이 정말 매력적으로 느껴짐
    영상도 훌륭했고 개인적으로는 분위기를 강하게 불러일으켰음
    지붕이 너무 낮은 구간에서는 폐소공포와 답답함까지 느껴졌고, 바위와 모래 바닥 동굴, 바위가 있는 동굴은 정말 아름다워서 이 렌더러로 만든 Myst나 LucasArts식 어드벤처 게임을 해보고 싶어짐
    동굴 탐험이나 고고학 발굴 같은 소재에 잘 맞을 듯함
    • 동의함. 개인적으로는 저폴리 Doom/Wolfenstein 느낌보다도 픽셀 아트/레트로 분위기를 더 강하게 떠올리게 함
    • 이 미학으로 만든 3D Noita를 상상하게 됨
      낙하 모래 엔진을 3D로 확장하려면 매끄러운 입자 유체역학 같은 방식도 쓸 수 있을 듯함
    • 미학에는 완전히 동의하지만, 너무 멋져 보이는 것에 비해 건축 구조는 어색하게 느껴짐
      낮은 천장 부분에서는 지붕에서 매달린 블록들이 물리 법칙을 거스르는 것처럼 보였음
  • https://web.archive.org/web/20240524065427/https://blog.dani...
    https://www.youtube.com/watch?v=1xFEbXWstCM
  • 다른 접근으로 Deep Bump가 있음. 같은 문제를 전혀 다른 방식으로 다룸
    Deep Bump는 텍스처 이미지에서 그럴듯한 법선 맵을 만들어내는 기계학습 도구임
    이 복셀 변위 렌더러가 쓰는 돌이나 벽돌 텍스처에는 특히 잘 맞고, 옷감 텍스처도 주름·주머니·칼라를 어느 정도 인식해 깊이를 나타내는 법선을 줌
    나무껍질에는 그럭저럭이고 식물에는 별로인데, 아마 학습 데이터셋의 영향으로 보임
    Doom/Wolfenstein 계열 게임을 현대화한다면 쓸 만한 오픈소스 도구가 이미 있음
    [1] https://github.com/HugoTini/DeepBump
    • 블로그 글을 제대로 읽었다면, 그건 텍스처에서 법선 맵을 추론하는 모델이지 기하를 렌더링하는 새 방식은 아님
      이 글은 변위 맵을 작은 복셀 기반 표현으로 다루는 쪽에 더 가깝고, Deep Bump 같은 도구는 여기서 말하는 시스템용 텍스처 자산을 만드는 데 보조적으로 쓸 수는 있을 듯함
    • 글에서도 말하듯 법선 맵은 모든 상황에서 “작동”하지 않음
      실제 기하를 바꾸는 게 아니라 조명과 입체감의 착시만 바꾸기 때문에, 메시 가장자리에서 보면 여전히 변위가 더 고품질 선택지임
      다만 DeepBump가 전통적인 변위에 쓸 1차원 높이 맵, 즉 전체 3D 벡터 변위가 아니라 높이만 있는 맵을 추출하는 데는 쓸 수 있을지도 모름
  • 멋지긴 한데, 이 접근이 애니메이션 3D 모델에 얼마나 잘 맞을지 궁금함
    잘해도 Doom의 “Voxel Doom” 모드 같은 모습이 될 것 같음
    [1] https://media.moddb.com/cache/images/mods/1/55/54112/thumb_6...
    [2] https://media.moddb.com/cache/images/mods/1/55/54112/thumb_6...
    • 글에 Voxel Doom 각주가 있긴 하지만, 몬스터보다는 Voxel Doom의 환경 접근에 관한 내용임
      “이제 이런 맥락을 다 설명했으니, 클래식 Doom용 Voxel Doom 모드에 찬사를 보내고 싶다. 모드 제작자는 게임의 몬스터와 다른 스프라이트를 복셀 메시로 바꿔 깊이를 더했는데, 정말 인상적인 작업이었다. 이후 2022년 말에는 레벨 기하에 복셀 디테일을 더하기 위해 시차 매핑을 실험하기 시작했다. 내 생각에 이 부분은 그리 좋아 보이지 않았는데, 제작자의 아트워크 때문이 아니라 시차 매핑으로 렌더링할 때 생기는 근본적 한계 때문이었다. 이 모드가 내 프로젝트의 영감은 아니었다. 나는 이미 작업 중이었다. 하지만 그 모드가 온라인에서 좋은 반응을 얻는 것을 보며 내 작업을 계속하는 데 큰 힘이 됐다. ↩”
      접근 자체는 애니메이션 문 같은 것도 지원한다고 하니, 메시와 텍스처 플립북을 조합하면 원래 Doom처럼 보이는 몬스터에도 쓸 수 있을 듯함
      다만 날카로운 곡률 영역은 셸 매핑에서 아티팩트가 가장 심할 것 같고, 레벨 메시화의 한계도 언급하니 아닐 수도 있음
  • Notch가 작업 중인 것과 꽤 비슷해 보임. 그의 Twitter 피드를 보면 또 다른 종류의 복셀 렌더링을 하고 있음
    다만 이건 C++/Vulkan을 쓰고 있고 정말 근사해 보임
  • 이 접근이 Unreal Engine 5 Nanite와 어떻게 비교되는지 궁금함. 혹시 Unreal Engine도 비슷한 일을 하고 있을지도 모르겠음
    예전 게임, 예를 들어 Comanche[1] 같은 곳에서 복셀을 쓴 동기 중 하나는 삼각형 메시로 모델링하면 비슷한 하드웨어에서 더 비쌌을 복잡한 지형을 그럴듯하게 얻을 수 있었기 때문으로 기억함
    글쓴이는 RX 5700 XT에서 110FPS를 언급하는데, 다른 접근과 비교해 어떤 수준인지는 잘 모르겠음
    [1] https://en.wikipedia.org/wiki/Comanche_(video_game_series)
    • 원 글이 실행 시 쓰는 메시를 자세히 설명하지 않아 단정하긴 어렵지만, Nanite와는 꽤 다를 것으로 추측됨
      Nanite는 고다각형 객체 제작을 전제로 하고, 렌더링되는 삼각형이 픽셀보다 작아지지 않도록 단순화된 청크를 스트리밍함
      기하를 자연스럽게 매우 세밀하게 만들 수 있으니 변위 맵은 다소 중복되고, 굳이 텍스처 맵으로 처리할 이유가 없음
      물론 지형에는 별도 경우가 있지만 특수한 사례임
      이 글의 방식은 변위와 저다각형 메시를 사용해 로드 시 고다각형이지만 “복셀화된” 기하를 생성하는 것으로 보임
    • 기억하기로 Comanche는 지형 렌더링에 광선 추적식 접근을 썼음[1]
      진짜 복셀은 아니고, 샘플링되는 2D 높이 맵이었음
      이름을 “VoxelSpace”라고 불렀으니 혼동할 만함
      [1] https://github.com/s-macke/VoxelSpace
    • 추측으로는 Comanche 게임에서 쓰인 것과 정확히 같은 기법이거나, 적어도 같은 결과를 낼 수 있는 방식임
      흔한 믿음과 달리 그 게임들은 진짜 3D 복셀을 쓰지 않았고, 지형 텍스처에 색과 높이 값을 저장한 높이 맵을 광선 행진으로 그렸음
      셰이더에서 텍스처를 향해 광선 행진을 하면 같은 외형을 재현할 수 있고, 블로그 글이 얻은 결과와 매우 비슷해 보일 것 같음
    • 사실상 관련이 거의 없음. 여기서는 기하 셰이더로 복셀 메시 디테일을 생성하고, 아마 몇 가지 세부 단계 최적화도 하는 듯함
      반면 Nanite는 목표 품질에 맞춰 삼각형 밀도를 조절하는 GPU 주도 렌더링 기술임
      Nanite도 변위 맵과 테셀레이션을 쓸 수는 있지만, 고다각형 자산을 그대로 넣어 렌더링하는 것보다 꼭 더 효율적인 건 아닌 별도 경로를 사용함
  • 복셀 분야의 새 방법을 보는 건 늘 좋음
    다만 글이 복셀과 특정 렌더링 기법을 섞어 말하는 건 조금 아쉬움
    복셀은 그냥 3D 격자를 사용하는 것이고, 중간 부분을 보면 저자가 복셀 사용을 큐브식 렌더링, 흔히 Minecraft식 블록셀 렌더러라고 부르는 것과 동일시하는 듯함
    삼각형 기하를 가져와 엔진에서 직접 쓸 수 있다고도 말하지만, 블록셀이나 사실상 어떤 렌더링 과정도 똑같이 할 수 있다는 점을 잊은 것 같음
    다른 스타일을 쓰는 일반적인 복셀 렌더링 플러그인들이 기존 엔진에서 1급 지원을 받는 방식도 바로 이와 같음
  • 이게 오픈소스였으면 좋겠음. 정말 그랬으면 좋겠음
  • 정말 마음에 듦. Ultima Underworld가 떠오름
  • 이게 레트로 3D 게임 현대화의 미래가 되어야 함. 정말 아름다움