我没有使用Direct3D的经验,所以我可能只是在找错了地方。但是,我想将我用OpenGL编写的程序(使用FreeGLUT)转换为Windows IoT兼容的UWP(运行Direct3D,12' caus it's cool)。我试图将我的程序移植到Raspberry Pi 3并且我不想转换为Linux。
通过Microsoft提供的示例,我已经找到了我认为开始时需要了解的大部分内容,但我无法弄清楚如何在CPU和GPU之间共享动态数据缓冲区。
我想知道怎么做:
快速半伪代码:
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上使用的缓冲区,但它们将通过定期更新共享相同的信息。如果我找不到解决方案,我会更多地查看并发布关于着色器的其他更具体的问题。