gpt4 book ai didi

c++ - 'CommandList::DrawInstanced' 如何选择多个槽中的顶点缓冲区之一?

转载 作者:行者123 更新时间:2023-12-03 07:21:44 24 4
gpt4 key购买 nike

我学习了如何使用 IASetVertexVuffers 将顶点缓冲区绑定(bind)到特定插槽。
但是,当我学习 DrawInstanced 时,我学会了仅使用起始顶点的索引来选择要绘制的顶点。
我想知道这个 DrawInstanced 如何通过计算哪个插槽的顶点缓冲区的索引来选择顶点。
或者它只是一个从插槽 0 到下一个插槽的索引?
这个问题可能很难解释,因为我使用了错误的英语。

最佳答案

如果您在调用 Draw* 时将多个顶点缓冲区绑定(bind)到多个插槽,然后根据当前的输入布局并行使用它们。
如果您使用 DrawIndexed* , 然后一个绑定(bind)的索引缓冲区用于生成一个索引,用于所有与 D3D11_INPUT_PER_VERTEX_DATA 绑定(bind)的顶点缓冲区。 .即,它们被视为并行数组:

// This is psuedo-code!

Vertex0 vb0[nVerts];
Vertex1 vb1[nVerts];
Vertex2 vb2[nVerts];

uint32_t ib[nTris * 3];

Bind vb0 to slot 0, vb1 to slot 1, vb2 to slot 2 of Vertex Buffers
Bind ib to Index Buffer

// For DirectX 12, the input layout is part of the Pipeline State Object (PSO)
Bind an input layout that uses vertex data from from 3 slots

DrawIndexed
foreach j in 0 to (IndexCount-1);
index = ib[StartIndexLocation + j] + BaseVertexLocation
assemble vertex from vb0[index], vb1[index], vb2[index]
draw when you have enough vertices for the primitive
使用 DirectX 文档的挑战之一是通常每个版本都假设您已经知道以前的版本。早在 DirectX 9 中就引入了多流渲染,所以这是最后一次在概念上解释它: Programming One or More Streams (Direct3D 9)
在 DirectX 11 中,有四个 Draw*方法:
void Draw( 
UINT VertexCount,
UINT StartVertexLocation);

void DrawInstanced(
UINT VertexCountPerInstance,
UINT InstanceCount,
UINT StartVertexLocation,
UINT StartInstanceLocation);

// Uses an Index Buffer
void DrawIndexed(
UINT IndexCount,
UINT StartIndexLocation,
INT BaseVertexLocation);

void DrawIndexedInstanced(
UINT IndexCountPerInstance,
UINT InstanceCount,
UINT StartIndexLocation,
INT BaseVertexLocation,
UINT StartInstanceLocation);
DirectX 12 支持所有相同的功能,但通过两种方法实现。如果 InstanceCount为 1,则不实例化:
void DrawInstanced(
UINT VertexCountPerInstance,
UINT InstanceCount,
UINT StartVertexLocation,
UINT StartInstanceLocation
);

// Uses an Index Buffer
void DrawIndexedInstanced(
UINT IndexCountPerInstance,
UINT InstanceCount,
UINT StartIndexLocation,
INT BaseVertexLocation,
UINT StartInstanceLocation
);
有关使用实例化的信息,请参阅 C++ 示例 简单实例化 : DX11/ DX12 .

关于c++ - 'CommandList::DrawInstanced' 如何选择多个槽中的顶点缓冲区之一?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64895338/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com