Note

Access to this page requires authorization. You can try signing in or .

Access to this page requires authorization. You can try .

ID3D12GraphicsCommandList::DrawIndexedInstanced method (d3d12.h)

Draws indexed, instanced primitives.

Syntax

void DrawIndexedInstanced(
 [in] UINT IndexCountPerInstance,
 [in] UINT InstanceCount,
 [in] UINT StartIndexLocation,
 [in] INT BaseVertexLocation,
 [in] UINT StartInstanceLocation
);

Parameters

[in] IndexCountPerInstance

Type: UINT

Number of indices read from the index buffer for each instance.

[in] InstanceCount

Type: UINT

Number of instances to draw.

[in] StartIndexLocation

Type: UINT

The location of the first index read by the GPU from the index buffer.

[in] BaseVertexLocation

Type: INT

A value added to each index before reading a vertex from the vertex buffer.

[in] StartInstanceLocation

Type: UINT

A value added to each index before reading per-instance data from a vertex buffer.

Return value

None

Remarks

A draw API submits work to the rendering pipeline.

Instancing might extend performance by reusing the same geometry to draw multiple objects in a scene. One example of instancing could be to draw the same object with different positions and colors. Instancing requires multiple vertex buffers: at least one for per-vertex data and a second buffer for per-instance data.

Examples

The D3D12Bundles sample uses ID3D12GraphicsCommandList::DrawIndexedInstanced as follows:

void FrameResource::PopulateCommandList(ID3D12GraphicsCommandList* pCommandList, ID3D12PipelineState* pPso1, ID3D12PipelineState* pPso2,
 UINT frameResourceIndex, UINT numIndices, D3D12_INDEX_BUFFER_VIEW* pIndexBufferViewDesc, D3D12_VERTEX_BUFFER_VIEW* pVertexBufferViewDesc,
 ID3D12DescriptorHeap* pCbvSrvDescriptorHeap, UINT cbvSrvDescriptorSize, ID3D12DescriptorHeap* pSamplerDescriptorHeap, ID3D12RootSignature* pRootSignature)
{
 // If the root signature matches the root signature of the caller, then
 // bindings are inherited, otherwise the bind space is reset.
 pCommandList->SetGraphicsRootSignature(pRootSignature);

 ID3D12DescriptorHeap* ppHeaps[] = { pCbvSrvDescriptorHeap, pSamplerDescriptorHeap };
 pCommandList->SetDescriptorHeaps(_countof(ppHeaps), ppHeaps);
 pCommandList->IASetPrimitiveTopology(D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST);

 pCommandList->IASetIndexBuffer(pIndexBufferViewDesc);

 pCommandList->IASetVertexBuffers(0, 1, pVertexBufferViewDesc);

 pCommandList->SetGraphicsRootDescriptorTable(0, pCbvSrvDescriptorHeap->GetGPUDescriptorHandleForHeapStart());
 pCommandList->SetGraphicsRootDescriptorTable(1, pSamplerDescriptorHeap->GetGPUDescriptorHandleForHeapStart());

 // Calculate the descriptor offset due to multiple frame resources.
 // 1 SRV + how many CBVs we have currently.
 UINT frameResourceDescriptorOffset = 1 + (frameResourceIndex * m_cityRowCount * m_cityColumnCount);
 CD3DX12_GPU_DESCRIPTOR_HANDLE cbvSrvHandle(pCbvSrvDescriptorHeap->GetGPUDescriptorHandleForHeapStart(), frameResourceDescriptorOffset, cbvSrvDescriptorSize);

 BOOL usePso1 = TRUE;
 for (UINT i = 0; i < m_cityRowCount; i++)
 {
 for (UINT j = 0; j < m_cityColumnCount; j++)
 {
 // Alternate which PSO to use; the pixel shader is different on 
 // each just as a PSO setting demonstration.
 pCommandList->SetPipelineState(usePso1 ? pPso1 : pPso2);
 usePso1 = !usePso1;

 // Set this city's CBV table and move to the next descriptor.
 pCommandList->SetGraphicsRootDescriptorTable(2, cbvSrvHandle);
 cbvSrvHandle.Offset(cbvSrvDescriptorSize);

 pCommandList->DrawIndexedInstanced(numIndices, 1, 0, 0, 0);
 }
 }
}

See Example Code in the D3D12 Reference.

Requirements

Requirement Value
Target Platform Windows
Header d3d12.h
Library D3d12.lib
DLL D3d12.dll

See also

ID3D12GraphicsCommandList


Feedback

Was this page helpful?

Additional resources