Erstellen von Deskriptoren
Beschreibt und zeigt Beispiele für das Erstellen von Index-, Scheitelpunkt- und Konstantenpufferansichten. Shaderressource, Renderziel, ungeordneter Zugriff, Streamausgabe und Tiefenschablonenansichten; und Sampler. Alle Methoden zum Erstellen von Deskriptoren sind frei gethreadt.
- Indexpufferansicht
- Scheitelpunktpufferansicht
- Shader-Ressourcenansicht
- Konstante Pufferansicht
- Sampler
- Ungeordnete Zugriffsansicht
- Streamausgabeansicht
- Renderzielansicht
- Tiefen-Schablonenansicht
- Zugehörige Themen
Indexpufferansicht
Um eine Indexpufferansicht zu erstellen, füllen Sie eine D3D12 _ INDEX _ BUFFER _ VIEW-Struktur aus:
typedef struct D3D12_INDEX_BUFFER_VIEW
{
D3D12_GPU_VIRTUAL_ADDRESS BufferLocation;
UINT SizeInBytes;
DXGI_FORMAT Format;
} D3D12_INDEX_BUFFER_VIEW;
Legen Sie den Speicherort (Rufen Sie GetGPUVirtualAddressauf) und die Größe des Puffers fest, und stellen Sie dabei fest, dass D3D12 GPU VIRTUAL ADDRESS als definiert _ _ _ ist:
typedef UINT64 D3D12_GPU_VIRTUAL_ADDRESS;
Weitere Informationen finden Sie in der DXGI FORMAT-Enum. _ In der Regel kann für einen Indexpuffer die folgende Definition verwendet werden:
const DXGI_FORMAT StandardIndexFormat = DXGI_FORMAT_R32_UINT;
Rufen Sie abschließend ID3D12GraphicsCommandList::IASetIndexBuffer auf.
Beispiel:
// Initialize the index buffer view.
m_indexBufferView.BufferLocation = m_indexBuffer->GetGPUVirtualAddress();
m_indexBufferView.SizeInBytes = SampleAssets::IndexDataSize;
m_indexBufferView.Format = SampleAssets::StandardIndexFormat;
Scheitelpunktpufferansicht
Füllen Sie zum Erstellen einer Scheitelpunktpufferansicht eine D3D12 _ VERTEX _ BUFFER _ VIEW-Struktur aus:
typedef struct D3D12_VERTEX_BUFFER_VIEW {
D3D12_GPU_VIRTUAL_ADDRESS BufferLocation;
UINT SizeInBytes;
UINT StrideInBytes;
} D3D12_VERTEX_BUFFER_VIEW;
Legen Sie den Speicherort (Rufen Sie GetGPUVirtualAddressauf) und die Größe des Puffers fest, und stellen Sie dabei fest, dass D3D12 GPU VIRTUAL ADDRESS als definiert _ _ _ ist:
typedef UINT64 D3D12_GPU_VIRTUAL_ADDRESS;
Der Stride ist in der Regel die Größe einer einzelnen Scheitelpunkt-Datenstruktur, z. B. , und dann sizeof(Vertex); id3D12GraphicsCommandList::IASetVertexBuffers auf.
Beispiel:
// Initialize the vertex buffer view.
m_vertexBufferView.BufferLocation = m_vertexBuffer->GetGPUVirtualAddress();
m_vertexBufferView.SizeInBytes = SampleAssets::VertexDataSize;
m_vertexBufferView.StrideInBytes = SampleAssets::StandardVertexStride;
Shader-Ressourcenansicht
Um eine Shaderressourcenansicht zu erstellen, füllen Sie eine D3D12 _ SHADER _ RESOURCE VIEW _ _ DESC-Struktur aus:
typedef struct D3D12_SHADER_RESOURCE_VIEW_DESC
{
DXGI_FORMAT Format;
D3D12_SRV_DIMENSION ViewDimension;
UINT Shader4ComponentMapping;
union
{
D3D12_BUFFER_SRV Buffer;
D3D12_TEX1D_SRV Texture1D;
D3D12_TEX1D_ARRAY_SRV Texture1DArray;
D3D12_TEX2D_SRV Texture2D;
D3D12_TEX2D_ARRAY_SRV Texture2DArray;
D3D12_TEX2DMS_SRV Texture2DMS;
D3D12_TEX2DMS_ARRAY_SRV Texture2DMSArray;
D3D12_TEX3D_SRV Texture3D;
D3D12_TEXCUBE_SRV TextureCube;
D3D12_TEXCUBE_ARRAY_SRV TextureCubeArray;
} ;
} D3D12_SHADER_RESOURCE_VIEW_DESC;
Das ViewDimension Feld ist auf 0 (null) oder einen Wert der D3D12 _ BUFFER _ SRV _ FLAGS-Enum festgelegt.
Die Enums und Strukturen, auf die von D3D12 SHADER RESOURCE VIEW DESC verwiesen wird, _ _ _ _ sind:
- _DXGI-FORMAT
- D3D12 _ BUFFER _ SRV
- D3D12 _ TEX1D _ SRV
- D3D12 _ TEX1D _ ARRAY _ SRV
- D3D12 _ TEX2D _ SRV
- D3D12 _ TEX2D _ ARRAY _ SRV
- D3D12 _ TEX2DMS _ SRV
- D3D12 _ TEX2DMS _ ARRAY _ SRV
- D3D12 _ TEX3D _ SRV
- D3D12 _ TEXCUBE _ SRV
- D3D12 _ TEXCUBE _ ARRAY _ SRV
Beachten Sie, dass float den SRVs für ResourceMinLODClamp Tex1D/2D/3D/Cube hinzugefügt wurde. In D3D11 war es eine Eigenschaft einer Ressource, aber dies passte nicht zu der Art, wie sie in der Hardware implementiert wurde. StructureByteStride wurde zu Puffer-SRVs hinzugefügt, wobei es in D3D11 eine Eigenschaft der Ressource war. Wenn der Schritt ungleich 0 (null) ist, bedeutet dies eine strukturierte Pufferansicht, und das Format muss auf DXGI _ FORMAT UNKNOWN festgelegt _ werden.
Rufen Sie abschließend id3D12Device::CreateShaderResourceViewauf, um die Shaderressourcenansicht zu erstellen.
Beispiel:
// Describe and create an SRV.
D3D12_SHADER_RESOURCE_VIEW_DESC srvDesc = {};
srvDesc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D;
srvDesc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING;
srvDesc.Format = tex.Format;
srvDesc.Texture2D.MipLevels = tex.MipLevels;
srvDesc.Texture2D.MostDetailedMip = 0;
srvDesc.Texture2D.ResourceMinLODClamp = 0.0f;
m_device->CreateShaderResourceView(m_textures[i].Get(), &srvDesc, cbvSrvHandle);
Konstante Pufferansicht
Um eine konstante Pufferansicht zu erstellen, füllen Sie eine D3D12 _ CONSTANT BUFFER VIEW _ _ _ DESC-Struktur aus:
typedef struct D3D12_CONSTANT_BUFFER_VIEW_DESC {
D3D12_GPU_VIRTUAL_ADDRESS BufferLocation;
UINT SizeInBytes;
} D3D12_CONSTANT_BUFFER_VIEW_DESC;
Rufen Sie dann ID3D12Device::CreateConstantBufferView auf.
Beispiel:
// Describe and create a constant buffer view.
D3D12_CONSTANT_BUFFER_VIEW_DESC cbvDesc = {};
cbvDesc.BufferLocation = m_constantBuffer->GetGPUVirtualAddress();
cbvDesc.SizeInBytes = (sizeof(ConstantBuffer) + 255) & ~255; // CB size is required to be 256-byte aligned.
m_device->CreateConstantBufferView(&cbvDesc, m_cbvHeap->GetCPUDescriptorHandleForHeapStart());
Sampler
Füllen Sie zum Erstellen eines Beispiels eine D3D12 _ SAMPLER _ DESC-Struktur aus:
typedef struct D3D12_SAMPLER_DESC
{
D3D12_FILTER Filter;
D3D12_TEXTURE_ADDRESS_MODE AddressU;
D3D12_TEXTURE_ADDRESS_MODE AddressV;
D3D12_TEXTURE_ADDRESS_MODE AddressW;
FLOAT MipLODBias;
UINT MaxAnisotropy;
D3D12_COMPARISON_FUNC ComparisonFunc;
FLOAT BorderColor[4]; // RGBA
FLOAT MinLOD;
FLOAT MaxLOD;
} D3D12_SAMPLER_DESC;
Informationen zum Ausfüllen dieser Struktur finden Sie in den folgenden Aufzählen:
- D3D12 _ FILTER
- _D3D12-FILTERTYP _
- D3D12 _ FILTER REDUCTION TYPE (D3D12-FILTERVERRINGERUNGSTYP) _ _
- D3D12 _ _ TEXTUR-ADRESSMODUS _
- D3D12 _ –VERGLEICH _ – FUNC
Rufen Sie abschließend ID3D12Device::CreateSampler auf.
Beispiel:
// Describe and create a sampler.
D3D12_SAMPLER_DESC samplerDesc = {};
samplerDesc.Filter = D3D12_FILTER_MIN_MAG_MIP_LINEAR;
samplerDesc.AddressU = D3D12_TEXTURE_ADDRESS_MODE_WRAP;
samplerDesc.AddressV = D3D12_TEXTURE_ADDRESS_MODE_WRAP;
samplerDesc.AddressW = D3D12_TEXTURE_ADDRESS_MODE_WRAP;
samplerDesc.MinLOD = 0;
samplerDesc.MaxLOD = D3D12_FLOAT32_MAX;
samplerDesc.MipLODBias = 0.0f;
samplerDesc.MaxAnisotropy = 1;
samplerDesc.ComparisonFunc = D3D12_COMPARISON_FUNC_ALWAYS;
m_device->CreateSampler(&samplerDesc, m_samplerHeap->GetCPUDescriptorHandleForHeapStart());
Ungeordnete Zugriffsansicht
Um eine ungeordnete Zugriffsansicht zu erstellen, füllen Sie eine D3D12 _ UNORDERED _ ACCESS VIEW _ _ DESC-Struktur aus:
typedef struct D3D12_UNORDERED_ACCESS_VIEW_DESC
{
DXGI_FORMAT Format;
D3D12_UAV_DIMENSION ViewDimension;
union
{
D3D12_BUFFER_UAV Buffer;
D3D12_TEX1D_UAV Texture1D;
D3D12_TEX1D_ARRAY_UAV Texture1DArray;
D3D12_TEX2D_UAV Texture2D;
D3D12_TEX2D_ARRAY_UAV Texture2DArray;
D3D12_TEX3D_UAV Texture3D;
};
} D3D12_UNORDERED_ACCESS_VIEW_DESC;
Das ViewDimension Feld ist auf 0 (null) oder einen Wert der _ _ _ UAV-FLAGS-Enum D3D12 BUFFER festgelegt.
Weitere Informationen finden Sie in den folgenden Aufzählen und Strukturen:
- _DXGI-FORMAT
- D3D12 _ BUFFER _ UAV
- D3D12 _ TEX1D _ UAV
- D3D12 _ TEX1D _ ARRAY _ UAV
- D3D12 _ TEX2D _ UAV
- D3D12 _ TEX2D _ ARRAY _ UAV
- D3D12 _ TEX3D _ UAV
StructureByteStride wurde Puffer-UAVs hinzugefügt, wobei es in D3D11 eine Eigenschaft der Ressource war. Wenn der Schritt ungleich 0 (null) ist, bedeutet dies eine strukturierte Pufferansicht, und das Format muss auf DXGI _ FORMAT UNKNOWN festgelegt _ werden.
Rufen Sie abschließend ID3D12Device::CreateUnorderedAccessView auf.
Beispiel:
// Create the unordered access views (UAVs) that store the results of the compute work.
CD3DX12_CPU_DESCRIPTOR_HANDLE processedCommandsHandle(m_cbvSrvUavHeap->GetCPUDescriptorHandleForHeapStart(), ProcessedCommandsOffset, m_cbvSrvUavDescriptorSize);
for (UINT frame = 0; frame < FrameCount; frame++)
{
// Allocate a buffer large enough to hold all of the indirect commands
// for a single frame as well as a UAV counter.
commandBufferDesc = CD3DX12_RESOURCE_DESC::Buffer(CommandBufferSizePerFrame + sizeof(UINT), D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS);
ThrowIfFailed(m_device->CreateCommittedResource(
&CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_DEFAULT),
D3D12_HEAP_FLAG_NONE,
&commandBufferDesc,
D3D12_RESOURCE_STATE_COPY_DEST,
nullptr,
IID_PPV_ARGS(&m_processedCommandBuffers[frame])));
D3D12_UNORDERED_ACCESS_VIEW_DESC uavDesc = {};
uavDesc.Format = DXGI_FORMAT_UNKNOWN;
uavDesc.ViewDimension = D3D12_UAV_DIMENSION_BUFFER;
uavDesc.Buffer.FirstElement = 0;
uavDesc.Buffer.NumElements = TriangleCount;
uavDesc.Buffer.StructureByteStride = sizeof(IndirectCommand);
uavDesc.Buffer.CounterOffsetInBytes = CommandBufferSizePerFrame;
uavDesc.Buffer.Flags = D3D12_BUFFER_UAV_FLAG_NONE;
m_device->CreateUnorderedAccessView(
m_processedCommandBuffers[frame].Get(),
m_processedCommandBuffers[frame].Get(),
&uavDesc,
processedCommandsHandle);
processedCommandsHandle.Offset(CbvSrvUavDescriptorCountPerFrame, m_cbvSrvUavDescriptorSize);
}
// Allocate a buffer that can be used to reset the UAV counters and initialize it to 0.
ThrowIfFailed(m_device->CreateCommittedResource(
&CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_UPLOAD),
D3D12_HEAP_FLAG_NONE,
&CD3DX12_RESOURCE_DESC::Buffer(sizeof(UINT)),
D3D12_RESOURCE_STATE_GENERIC_READ,
nullptr,
IID_PPV_ARGS(&m_processedCommandBufferCounterReset)));
UINT8* pMappedCounterReset = nullptr;
CD3DX12_RANGE readRange(0, 0); // We do not intend to read from this resource on the CPU.
ThrowIfFailed(m_processedCommandBufferCounterReset->Map(0, &readRange, reinterpret_cast<void**>(&pMappedCounterReset)));
ZeroMemory(pMappedCounterReset, sizeof(UINT));
m_processedCommandBufferCounterReset->Unmap(0, nullptr);
Streamausgabeansicht
Um eine Streamausgabeansicht zu erstellen, füllen Sie eine D3D12 _ STREAM _ OUTPUT _ DESC-Struktur aus.
typedef struct D3D12_STREAM_OUTPUT_DESC
{
_Field_size_full_(NumEntries) const D3D12_SO_DECLARATION_ENTRY *pSODeclaration;
UINT NumEntries;
_Field_size_full_(NumStrides) const UINT *pBufferStrides;
UINT NumStrides;
UINT RasterizedStream;
} D3D12_STREAM_OUTPUT_DESC;
Rufen Sie dann ID3D12GraphicsCommandList::SOSetTargets auf.
Renderzielansicht
Um eine Renderzielansicht zu erstellen, füllen Sie eine D3D12 _ RENDER TARGET VIEW _ _ _ DESC-Struktur aus.
typedef struct D3D12_RENDER_TARGET_VIEW_DESC
{
DXGI_FORMAT Format;
D3D12_RTV_DIMENSION ViewDimension;
union
{
D3D12_BUFFER_RTV Buffer;
D3D12_TEX1D_RTV Texture1D;
D3D12_TEX1D_ARRAY_RTV Texture1DArray;
D3D12_TEX2D_RTV Texture2D;
D3D12_TEX2D_ARRAY_RTV Texture2DArray;
D3D12_TEX2DMS_RTV Texture2DMS;
D3D12_TEX2DMS_ARRAY_RTV Texture2DMSArray;
D3D12_TEX3D_RTV Texture3D;
};
} D3D12_RENDER_TARGET_VIEW_DESC;
Das ViewDimension Feld ist auf 0 (null) oder einen Wert der D3D12 _ RTV _ DIMENSION-Enumerierung festgelegt.
Weitere Informationen finden Sie in den folgenden Aufzählen und Strukturen:
- _DXGI-FORMAT
- D3D12 _ BUFFER _ RTV
- D3D12 _ TEX1D _ RTV
- D3D12 _ TEX1D _ ARRAY _ RTV
- D3D12 _ TEX2D _ RTV
- D3D12 _ TEX2DMS _ RTV
- D3D12 _ TEX2D _ ARRAY _ RTV
- D3D12 _ TEX2DMS _ ARRAY _ RTV
- D3D12 _ TEX3D _ RTV
Rufen Sie abschließend ID3D12Device::CreateRenderTargetView auf.
Beispiel:
// Create descriptor heaps.
{
// Describe and create a render target view (RTV) descriptor heap.
D3D12_DESCRIPTOR_HEAP_DESC rtvHeapDesc = {};
rtvHeapDesc.NumDescriptors = FrameCount;
rtvHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_RTV;
rtvHeapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_NONE;
ThrowIfFailed(m_device->CreateDescriptorHeap(&rtvHeapDesc, IID_PPV_ARGS(&m_rtvHeap)));
m_rtvDescriptorSize = m_device->GetDescriptorHandleIncrementSize(D3D12_DESCRIPTOR_HEAP_TYPE_RTV);
}
// Create frame resources.
{
CD3DX12_CPU_DESCRIPTOR_HANDLE rtvHandle(m_rtvHeap->GetCPUDescriptorHandleForHeapStart());
// Create a RTV for each frame.
for (UINT n = 0; n < FrameCount; n++)
{
ThrowIfFailed(m_swapChain->GetBuffer(n, IID_PPV_ARGS(&m_renderTargets[n])));
m_device->CreateRenderTargetView(m_renderTargets[n].Get(), nullptr, rtvHandle);
rtvHandle.Offset(1, m_rtvDescriptorSize);
}
Tiefen-Schablonenansicht
Um eine Tiefen-Schablonenansicht zu erstellen, füllen Sie eine D3D12 _ DEPTH _ STENCIL _ VIEW _ DESC-Struktur aus:
typedef struct D3D12_DEPTH_STENCIL_VIEW_DESC
{
DXGI_FORMAT Format;
D3D12_DSV_DIMENSION ViewDimension;
D3D12_DSV_FLAGS Flags;
union
{
D3D12_TEX1D_DSV Texture1D;
D3D12_TEX1D_ARRAY_DSV Texture1DArray;
D3D12_TEX2D_DSV Texture2D;
D3D12_TEX2D_ARRAY_DSV Texture2DArray;
D3D12_TEX2DMS_DSV Texture2DMS;
D3D12_TEX2DMS_ARRAY_DSV Texture2DMSArray;
} ;
} D3D12_DEPTH_STENCIL_VIEW_DESC;
Das ViewDimension Feld ist auf 0 (null) oder einen Wert der _ DSV DIMENSION-Enumerierung _ D3D12 festgelegt. Die Flageinstellungen finden Sie in der D3D12 _ DSV FLAGS-Aufzählen. _
Weitere Informationen finden Sie in den folgenden Aufzählen und Strukturen:
- _DXGI-FORMAT
- D3D12 _ TEX1D _ DSV
- D3D12 _ TEX1D _ ARRAY _ DSV
- D3D12 _ TEX2D _ DSV
- D3D12 _ TEX2D _ ARRAY _ DSV
- D3D12 _ TEX2DMS _ DSV
- D3D12 _ TEX2DMS _ ARRAY _ DSV
Rufen Sie abschließend ID3D12Device::CreateDepthStencilView auf.
Beispiel:
// Create the depth stencil view.
{
D3D12_DEPTH_STENCIL_VIEW_DESC depthStencilDesc = {};
depthStencilDesc.Format = DXGI_FORMAT_D32_FLOAT;
depthStencilDesc.ViewDimension = D3D12_DSV_DIMENSION_TEXTURE2D;
depthStencilDesc.Flags = D3D12_DSV_FLAG_NONE;
D3D12_CLEAR_VALUE depthOptimizedClearValue = {};
depthOptimizedClearValue.Format = DXGI_FORMAT_D32_FLOAT;
depthOptimizedClearValue.DepthStencil.Depth = 1.0f;
depthOptimizedClearValue.DepthStencil.Stencil = 0;
ThrowIfFailed(m_device->CreateCommittedResource(
&CD3DX12_HEAP_PROPERTIES(D3D12_HEAP_TYPE_DEFAULT),
D3D12_HEAP_FLAG_NONE,
&CD3DX12_RESOURCE_DESC::Tex2D(DXGI_FORMAT_D32_FLOAT, m_width, m_height, 1, 0, 1, 0, D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL),
D3D12_RESOURCE_STATE_DEPTH_WRITE,
&depthOptimizedClearValue,
IID_PPV_ARGS(&m_depthStencil)
));
m_device->CreateDepthStencilView(m_depthStencil.Get(), &depthStencilDesc, m_dsvHeap->GetCPUDescriptorHandleForHeapStart());
}