我没有使用 Direct3D 的经验,所以我可能只是在寻找错误的地方。但是,我想将我用 OpenGL(使用 FreeGLUT)编写的程序转换为与 Windows IoT 兼容的 UWP(运行 Direct3D,12,因为它很酷)。我正在尝试将我的程序移植到 Raspberry Pi 3,但我不想转换为 Linux。
通过 Microsoft 提供的示例,我已经弄清楚了我认为开始需要知道的大部分内容,但我无法弄清楚如何在 CPU 和 GPU 之间共享动态数据缓冲区。
我想知道该怎么做:
- 创建 CPU/GPU 共享循环缓冲区
- 使用 GPU 阅读和绘图
- 用 CPU 写入/替换部分
快速半伪代码:
while (!buffer.inUse()){ //wait until buffer is not in use
updateBuffer(buffer.id, data, start, end); //insert data into buffer
drawToScreen(buffer.id); //draw using vertex data in buffer
}
以前在 OpenGL 中通过简单地使用 glBegin()/glEnd() 和 glVertex3f() 来完成未写入数组中的每个值的操作。
更新:我基本上想要使用 glBufferSubData() 的 OpenGLs VBO 编辑的 Direct3D12 等价物。如果这更有意义。
更新 2:我发现我可以放弃每一帧的顶点缓冲区并将新缓冲区重新上传到 GPU。正如人们所期望的那样,每帧传输 10,000 到 200,000 个 double 会产生相当多的开销。所以我试图找到一种方法来使用常量缓冲区将 5-10 个更新的顶点移植到着色器中,这样我就可以使用着色器从常量缓冲区复制到顶点缓冲区,而不必每帧都使用映射/取消映射. 这样,我在 CPU 上的循环缓冲区独立于 GPU 上使用的缓冲区,但它们都将通过定期更新共享相同的信息。如果我找不到解决方案,我会做更多的查找并在着色器上发布另一个更具体的问题。