是否可以在directx dc / buffer上使用opengl进行绘制?

时间:2015-09-27 01:47:59

标签: c++ winapi opengl directx directx-11

这可能是一个愚蠢的问题,但我找不到如何处理这个问题的好例子,或者它是否可能。我只是完成了一个项目,我用gdi将东西放到DIB缓冲区然后将其交换到屏幕hdc,基本上是用自己的交换链和用opengl绘图。

那么我想,我可以使用directx11做同样的事情吗?但我似乎无法找到我需要改变的DIB /缓冲区的位置。

我是否正确地考虑过这个问题?关于如何处理这个的任何想法?

2 个答案:

答案 0 :(得分:1)

是的,你可以。 Nvidia公开了名为NV_DX_interopNV_DX_Interop2的特定于供应商的扩展程序。通过这些扩展,您可以直接访问DirectX表面(当它驻留在GPU上时)并从OpenGL上下文渲染到它。此操作应该有最小的(仅驱动程序)开销,并且几乎不会涉及CPU。

请注意,虽然这是特定于供应商的扩展程序,但Intel GPU也支持它。

但是,不要仅仅因为它的乐趣或者您控制应用程序的所有源代码而这样做。这种互操作方案适用于您有两个遗留/复杂代码库的情况,而interop是比将所有逻辑移植到另一个API更便宜/更好的选择。

答案 1 :(得分:-1)

是的,你可以做到,OpenGL和D3D都支持可写纹理并锁定它们以获得像素数据。

只需将OpenGL中的场景渲染为纹理,锁定它,读取像素数据并将其直接传递给D3D锁定纹理像素数据,解锁它然后用纹理做任何你想做的事情。

性能当然是可怕的,你在一次"操作中多次停止GPU#34;并强制它与CPU(谁传递数据)和总线(用于存储器访问)同步。此外,根本没有任何好处。但如果你真的想尝试一下,你就可以做到。