用 GDI 绘制 opengl/D3D 吗?
我想知道是否可以使用 GDI 在 opengl/direct3D 表面上进行绘制?如果是的话,该怎么做?
我问的原因是因为我正在编写一个简单的应用程序来在游戏中绘制一些东西。这些东西都是 2D 或文本,例如帧率信息、自定义十字准线、时钟等。
我知道最好的方法是挂钩并使用渲染器/游戏本机使用的任何内容,无论是 opengl 还是 direct3d,但我就 GDI 而言,据我所知 opengl 和 D3D 都位于设备上下文中,我希望可以使用 GDI 来吸引它们。
I'm wondering if it's possible to draw over an opengl/direct3D surface with GDI? and if so, how might it be done?
The reason I ask is because I'm writing a simple app to draw a few things in games. Such things would all be 2D or text such as framerate info, custom crosshair, clock, etc.
I know the best way is to hook in and use whatever the renderer/game is using natively, be it opengl or direct3d, but I'm looking at GDI as AFAIK both opengl and D3D sit on device contexts which I'm hoping can be draw to with GDI.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
通常你不能直接这样做。
理论上,当且仅当 OpenGL/DirectX 绘图使用单缓冲(而非双缓冲)完成时,您才可以将 GDI 与 OpenGL 或 DirectX 混合使用。然而,这只是理论上的可能性,因为几乎所有 DirectX 和 OpenGL 的使用都是双缓冲的。
我会尝试其他方法,例如在无边界 分层窗口。
You can't usually do it directly.
In theory, you can intermix GDI with OpenGL or DirectX if and only if the OpenGL/DirectX drawing is done with single buffering, not double buffering. That, however, is little more than a theoretical possibility, because virtually all use of DirectX and OpenGL is with double buffering.
I'd try something else, such as drawing your data in a borderless layered window.
您可以使用 CreateCompatibleDC、CreateCompatibleBitmap、SelectObject 和 GetDIBits 在中央内存缓冲区中使用 GDI 进行绘制。
注意:兼容的 DC 速度很慢(无 2D 加速)。
然后,您必须从中央内存复制(缓慢操作)到纹理。
对于文本,您可以将所有 ASCII 字符复制到纹理中,然后使用 D3D 纹理函数复制每个字符。对于等宽 US-ASCII 字体来说,这应该很容易。
You can draw with GDI in a central memory buffer with CreateCompatibleDC, CreateCompatibleBitmap, SelectObject and GetDIBits.
Beware: Compatible DC are slow (no 2D acceleration).
Then, you must copy (slow operation) from central memory to a texture.
For text, you may copy all ASCII characters once into a texture, and then, use D3D texture functions to copy each character. It should be easy enough for monospace US-ASCII fonts.