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;
	}
};