3

我知道不建议混合使用 OpenGL 和 DirectX,但我正在尝试在使用单独图形 API 的两个不同应用程序之间架起一座桥梁:我希望有一种共享数据的技术,特别是纹理。

我有一个在 Direct3D 中创建的纹理,如下所示:

d3_device-> CreateTexture(width, height,
  1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT,
  &texture, NULL);

有什么方法可以在不通过系统内存往返的情况下使用 OpenGL 中的这个纹理?

4

5 回答 5

9

是的。正如之前发布的(见下文),应该至少存在一种解决方案。我找到了两种可能的解决方案:

  1. 在 nvidia 卡上,256 驱动程序中集成了一个新的扩展。见http://developer.download.nvidia.com/opengl/specs/WGL_NV_DX_interop.txt

  2. DXGI 是在 Vista 和 Windows 7 中合成所有窗口的驱动力。请参阅 msdn.microsoft.com/en-us/library/ee913554.aspx

我还没有使用这两种解决方案的经验,但我希望我能找到一些时间来测试其中一个。但对我来说,第一个似乎更容易。


【我觉得应该可以。在最近的 Windows 版本(Vista 和 7)中,可以在任务栏中看到任何窗口内容的预览(无论是 GDI、Direct3D 还是 OpenGL)。据我所知,早期的 Windows 版本不支持 OpenGL 预览。因此,至少在较新的版本中,即使在不同的进程之间,也应该有可能耦合或共享渲染上下文......对于其他在系统范围内共享渲染上下文以产生不同渲染效果的现代平台也是如此。]

于 2010-11-10T11:05:56.760 回答
0

我认为这是不可能的。因为两者都有不同的纹理模型。

如果没有 directX 或 openGL,您将无法直接访问纹理内存。

其他方式:如果可能的话,您应该能够检索纹理地址、其间距、宽度和其他(取决于硬件)内存布局信息,并在其他系统中创建一个 dummytexture 并将检索到的数据推送到您刚刚创建的纹理对象中. 这是不可能的

显然,这不适用于任何下降的硬件,如果是这样,它就不是很便携。

于 2009-10-21T14:34:06.197 回答
0

如果不将数据下载到主机内存并将其重新上传到设备内存中,我认为这是不可能的。

于 2010-02-25T16:50:07.770 回答
0

现在有可能。

使用ANGLE OpenGL API 代替原生 OpenGL。

您可以使用 EGL_ANGLE_d3d_texture_client_buffere 扩展名共享 direct3d 纹理。 https://github.com/microsoft/angle/wiki/Interop-with-other-DirectX-code#demo

于 2020-12-23T02:18:37.410 回答
-3

不。

可以将其想象为在 Photoshop 和另一个图像查看器中共享图像。您将需要这两个应用程序共享的内存管理库。

于 2009-10-21T19:20:44.927 回答