강의

멘토링

로드맵

인프런 커뮤니티 질문&답변

오시영님의 프로필 이미지
오시영

작성한 질문수

DirectX Raytracing Programming

Game Framework

MeshObject 공용 사용 방법

해결된 질문

작성

·

20

1

CGame::CreateGameObjectAsBox에서 "meshobject를 공용으로 쓰도록 한다."는 주석이 있는데, 실제로 디버깅해보면 오브젝트마다 새로운 메쉬오브젝트를 할당하는거 같습니다.

각 게임 오브젝트가 메쉬 오브젝트를 공용으로 사용하도록 바꿔도 렌더링이 잘 안되는데, 이건 BLAS Instance는 결국 하나니까 TLAS에 존재하는 Instance는 하나만 생기게 돼서 그런건가요?

맞다면 핸들이 참조하는 pBLAS(D3D 리소스)는 공용으로 사용하고, 게임 오브젝트가 들고있는 BLAS 핸들(CreateBLAS가 반환하는 BLAS_INSTANCE*)을 오브젝트마다 다른걸 들고 있으면 되는걸까요?

계속 바꿔가면서 시도해보는데 잘 안되네요ㅠ

답변 2

1

megayuchi님의 프로필 이미지
megayuchi
지식공유자

네. 맞습니다. 실제로는 별도의 매쉬오브젝트를 생성하고 각각 BLAS를 가집니다.

일단 주석의 "meshobject를 공용으로 쓰도록 한다."는 의미는 다음과 같습니다.

1. CreateBasicMeshObject()로 생성한 CBasicMeshObject는 이름이나 id로 탐색할 수 있도록 자료구조에 넣어둡니다. 예를 들어 최초의 박스 매시를 만들때 생성한 CBasicMeshObject를 "box_mesh_obj"라는 이름으로 해시테이블에 등록할 수도 있겠죠.

2. 이제 CreateBoxMeshObject()할 때마다 매번 CreateBasicMeshObject()를 호출하는 대신 자료구조에서 CBasicMeshObject를 찾아서 pMeshObj->CreateBLAS()를 호출합니다.

3. 이때 pMeshObj는 이미 내부에 VetexBuffer와 IndexBuffer, 그리고 이미 공유되고 있는 texture를 다 들고 있으므로 이 리소스들을 '읽기전용'으로 하여 BLAS를 생성합니다. 이 시점에서 vertex buffer, index buffer, texture 리소스는 여러개의 BLAS resource간에 공유가 됩니다.

4. BLAS resource자체도 공유가 가능한데 제 개인 프로젝트에서 BLAS resource의 공유는 instancing할 때만 사용하고 있습니다. 이 경우 TLAS를 빌드할 때 하나의 BLAS resource를 여러 개의 TLAS Instance로 넣어줍니다. 다만 TLAS Instance마다 행렬만 다르게 넣어줍니다. 이 행렬들로 위치와 스케일 회전을 제어합니다.

5. 주석의 "meshobject를 공용으로 쓰도록 한다."라고 하는 것은 1,2,3번에 해당하는 얘기입니다. 당초 예제를 작성할 때는 vertex buffer와 index buffer를 공유시킬 예정이었으나 예제로 사용하기에 코드가 너무 복잡해지는 감이 있어서 공유하지 않도록 최종 작성되었습니다.

혼란을 드려 죄송합니다. 지적 감사합니다.

참고로 다음의 영상을 참고하시면 매시공유가 어떤 의미인지 이해하기 쉬울겁니다.

https://www.youtube.com/live/ALcVb5b68Zw?si=GHNimcScnm0dkd_p&t=3384

 

오시영님의 프로필 이미지
오시영
질문자

이해가 됐습니다 자세한 답변 감사합니다!!
혹시 BLASResource 공유는 인스턴싱에만 활용하시는 이유가 있나요?

megayuchi님의 프로필 이미지
megayuchi
지식공유자

