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

Is it possible to draw using opengl on a directx dc/buffer?

这可能是个愚蠢的问题,但我找不到很好的例子来说明如何解决这个问题,或者如果可能的话。我刚刚完成了一个项目,在该项目中,我使用 gdi 将内容 biblt 到 DIB 缓冲区,然后将其交换到屏幕 hdc 上,基本上是制作我自己的交换链并使用 opengl 绘图。

然后我想,我可以使用 directx11 做同样的事情吗?但是我似乎找不到我需要更改的 DIB/buffer 在哪里。

我的想法是否正确?关于如何处理这个问题有什么想法吗?

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

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

当然,性能会很糟糕,您在单个 "operation" 中多次停止 GPU,并迫使它与 CPU(传递数据的人)和总线(用于内存访问)。再加上绝对没有任何好处。但是如果你真的想尝试一下,你可以试试。

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

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

但是,不要仅仅为了好玩或者如果您控制了应用程序的所有源代码就这样做。这种互操作场景适用于您有两个 legacy/complicated 代码库并且互操作是 cheaper/better 选项的情况,而不是将所有逻辑移植到另一个 API.