在Windows系统中混合使用OpenGL和GDI技术

3
我正在尝试在Windows中混合使用OpenGL渲染和GDI。之前我将OpenGL内容渲染到一个帧缓冲对象中,然后提取它,将其合成到Windows的GDI图形上下文中,然后再在上面绘制我的GDI东西。这样做会大大降低帧率。
我想做与现在相反的事情,让我的OpenGL渲染直接作用于窗口,然后将GDI内容渲染到位图中,上传到纹理中,然后使用四边形叠加。GDI内容并不经常更改,所以我不需要每帧重新绘制它,我可以缓存纹理。
我几乎做到了,但问题是我似乎无法从GDI位图中获取正确的alpha值,因此文本和线条出现了可怕的锯齿。
有没有任何有用的资源可以教我如何做到这一点?是否可能使GDI或GDI+以我所需的方式写入Alpha通道?

我忘了,GDI(+)是否支持32位颜色? - Brian
我相信是这样的。我正在提供一个BGRA位图给GDI进行渲染。问题在于alpha通道只被写入了0或255。 - Matt
你有渲染GDI纹理的示例代码吗? - Jacob Stanley
你可以为位图设置32位像素格式,但是在渲染时要小心,因为GDI不使用alpha通道作为alpha通道!相反,对于某些函数,设备模式(通常为0、1、2或3)有一些信息,因此很有可能您的alpha通道被其他东西覆盖。如果您没有使用DIB(HandleType),那么错误地设置alpha可能会给您带来很多麻烦(某些操作在颜色内部设置了错误的设备模式时无法正常工作)。 - Spektre
3个回答

2

我认为使用原始的OpenGL进行渲染会更容易,而不是使用GDI。只需创建一些包装函数并调用它们即可替代GDI。


2

这些都是必要的吗?你应该能够只使用GDI函数在与OpenGL相同的设备上下文中绘图。


1
是的,这是真的,我经常这样做,但需要一些工作来避免闪烁... - Spektre

0
如何使用模板缓冲区(stenciling)?在模板缓冲区中复制纹理。使用GL_NOTEQUAL作为测试函数,引用值等于纹理的背景值。先渲染OpenGL内容,然后启用模板缓冲区,最后渲染纹理矩形。
你没有说明这是一个二维还是三维问题。锯齿可能是三维世界中深度问题,其中所有内容几乎在同一平面上。如果你正在处理3D,请确保纹理矩形在其他所有内容的前面或修改z缓冲区。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接