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

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

本文关键字:opengl 绘制 buffer directx dc 是否      更新时间:2023-10-16

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

所以我想,我可以用directx11做同样的事情吗?但我似乎找不到我需要改变的DIB/缓冲区在哪里。

我想的对吗?有什么好主意吗?

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

请注意,虽然这是一个特定于供应商的扩展,英特尔gpu也支持它。

但是,不要仅仅为了好玩或者如果您控制了应用程序的所有源代码就这样做。这种互操作场景适用于有两个遗留/复杂代码库的情况,而互操作是比将所有逻辑移植到其他API更便宜/更好的选择。

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

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

性能当然会很糟糕,你在一个单一的"操作"中多次拖延GPU,并迫使它与CPU(传递数据)和总线(用于内存访问)同步。而且这绝对没有任何好处。但如果你真的想试试,你可以试试