실제 상황에서는 vertex와 index구조가 완전히 똑같은 오브젝트들이 다수 렌더링 되는 상황이 인스턴싱 말고는 거의 없거든요. 특히 캐릭터의 경우 외형과 복장이 똑같다하더라도 스키닝이 들어가면 vertex 위치가 다 달라집니다. 따라서 vertex 데이터 공유가 안되니 blas도 각각 따로 만들어야 합니다. 강체변환만 쓰는 오브젝트(무기, 아이템 등)에선 blas공유도 가능할텐데 복잡도에 비해 얻는 이득이 크지 않다고 판단했습니다.

참고로 local root paramter도 공유가 가능합니다. 스키닝 여부에 상관없이 텍스처와 uv좌표는 공유가능하니까요. 예제에선 공유하지 않지만 제 프로젝트에선 vertex data와 texture구성이 같다면 local root parameter도 공유하고 있습니다.

 

오시영님의 프로필 이미지
오시영
질문자

감사합니다!!

0

안녕하세요, 인프런 AI 인턴입니다. 오시영님.

MeshObject를 공용으로 사용하는 방법에 관한 설명

특정 상황에서 메쉬 오브젝트를 각 게임 오브젝트 간에 공유하는 것은 메모리 효율성을 높일 수 있는 좋은 기법입니다. 그러나 이것이 제대로 구현되지 않는다면 렌더링에 문제가 발생할 수 있습니다. 질문하신 것과 관련하여, 몇 가지 고려해야 할 사항을 설명드리겠습니다.

BLAS 및 TLAS의 관리

  1. BLAS와 TLAS의 차이점:

    • BLAS (Bottom-Level Acceleration Structure): 개별 객체에 대한 가속 구조입니다. 동일한 기하학적 구조를 공유할 수 있습니다.
    • TLAS (Top-Level Acceleration Structure): 씬 전체를 위한 가속 구조이며, 각 객체의 인스턴스를 참조합니다. 여러 객체가 동일한 BLAS를 참조하면서도 TLAS에서는 서로 다른 변환을 기반으로 인스턴스화할 수 있습니다.
  2. BLAS 공유:

    • pBLAS(D3D 리소스)는 서브오브젝트가 동일한 기하학적 구조를 명시하는 데 사용할 수 있습니다. 즉, 하나의 pBLAS 리소스를 여러 게임 오브젝트가 참조함으로써 메모리 사용을 줄일 수 있습니다.
  3. 인스턴스화 관리:

    • TLAS에서 각 오브젝트 인스턴스를 나타내는 구조(예: BLAS_INSTANCE)는 오브젝트별로 관리되어야 합니다. 이는 동일한 메쉬를 사용하더라도 각 오브젝트에 대해 다른 월드 변환 및 속성을 정의할 수 있게 합니다.

문제 해결을 위한 제안

  • pBLAS를 여러 오브젝트 간에 공유하되, 각 오브젝트가 별도의 BLAS_INSTANCE 구조체를 유지하게 설정하십시오. 이 구조에는 모든 객체가 공유하는 pBLAS에 대한 참조와, 각 객체별로 고유한 월드 변환 데이터를 포함해야 합니다.
  • 오브젝트가 제대로 렌더링되지 않는 문제는, TLAS에 인스턴스를 올바르게 추가하지 않았거나 BLAS와 TLAS 간의 참조 및 트랜스폼 매핑이 불완전할 가능성이 높습니다.
  • 디버그 모드를 통해 TLAS 빌더 및 트랜스폼 내역을 확인하고 필요시 D3D 디버거 설정을 통해 상세한 에러 메시지를 확인하세요.

유사한 질문들 및 참고 자료

DirectX에서 리소스를 공유하거나 메모리 관리와 관련한 질문들은 다음과 같습니다:

  1. DirectX에서 Constant Buffer 초기화 관련 질문

위의 답변이 이해에 도움을 줄 수 있습니다.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

오시영님의 프로필 이미지
오시영

작성한 질문수

질문하기