작성
·
15
1
CGame::CreateGameObjectAsBox에서 "meshobject를 공용으로 쓰도록 한다."는 주석이 있는데, 실제로 디버깅해보면 오브젝트마다 새로운 메쉬오브젝트를 할당하는거 같습니다.
각 게임 오브젝트가 메쉬 오브젝트를 공용으로 사용하도록 바꿔도 렌더링이 잘 안되는데, 이건 BLAS Instance는 결국 하나니까 TLAS에 존재하는 Instance는 하나만 생기게 돼서 그런건가요?
맞다면 핸들이 참조하는 pBLAS(D3D 리소스)는 공용으로 사용하고, 게임 오브젝트가 들고있는 BLAS 핸들(CreateBLAS가 반환하는 BLAS_INSTANCE*)을 오브젝트마다 다른걸 들고 있으면 되는걸까요?
계속 바꿔가면서 시도해보는데 잘 안되네요ㅠ
답변 2
1
네. 맞습니다. 실제로는 별도의 매쉬오브젝트를 생성하고 각각 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
실제 상황에서는 vertex와 index구조가 완전히 똑같은 오브젝트들이 다수 렌더링 되는 상황이 인스턴싱 말고는 거의 없거든요. 특히 캐릭터의 경우 외형과 복장이 똑같다하더라도 스키닝이 들어가면 vertex 위치가 다 달라집니다. 따라서 vertex 데이터 공유가 안되니 blas도 각각 따로 만들어야 합니다. 강체변환만 쓰는 오브젝트(무기, 아이템 등)에선 blas공유도 가능할텐데 복잡도에 비해 얻는 이득이 크지 않다고 판단했습니다.
참고로 local root paramter도 공유가 가능합니다. 스키닝 여부에 상관없이 텍스처와 uv좌표는 공유가능하니까요. 예제에선 공유하지 않지만 제 프로젝트에선 vertex data와 texture구성이 같다면 local root parameter도 공유하고 있습니다.
0
안녕하세요, 인프런 AI 인턴입니다. 오시영님.
특정 상황에서 메쉬 오브젝트를 각 게임 오브젝트 간에 공유하는 것은 메모리 효율성을 높일 수 있는 좋은 기법입니다. 그러나 이것이 제대로 구현되지 않는다면 렌더링에 문제가 발생할 수 있습니다. 질문하신 것과 관련하여, 몇 가지 고려해야 할 사항을 설명드리겠습니다.
BLAS와 TLAS의 차이점:
BLAS 공유:
pBLAS
(D3D 리소스)는 서브오브젝트가 동일한 기하학적 구조를 명시하는 데 사용할 수 있습니다. 즉, 하나의 pBLAS
리소스를 여러 게임 오브젝트가 참조함으로써 메모리 사용을 줄일 수 있습니다.인스턴스화 관리:
BLAS_INSTANCE
)는 오브젝트별로 관리되어야 합니다. 이는 동일한 메쉬를 사용하더라도 각 오브젝트에 대해 다른 월드 변환 및 속성을 정의할 수 있게 합니다.pBLAS
를 여러 오브젝트 간에 공유하되, 각 오브젝트가 별도의 BLAS_INSTANCE
구조체를 유지하게 설정하십시오. 이 구조에는 모든 객체가 공유하는 pBLAS
에 대한 참조와, 각 객체별로 고유한 월드 변환 데이터를 포함해야 합니다.DirectX에서 리소스를 공유하거나 메모리 관리와 관련한 질문들은 다음과 같습니다:
위의 답변이 이해에 도움을 줄 수 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
이해가 됐습니다 자세한 답변 감사합니다!!
혹시 BLASResource 공유는 인스턴싱에만 활용하시는 이유가 있나요?