作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我学习了如何使用 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)
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/
我学习了如何使用 IASetVertexVuffers 将顶点缓冲区绑定(bind)到特定插槽。 但是,当我学习 DrawInstanced 时,我学会了仅使用起始顶点的索引来选择要绘制的顶点。 我想
假设我有一个具有许多顶点的复杂对象,我想绘制该对象的许多实例。我想知道哪种方法会更快:一个 DrawInstanced 或多个 DrawIndexed。如果我有非常简单的对象,比如说有 4 个顶点的
我是一名优秀的程序员,十分优秀!