gpt4 book ai didi

c++ - 将多个网格绘制到不同位置 (DirectX 12)

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:45:24 24 4
gpt4 key购买 nike

我的 DirectX 12 有问题。我制作了一个小型 3D 渲染器。模型在顶点着色器中转换为 3D 空间,具有常量缓冲区中的基本世界 View 投影矩阵。

要更改我当前正在使用的常量缓冲区的数据,memcpy(pMappedConstantBuffer + alignedSize * frame, newConstantBufferData, alignedSize) 此命令会立即替换常量缓冲区的数据。


那么问题来了,绘图被记录到一个command list中,稍后将发送给gpu执行。

例子:

/* Now i want to change the constant buffer to change the next draw call's position to (0, 1, 0) */
memcpy(/*Parameters*/);

/* Now i want to record a draw call to the command list */
DrawInstanced(/*Parameters*/);

/* But now i want to draw other mesh to other position so i have to change the constant buffer. After this memcpy() the draw position will be (0, -1, 0) */
memcpy(/*Parameters*/);

/* Now i want to record new draw call to the list */
DrawInstanced(/*Parameters*/);

在此之后,我将命令列表发送到 gpu 执行,但我想知道所有的网格将在同一位置,因为所有的 memcpys 在命令列表发送到 gpu 之前就已执行。所以基本上最后一个 memcpy 覆盖了之前的。


所以基本上问题是我如何将网格绘制到不同的位置,或者如何替换命令列表中的常量缓冲区数据,以便常量缓冲区在 gpu 上的每次绘制调用之间发生变化?

谢谢


不再需要帮助,我自己解决了。我为每个网格创建了常量缓冲区。

最佳答案

关于执行顺序,你是完全正确的,你的 memcpy 调用会立即更新缓冲区,但是直到你将你的命令列表插入队列时才会处理命令(你不会确切知道什么时候会发生)。

在 Direct3D11 中,当您在缓冲区上使用 Map 时,系统会为您处理(如果需要,将分配一些空间以避免这种情况)。

所以在 Direct3D12 中你有多种选择,我会考虑你想要绘制 N 个对象,并且你想在你的 cbuffer 中为每个对象存储一个矩阵。

首先是为每个对象创建一个缓冲区并独立设置数据。如果您只有几个,这很容易维护(并且由于资源分配而导致的额外内存占用也可以)

另一种选择是创建一个大缓冲区(可以包含 N 个矩阵),并创建指向每个对象的内存位置的 N 个常量缓冲区 View 。 (请注意,在这种情况下,您还必须遵守 256 字节对齐,请参阅 CreateConstantBufferView)。

您还可以使用 StructuredBuffer 并将所有数据复制到其中(在这种情况下您不需要对齐),并使用顶点着色器中的索引来查找正确的矩阵。 (可以在着色器中设置一个 uint 值并使用 SetGraphicsRoot32BitConstant 直接应用它)。

关于c++ - 将多个网格绘制到不同位置 (DirectX 12),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39796989/

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