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 |