VOXEL HORIZON – Dynamic Voxel Object구현

요새 Dynamic Voxel Object라고 이름 붙인 기능을 구현하고 있다.
월드 상의 복셀 오브젝트들을 선택해서 강체변환(회전/스케일/이동)을 적용하여 맵에 배치 가능한 오브젝트로 만드는 기능이다.
기능을 표현하는 용어로는 The brush from Voxel Objects라고 하는게 더 어울릴지도 모르겠다.
다만 내부적으론는 Dynamic Object를 상속받은 Character Object에서 Voxel Object 집합을 생성해서 들고 있고 Dynamic Object-Character Object로 간주해서 컨트롤 하기 때문에 이런 이름을 붙였다.

영상과 같이 복셀 오브젝트들을 셀렉트해서 copy/paste 하면 강체변환이 가능한 오브젝트가 생성된다.

이 기능을 왜 만들었는가 하면 컵, 화분, 전자제품 등 소품을 배치하고 싶었기 때문이다. 복셀을 편집해서 소품으로 사용하기엔 50cm x 50cm x 50cm 정밀도(복셀 게임 치고는 꽤 정밀한)라 해도 덩어리가 너무 크다. 물론 그래픽툴에서 모델링 해서 폴리곤 데이터로 올리면 되지만 작업할 모델러가 없다.

그래서 복셀 편집으로 구조물을 만들고 그걸 축소해서 소품으로 쓰면 되겠다 싶어서 이런 기능을 만들었다.일단 엔진에 기능을 추가했고 기본적인 기능은 잘 작동한다.

렌더러 제외한 게임 클라이언트와 Geometry부에서 대부분의 코드 수정이 이루어졌지만 복셀을 렌더링하는 코드도 약간의 수정이 필요하다.
Rasterization 기반의 DX11/DX12 렌더러는 라이트맵만 백색으로 처리해주면 되는데, DXR렌더러에선 제대로 그려주기 위해선 다이나믹 복셀 오브젝트에 대한 Acceleration Sturucture를 생성하고 업데이트 해줘야 한다. DXR렌더러도 G-Buffer를 사용한 deferred렌더링을 사용하므로 Acceleration Structure를 준비하지 않아도 일단 화면에 보이긴 한다. 이 경우는 그림자를 드리우지 못하고 반사도 되지 않는다.
기본 구현만 해도 충분히 머리가 아파서 Acceleration Structure작업은 일단 미뤄두고 있었다.

여러개의 복셀 오브젝트들에 대해서 다이나믹 오브젝트로의 변환이 잘 되는걸 확인하고 Acceleration Structure작업에 들어갔다. BLAS/TLAS업데이트 하는 코드를 작성한지가 오래 되어서 꽤 걱정했으나, 과거에 코드를 융통성 있게 짜 놔서 어렵지 않게 다이나믹 복셀 오브젝트에 대한 Acceleration Structure작업도 완료했다. 이제 반사도 잘 되고 그림자도 잘 드리운다.


VOXEL HORIZON – Dynamic Voxel Object구현”에 대한 답글 3개

  1. 질문 드립니다.

    C++서버 쪽에서 충돌처리 하려고 physX 다운로드해서 테스트 중 입니다.
    룸별 1Scene 100클라 1스레드로 소박하게 만들어 보고 싶어요
    db 쪽은 Async 업데이트로 클럭 사이에 끼어넣을 생각입니다.

    non-production 환경에서는
    서버쪽 visual Debugger 가 룸 0에 대해서 있는 게 좋을 것 같아서 찾아봤는데
    문서에는 physX 런타임 visual 디버거가 있다고 하는데
    “알아서 기본 기하학 도형을 (이쁘게) 렌더링 해주는” 게 아니라 기본 gl로 되어 있어서
    해당 gl 부분을 modify 해서 쓸가 하다가
    차라리
    Unity 로 디버그 클라 하나 만들어서 기본 Geometry 를 패킷 받으면
    업데이트 하는 쪽으로 만드는게 더 쉽지 않을까 해서 질문 드립니다.

    좋아요

    1. 십여년전에 제가 진행하덩 프로젝트의 서버에서 physx사용을 고려했던 적이 있었습니다. 당시 테스트 결과로는 너무 느려서 mmog서버에선 사용할 수 없다고 판단했습니다. 요샌 컴퓨터 빨라졌으니 어떨지 모르겠네요. physx디버거를 사용해본적이 없어서 정확한 답변을 드릴 순 없고요. 생각하시는대로 해도 작동은 될거같은데 지오메트리 데이터를 프레임 단위로 보내면 상당한 패킷 트래픽을 유발할 겁니다.

      Liked by 1명

댓글 남기기