DirectX
6.10 기하구조 보조 구조체
Awesome Red Tomato
2022. 1. 3. 22:03
하나의 기하구조 그룹을 정의하는 정점 버퍼와 색인 버퍼를 한데 엮는 편리한 보조 구조체를 설명한다. 이 구조체는 실제 정점 자료와 색인 자료를 시스템 메모리에 유지해서 CPU가 그 자료를 언제라도 읽을 수 있게 하는 역할도 한다. 선택(picking)이나 충돌 검출을 위해서는 CPU가 기하구조 자료에 접근해야 한다.
이 구조체는 버퍼 형식이나 보폭(stride) 같은 버택스 버퍼와 인덱스 버퍼의 주요 속성들도 담아 두며, 버퍼에 대한 뷰를 돌려주는 메서드도 제공한다.
struct SubMeshGeometry
{
UINT IndexCount = 0;
UINT StartIndexLocation = 0;
INT BaseVertexLocation = 0;
// 기하구조의 경계 상자(bounding box) 뒷 장에 나온다.
BoundingBox Bounds;
};
struct MeshGeometry
{
std::string Name;
std::unordered_map<std::string, SubMeshGeometry> DrawArgs;
// 시스템 메모리의 복사본. vertex/index 형식이 범용적일 수 있으므로
// Blob를 사용한다. 실제로 사용할 땐 캐스팅해야 한다.
ComPtr<ID3DBlob> mVertexBufferCPU;
ComPtr<ID3DBlob> mIndexBufferCPU;
ComPtr<ID3D12Resource> mUploadVertexBuffer;
ComPtr<ID3D12Resource> mDefaultVertexBuffer;
ComPtr<ID3D12Resource> mUploadIndexBuffer;
ComPtr<ID3D12Resource> mDefaultIndexBuffer;
UINT mVertexByteStride = 0;
UINT mVertexBufferByteSize = 0;
UINT mIndexBufferByteSize = 0;
DXGI_FORMAT mIndexBufferFormat = DXGI_FORMAT_R16_UINT;
D3D12_VERTEX_BUFFER_VIEW GetVertexBufferView() const
{
D3D12_VERTEX_BUFFER_VIEW vbv;
vbv.BufferLocation = mDefaultVertexBuffer->GetGPUVirtualAddress();
vbv.StrideInBytes = mVertexByteStride;
vbv.SizeInBytes = mVertexBufferByteSize;
return vbv;
}
D3D12_INDEX_BUFFER_VIEW GetIndexBufferView() const
{
D3D12_INDEX_BUFFER_VIEW ibv;
ibv.BufferLocation = mDefaultIndexBuffer->GetGPUVirtualAddress();
ibv.Format = mIndexBufferFormat;
ibv.SizeInBytes = mIndexBufferByteSize;
return ibv;
}
void DisposeUploaders()
{
mUploadVertexBuffer = nullptr;
mUploadIndexBuffer = nullptr;
}
};