我对 DirectX 12 有疑问。我制作了一个小型 3D 渲染器。模型在顶点着色器中转换为 3D 空间,基本世界视图投影矩阵位于常量缓冲区中。
要更改常量缓冲区的数据,我当前使用memcpy(pMappedConstantBuffer + alignedSize * frame, newConstantBufferData, alignedSize)
此命令会立即替换常量缓冲区的数据。
所以问题就来了,绘图被记录到一个命令列表中,稍后发送到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 上的每个绘制调用之间发生变化?
谢谢
不再需要帮助,我自己解决了。我为每个网格创建了常量缓冲区。