使用GDI在OpenGL/D3D上绘制?

4
我想知道是否有可能在OpenGL/Direct3D表面上使用GDI进行绘制?如果可以,该如何实现?
我之所以问这个问题是因为我正在编写一个简单的应用程序来在游戏中绘制一些东西。这些东西都是2D或文本,例如帧率信息、自定义准星、时钟等。
我知道最好的方法是挂钩并使用渲染器/游戏本身使用的任何内容,无论是OpenGL还是Direct3D,但我正在研究GDI,因为据我所知,OpenGL和D3D都位于设备上下文中,我希望可以使用GDI进行绘制。
2个回答

5

通常情况下,您不能直接这样做。

理论上,只有在OpenGL或DirectX使用单缓冲绘图时,您才能将GDI与它们混合使用。然而,这几乎只是一种理论上的可能性,因为几乎所有对DirectX和OpenGL的使用都是双缓冲。

我建议尝试其他方法,比如在无边框的分层窗口中绘制您的数据。


1
我确认分层窗口方法适用于OpenGL上下文(因为我已经在顶级窗口中使用过它),但是由于Windows负责重新绘制分层窗口以及移动/更新分层窗口下方的窗口,因此您可能会得到意外的结果。 - dyp

1
您可以使用CreateCompatibleDC、CreateCompatibleBitmap、SelectObject和GetDIBits在中央内存缓冲区中使用GDI进行绘制。 注意:兼容的DC很慢(没有2D加速)。 然后,您必须将中央内存复制(慢操作)到纹理中。
对于文本,您可以将所有ASCII字符一次性复制到纹理中,然后使用D3D纹理函数复制每个字符。对于等宽US-ASCII字体来说,这应该足够简单。

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