【问题标题】:Mixing DirectX and OpenGL混合 DirectX 和 OpenGL
【发布时间】:2011-12-02 22:49:25
【问题描述】:

我希望能够使用 DirectX 渲染到 OpenGL 渲染窗口。这是因为我追求的功能只有 DirectX 支持。

几年前我就听说可以做到这一点,我希望它仍然可以做到。

我想这将涉及将 DirectX 指向 VRAM 的正确部分和正确的深度缓冲区。

另外一个教程或简单的解释将非常有用。

【问题讨论】:

  • 为什么需要输出到OpenGL?如果 DirectX 可用,为什么不坚持使用 DX 渲染器?
  • 主要是因为我需要 windows OpenGL 命令才能在 windows 子窗口中正确渲染 OpenGL 渲染表面。
  • "这是因为我所追求的功能仅在 Direct X 中受支持。"这些是什么功能?我知道很少有 OpenGL 下不可用的 D3D 功能。
  • ... 每个 Direct3D 功能都可以在 OpenGL 中实现。只是要正确地做到这一点会很棘手。

标签: c++ opengl directx


【解决方案1】:

我自己正在研究的 OpenGL 和 Direct3D 之间差异的一个具体示例是,在 DirectShow(Direct3D 的一个子集)中,我的基于 Panasonic DVCPRO-HD 的相机有视频捕捉过滤器。因此,通过该 API 收集的实时流,我想用作 OpenGL 库的输入。一个这样的库是基于 OpenGL 的 OpenFrameWorks。我想看看我能多有效地进行这种转移。现有的 OpenFrameWorks Video API 使用稍旧且已弃用的 DirectShow API,并使用蛮力策略将像素从 DirectShow 获取到 OpenFrameWorks。

【讨论】:

    【解决方案2】:

    你可以。至少对于英伟达来说!检查 NV_DX_interop。但是,OpenGL 支持所有 DirectX 功能,因为 OpenGL 比 DirectX 更原始/低级!只是它的实现方式可能有所不同。同样,告诉我们您想要 DirectX 的哪个功能,我可以告诉您如何重新实现它的提示。

    【讨论】:

      【解决方案3】:

      至少 NVIDIA 有 NV_DX_interop extension,它让您可以直接使用 Direct3D 9 缓冲区/纹理/表面作为 OpenGL 缓冲区/纹理/渲染缓冲区(因此反过来)。但是我没有这方面的经验,我不知道它是否得到广泛支持或实际上是否有效。

      更有趣的是,您认为哪些功能仅在 Direct3D 中可用。也许我们可以向您展示如何使用 OpenGL 来实现它,因为 Direct3D 中可用的功能(如果有的话)并不多,而 OpenGL 中则没有。尽管如果您有 ATI 卡,那么可用和实际正常工作有时可能是两件不同的事情。

      【讨论】:

      • 请注意,即使是互操作也不允许您使用两个 API 渲染到 same 窗口。如果您有不同的窗口或屏幕外渲染上下文,那么您可以使用它。但不是在同一个表面上。
      • 您可以在一个屏幕外表面通过 OpenGL 进行渲染,在另一个屏幕外使用 DirectX,然后复制并组合它们的纹理。
      【解决方案4】:

      混合 OpenGL 和 Direct3D 是行不通的,AFAIK 从来没有这样过。请问,您需要哪些 Direct3D 功能,而 OpenGL 不提供?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-03-30
        • 2011-11-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多