Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Het D3D12PredicationQueries voorbeeld demonstreert occlusie-selectie met behulp van DirectX 12-query-heaps en predicatie. In het overzicht wordt de aanvullende code beschreven die nodig is om de HelloConstBuffer-voorbeeld uit te breiden voor het verwerken van predicatiequery's.
- Een diepte-stencildescriptor heap en een occlusiequery heap maken
- Alfamixing inschakelen
- kleur- en diepteschrijfbewerkingen uitschakelen
- Een buffer maken om de resultaten van de query op te slaan
- Teken de quads en voer de occlusiequery uit en los deze op
- de voorbeeld- uitvoeren
- Verwante onderwerpen
Een dieptestencildescriptor heap en een occlusiequery heap maken
In de methode LoadPipeline maakt u een diepte-stencildescriptor-heap.
// Describe and create a depth stencil view (DSV) descriptor heap.
D3D12_DESCRIPTOR_HEAP_DESC dsvHeapDesc = {};
dsvHeapDesc.NumDescriptors = 1;
dsvHeapDesc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_DSV;
dsvHeapDesc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_NONE;
ThrowIfFailed(m_device->CreateDescriptorHeap(&dsvHeapDesc, IID_PPV_ARGS(&m_dsvHeap)));
| Oproepstroom | Parameters |
|---|---|
| D3D12_DESCRIPTOR_HEAP_DESC |
[D3D12_DESCRIPTOR_HEAP_FLAG](/windows/desktop/api/d3d12/ne-d3d12-d3d12_descriptor_heap_flags) |
| CreateDescriptorHeap- |
Maak in de methode LoadAssets een heap voor occlusiequery's.
// Describe and create a heap for occlusion queries.
D3D12_QUERY_HEAP_DESC queryHeapDesc = {};
queryHeapDesc.Count = 1;
queryHeapDesc.Type = D3D12_QUERY_HEAP_TYPE_OCCLUSION;
ThrowIfFailed(m_device->CreateQueryHeap(&queryHeapDesc, IID_PPV_ARGS(&m_queryHeap)));
| Oproepstroom | Parameters |
|---|---|
| D3D12_QUERY_HEAP_DESC | D3D12_QUERY_HEAP_TYPE |
| CreateQueryHeap- |
Alfamenging inschakelen
In dit voorbeeld worden twee quads getekend en wordt een binaire occlusiequery geïllustreerd. De quad aan de voorzijde krijgt een animatie over het scherm en de quad in de rug zal af en toe worden opgenomen. In de methode LoadAssets is alfamixing ingeschakeld voor dit voorbeeld, zodat we kunnen zien op welk punt D3D de quad in de achterste occluded beschouwt.
// Enable alpha blending so we can visualize the occlusion query results.
CD3DX12_BLEND_DESC blendDesc(CD3DX12_DEFAULT);
blendDesc.RenderTarget[0] =
{
TRUE, FALSE,
D3D12_BLEND_SRC_ALPHA, D3D12_BLEND_INV_SRC_ALPHA, D3D12_BLEND_OP_ADD,
D3D12_BLEND_ONE, D3D12_BLEND_ZERO, D3D12_BLEND_OP_ADD,
D3D12_LOGIC_OP_NOOP,
D3D12_COLOR_WRITE_ENABLE_ALL,
};
| Oproepstroom | Parameters |
|---|---|
| CD3DX12_BLEND_DESC |
[D3D12_BLEND](/windows/desktop/api/d3d12/ne-d3d12-d3d12_blend) [D3D12_BLEND_OP](/windows/desktop/api/d3d12/ne-d3d12-d3d12_blend_op) [D3D12_LOGIC_OP](/windows/desktop/api/d3d12/ne-d3d12-d3d12_logic_op) [D3D12_COLOR_WRITE_ENABLE](/windows/desktop/api/d3d12/ne-d3d12-d3d12_color_write_enable) |
Schrijfbewerkingen voor kleur en diepte uitschakelen
De occlusiequery wordt uitgevoerd door een quad weer te geven die betrekking heeft op hetzelfde gebied als de quad waarvan we de zichtbaarheid willen testen. In complexere scènes zou de query waarschijnlijk een begrenzingsvolume zijn in plaats van een eenvoudige quad. In beide gevallen wordt een nieuwe pijplijnstatus gemaakt die het schrijven naar het renderdoel en de z-buffer uitschakelt, zodat de occlusiequery zelf geen invloed heeft op de zichtbare uitvoer van de renderingpas.
Schakel in de methode LoadAssets kleurschrijfbewerkingen en diepteschrijfbewerkingen uit voor de status van de occlusion-query.
// Disable color writes and depth writes for the occlusion query's state.
psoDesc.BlendState.RenderTarget[0].RenderTargetWriteMask = 0;
psoDesc.DepthStencilState.DepthWriteMask = D3D12_DEPTH_WRITE_MASK_ZERO;
ThrowIfFailed(m_device->CreateGraphicsPipelineState(&psoDesc, IID_PPV_ARGS(&m_queryState)));
| Oproepstroom | Parameters |
|---|---|
| D3D12_GRAPHICS_PIPELINE_STATE_DESC | D3D12_DEPTH_WRITE_MASK |
| CreateGraphicsPipelineState |
Een buffer maken om de resultaten van de query op te slaan
In de methode LoadAssets moet een buffer worden gemaakt om de resultaten van de query op te slaan. Elke query vereist 8 bytes ruimte in GPU-geheugen. In dit voorbeeld wordt slechts één query uitgevoerd en voor de eenvoud en leesbaarheid wordt een buffer gemaakt die exact die grootte heeft (hoewel deze functie-aanroep een 64K-pagina met GPU-geheugen toewijst, zouden de meeste echte apps waarschijnlijk een grotere buffer maken).
// Create the query result buffer.
CD3DX12_HEAP_PROPERTIES heapProps(D3D12_HEAP_TYPE_DEFAULT);
auto queryBufferDesc = CD3DX12_RESOURCE_DESC::Buffer(8);
ThrowIfFailed(m_device->CreateCommittedResource(
&heapProps,
D3D12_HEAP_FLAG_NONE,
&queryBufferDesc,
D3D12_RESOURCE_STATE_PREDICATION,
nullptr,
IID_PPV_ARGS(&m_queryResult)
));
| Oproepstroom | Parameters |
|---|---|
| CreateCommittedResource- |
[D3D12_HEAP_TYPE](/windows/desktop/api/d3d12/ne-d3d12-d3d12_heap_type) [D3D12_HEAP_FLAG](/windows/desktop/api/d3d12/ne-d3d12-d3d12_heap_flags) [CD3DX12_RESOURCE_DESC](cd3dx12-resource-desc.md) [D3D12_RESOURCE_STATES](/windows/desktop/api/d3d12/ne-d3d12-d3d12_resource_states) |
Teken de quads en voer de occlusiequery uit en los deze op
Nadat u de installatie hebt uitgevoerd, wordt de hoofdlus bijgewerkt in de methode PopulateCommandLists.
- 1. Teken de quads van achter naar voor om het doorzichtigheidseffect goed te laten werken. Het tekenen van de quad achteraan wordt geprediceerd op het resultaat van de query van het vorige frame en is hiervoor een vrij gangbare techniek.
2. Wijzig de PSO om schrijfbewerkingen voor doel- en dieptestencils uit te schakelen.
3. Voer de occlusiequery uit.
4. Los de occlusiequery op.
// Draw the quads and perform the occlusion query.
{
CD3DX12_GPU_DESCRIPTOR_HANDLE cbvFarQuad(m_cbvHeap->GetGPUDescriptorHandleForHeapStart(), m_frameIndex * CbvCountPerFrame, m_cbvSrvDescriptorSize);
CD3DX12_GPU_DESCRIPTOR_HANDLE cbvNearQuad(cbvFarQuad, m_cbvSrvDescriptorSize);
m_commandList->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLESTRIP);
m_commandList->IASetVertexBuffers(0, 1, &m_vertexBufferView);
// Draw the far quad conditionally based on the result of the occlusion query
// from the previous frame.
m_commandList->SetGraphicsRootDescriptorTable(0, cbvFarQuad);
m_commandList->SetPredication(m_queryResult.Get(), 0, D3D12_PREDICATION_OP_EQUAL_ZERO);
m_commandList->DrawInstanced(4, 1, 0, 0);
// Disable predication and always draw the near quad.
m_commandList->SetPredication(nullptr, 0, D3D12_PREDICATION_OP_EQUAL_ZERO);
m_commandList->SetGraphicsRootDescriptorTable(0, cbvNearQuad);
m_commandList->DrawInstanced(4, 1, 4, 0);
// Run the occlusion query with the bounding box quad.
m_commandList->SetGraphicsRootDescriptorTable(0, cbvFarQuad);
m_commandList->SetPipelineState(m_queryState.Get());
m_commandList->BeginQuery(m_queryHeap.Get(), D3D12_QUERY_TYPE_BINARY_OCCLUSION, 0);
m_commandList->DrawInstanced(4, 1, 8, 0);
m_commandList->EndQuery(m_queryHeap.Get(), D3D12_QUERY_TYPE_BINARY_OCCLUSION, 0);
// Resolve the occlusion query and store the results in the query result buffer
// to be used on the subsequent frame.
m_commandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m_queryResult.Get(), D3D12_RESOURCE_STATE_GENERIC_READ, D3D12_RESOURCE_STATE_COPY_DEST));
m_commandList->ResolveQueryData(m_queryHeap.Get(), D3D12_QUERY_TYPE_BINARY_OCCLUSION, 0, 1, m_queryResult.Get(), 0);
m_commandList->ResourceBarrier(1, &CD3DX12_RESOURCE_BARRIER::Transition(m_queryResult.Get(), D3D12_RESOURCE_STATE_COPY_DEST, D3D12_RESOURCE_STATE_GENERIC_READ));
}
| Oproepstroom | Parameters |
|---|---|
| CD3DX12_GPU_DESCRIPTOR_HANDLE | GetGPUDescriptorHandleForHeapStart |
| IASetPrimitiveTopology- | D3D_PRIMITIVE_TOPOLOGY |
| IASetVertexBuffers | |
| SetGraphicsRootDescriptorTable | |
| SetPredication- | D3D12_PREDICATION_OP |
| DrawInstanced | |
| SetPredication- | D3D12_PREDICATION_OP |
| SetGraphicsRootDescriptorTable | |
| DrawInstanced | |
| SetGraphicsRootDescriptorTable | |
| SetPipelineState- | |
| BeginQuery- | D3D12_QUERY_TYPE |
| DrawInstanced | |
| EndQuery- | D3D12_QUERY_TYPE |
| ResourceBarrier- |
[D3D12_RESOURCE_STATES](/windows/desktop/api/d3d12/ne-d3d12-d3d12_resource_states) |
| ResolveQueryData- | D3D12_QUERY_TYPE |
| ResourceBarrier- |
[D3D12_RESOURCE_STATES](/windows/desktop/api/d3d12/ne-d3d12-d3d12_resource_states) |
Het voorbeeld uitvoeren
Niet occluded:
Occluded:
Gedeeltelijk occluded:
Verwante onderwerpen