【问题标题】:Mixing OpenGL and GDI on Windows在 Windows 上混合 OpenGL 和 GDI
【发布时间】:2010-09-29 15:48:13
【问题描述】:

我正在尝试找出一种在 Windows 中混合 OpenGL 渲染和 GDI 的方法。以前我一直将我的 OpenGL 内容渲染到一个帧缓冲区对象中,将其提取出来,然后将其放入 windows GDI 图形上下文中,然后在顶部绘制我的 GDI 内容。这真的会削弱帧率。

我想做与我现在正在做的相反的事情,所以我的 OpenGL 渲染直接在窗口中完成,然后我将 GDI 内容渲染到一个位图,该位图被上传到纹理,然后使用四边形叠加。 GDI 的东西并没有太大的变化,所以我不需要每帧都重新绘制它,我可以缓存纹理。

我几乎可以让它工作,问题是我似乎无法从 GDI 位图中获得正确的 alpha 值,因此文本和线条会出现可怕的锯齿。

有没有人有任何有用的资源来说明如何做到这一点?是否有可能让 GDI 或 GDI+ 以我需要的方式写入 alpha 通道?

【问题讨论】:

  • 我忘了,GDI(+) 支持 32 位颜色吗?
  • 我相信是的。我正在向 GDI 提供 BGRA 位图以进行渲染。问题是 alpha 只写为 0 或 255。
  • 你有关于如何渲染 GDI 纹理的示例代码吗?
  • 您可以为位图设置 32 位像素格式,但您应该注意渲染的内容和方式,因为 GDI 不使用 alpha 通道作为 alpha 通道!相反,有一些关于某些功能的设备模式(通常是 0、1、2 或 3)的信息,因此您的 alpha 通道很可能被其他东西覆盖。如果你没有使用 DIB (HandleType) 那么错误设置 alpha 会给你带来很多麻烦(一些操作在颜色内部设置错误的设备模式下无法正常工作)

标签: windows opengl gdi


【解决方案1】:

我认为如果您只使用原始 OpenGL 而不是 GDI 进行渲染会更容易。只需创建一些包装函数并调用它们而不是 GDI。

【讨论】:

    【解决方案2】:

    真的有必要吗?您应该能够只使用 GDI 函数在与您的 OpenGL 相同的设备上下文上绘图。

    【讨论】:

    • 是的,我一直这样做,但这需要一些工作来避免闪烁......
    【解决方案3】:

    如何使用模板。在模板缓冲区中复制您的纹理。使用 GL_NOTEQUAL 作为测试函数,其参考值等于纹理的背景值。首先渲染 OpenGL 的东西,然后启用模板,然后渲染你的纹理矩形。

    您没有指定这是 2D 还是 3D 问题。锯齿可能是 3D 世界中的一个深度问题,在这个世界中,几乎所有东西都在同一个平面上。如果您在 3D 中工作,请确保纹理矩形位于其他所有内容的前面或修改 z 缓冲区。

    【讨论】:

      猜你喜欢
      • 2014-07-31
      • 2011-12-02
      • 1970-01-01
      • 1970-01-01
      • 2015-03-30
      • 2011-11-02
      • 1970-01-01
      • 2014-10-20
      • 2013-06-02
      相关资源
      最近更新 更多