我知道不建议混合使用OpenGL和DirectX,但我正在尝试在使用单独图形API的两个不同应用程序之间建立桥梁:我希望有一种共享数据的技术,特别是纹理。
我有一个在Direct3D中创建的纹理,如下所示:
d3_device-> CreateTexture(width, height,
1, D3DUSAGE_RENDERTARGET, D3DFMT_A8R8G8B8, D3DPOOL_DEFAULT,
&texture, NULL);
有没有办法在不通过系统内存往返的情况下从OpenGL中使用这个纹理?
答案 0 :(得分:9)
YES。如前所述(见下文),应该至少存在一种解决方案。 我找到了两种可能的解决方案:
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预览。所以至少在较新的版本中,即使在不同的进程之间,也应该有可能耦合或共享渲染上下文...... 对于在系统范围内共享渲染上下文以产生不同渲染效果的其他现代平台也是如此。]
答案 1 :(得分:0)
我认为这是不可能的。因为两者都有不同的纹理模型。
如果没有directX或openGL,则无法直接访问纹理内存。
另外:如果可能,您应该能够检索纹理地址,其间距,宽度和其他(硬件相关的)内存布局信息,并在另一个系统中创建一个虚拟纹理并将检索到的数据推送到您的创建纹理对象。这是不可能的
显然,这不适用于任何后代硬件,如果是这样,它将不会非常便携。
答案 2 :(得分:0)
如果不将数据下载到主机内存并重新上传到设备内存中,我认为不可能。
答案 3 :(得分:0)
现在有可能。
使用 ANGLE OpenGL API 代替原生 OpenGL。
您可以使用 EGL_ANGLE_d3d_texture_client_buffere 扩展共享 direct3d 纹理。 https://github.com/microsoft/angle/wiki/Interop-with-other-DirectX-code#demo
答案 4 :(得分:-3)
没有。
将其想象为在photoshop和其他图像查看器中共享图像。您需要这两个应用程序共享的内存管理库。