본문 바로가기

그래픽스

[DX12] Texture Mapping

	ComPtr<ID3D12Resource> textureUploadHeap;
	hr = DEVICE->CreateCommittedResource(
		&heapProperty,
		D3D12_HEAP_FLAG_NONE,
		&desc,
		D3D12_RESOURCE_STATE_GENERIC_READ,
		nullptr,
		IID_PPV_ARGS(textureUploadHeap.GetAddressOf()));

	if (FAILED(hr))
		assert(nullptr);

	::UpdateSubresources(RESOURCE_CMD_LIST.Get(),
		_tex2D.Get(),
		textureUploadHeap.Get(),
		0, 0,
		static_cast<unsigned int>(subResources.size()),
		subResources.data());

	GEngine->GetCmdQueue()->FlushResourceCommandQueue();

 

Texture을 생성할 때도 CreateCommittedResource를 이용하는데  그 후 RESOURCE_CMD_LIST라는 새로운 CMD_LIST를 이용한다. 그 이유는 CMD_LIST는 RenderBegin에서 열리고 RenderEnd에서 닫히기 때문에 그 사이에 집어넣어야 하는데 리소스를 로드하는 경우는 Render할 때 뿐만 아니라 다른 때도 있기 때문이다. 그래서 CommandQueue에 CMD_LIST말고 RESOURCE_CMD_LIST를 하나 더 만들어서 사용한다.

 

void CommandQueue::FlushResourceCommandQueue()
{
	_resCmdList->Close();

	ID3D12CommandList* cmdListArr[] = { _resCmdList.Get() };
	_cmdQueue->ExecuteCommandLists(_countof(cmdListArr), cmdListArr);

	WaitSync();

	_resCmdAlloc->Reset();
	_resCmdList->Reset(_resCmdAlloc.Get(), nullptr);
}

 

RESOURCE_CMD_LIST에 리소스를 넣고나면 FlushResourceCommandQueue를 이용하여 RESOURCE_CMD_LIST를 닫고, WaitSync 동기화 이후 Reset으로 다시 열어준다. 

 

void RootSignature::Init()
{
	CreateSamplerDesc();
	CreateRootSignature();
}

void RootSignature::CreateRootSignature()
{
	CD3DX12_DESCRIPTOR_RANGE ranges[] =
	{
		CD3DX12_DESCRIPTOR_RANGE(D3D12_DESCRIPTOR_RANGE_TYPE_CBV, CBV_REGISTER_COUNT, 0), // b0~b4
		CD3DX12_DESCRIPTOR_RANGE(D3D12_DESCRIPTOR_RANGE_TYPE_SRV, SRV_REGISTER_COUNT, 0), // t0~t4
	};

	CD3DX12_ROOT_PARAMETER param[1];
	param[0].InitAsDescriptorTable(_countof(ranges), ranges);

	D3D12_ROOT_SIGNATURE_DESC sigDesc = CD3DX12_ROOT_SIGNATURE_DESC(_countof(param), param, 1, &_samplerDesc);
	sigDesc.Flags = D3D12_ROOT_SIGNATURE_FLAG_ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT; // 입력 조립기 단계

	ComPtr<ID3DBlob> blobSignature;
	ComPtr<ID3DBlob> blobError;
	::D3D12SerializeRootSignature(&sigDesc, D3D_ROOT_SIGNATURE_VERSION_1, &blobSignature, &blobError);
	DEVICE->CreateRootSignature(0, blobSignature->GetBufferPointer(), blobSignature->GetBufferSize(), IID_PPV_ARGS(&_signature));
}

void RootSignature::CreateSamplerDesc()
{
	_samplerDesc = CD3DX12_STATIC_SAMPLER_DESC(0);
}

 

그리고 Texture은 SRV(Shader Resource View)를 사용하기 때문에 Root Signature에 SRV 타입을 추가해준다. 그리고 CreateSamplerDesc 함수가 추가되었는데, Texture Mapping 할 때 범위를 초과하면 Texture을 반복하게 할지 빈 공간으로 둘지 등 샘플링을 설정하는 역할을 한다. 

 

struct Vertex
{
	Vec3 pos;
	Vec4 color;
	Vec2 uv;
};

 

Vertex에는 Texture의 좌표를 의미하는 uv좌표가 추가되었다. 

 

// TODO
	// 1) Buffer에다가 데이터 세팅
	// 2) TableDescHeap에다가 CBV 전달
	// 3) 모두 세팅이 끝났으면 TableDescHeap 커밋
	{
		D3D12_CPU_DESCRIPTOR_HANDLE handle = GEngine->GetCB()->PushData(0, &_transform, sizeof(_transform));
		GEngine->GetTableDescHeap()->SetCBV(handle, CBV_REGISTER::b0);

		GEngine->GetTableDescHeap()->SetSRV(_tex->GetCpuHandle(), SRV_REGISTER::t0);
	}

	GEngine->GetTableDescHeap()->CommitTable();

 

Mesh::Render에서 CBV를 세팅하고 SRV까지 세팅하는 것이 추가 되었다. 그 후 동일하게 CommitTable을 한다.

 

'그래픽스' 카테고리의 다른 글

[DX12] Material  (0) 2022.07.23
[DX12] Depth Stencil View  (0) 2022.07.23
[DX12] Index Buffer  (0) 2022.07.22
[DX12] Root Signature  (0) 2022.07.22
[DX12] Constant Buffer  (0) 2022.07.22