Direct3D12中的CPU / GPU共享缓冲区

时间:2016-06-17 04:34:16

标签: c++ windowsiot direct3d12

我没有使用Direct3D的经验,所以我可能只是在找错了地方。但是,我想将我用OpenGL编写的程序(使用FreeGLUT)转换为Windows IoT兼容的UWP(运行Direct3D,12' caus it's cool)。我试图将我的程序移植到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()的Open3s VBO编辑的Direct3D12。如果这更有意义。

更新2:我发现我可以在每帧丢弃顶点缓冲区并重新上传新的缓冲区到GPU。这是一个相当大的开销,正如人们所期望的那样每帧传输10,000到200,000双。所以我试图找到一种方法来使用常量缓冲区将5-10个更新的顶点移植到着色器中,这样我就可以使用着色器从常量缓冲区复制到顶点缓冲区,而不必使用map / unmap每一帧。这样,我在CPU上的循环缓冲区独立于GPU上使用的缓冲区,但它们将通过定期更新共享相同的信息。如果我找不到解决方案,我会更多地查看并发布关于着色器的其他更具体的问题。

0 个答案:

没有答案