将 OpenGL 绘制到屏幕外的位图

Draw OpenGL to an offscreen bitmap

本文关键字:位图 屏幕 OpenGL 绘制      更新时间:2023-10-16

我继承了一个使用 OpenGL 将 3D 场景直接渲染到窗口的项目。代码工作正常,但我们现在在 3D 视图上绘制一个图标以"退出 3D 视图模式"。这也可以正常工作,但是当视图快速旋转时会导致大量闪烁。

我希望能够绘制到屏幕外的位图(即没有 HWND),然后将我的图标绘制到位图上,最后使用双缓冲将位图StretchBlt到窗口。我们在其他上下文中执行此操作(例如放大不需要OpenGL的图像),效果很好。我的问题是我是 OpenGL 新手,所有尝试从屏幕外位图的 DC 开始并从此 DC 创建 HWND 都失败了,通常是因为为 DC 选择了像素格式。

StackOverflow上有一些问题问类似的事情(例如,这个问题没有公认的答案。这可能吗?如果是这样,是否有一个相对简单的教程来描述该过程?如果这个过程非常复杂,需要详细的OpenGL知识,那么我可能只需要离开它并忍受闪烁,因为它在我们的软件中很少使用。

只需使用OpenGL使用带纹理的四边形绘制图标即可。

所有这些绘制到DC StretchBlt的位图副本都涉及图形内存之间的多次往返(浪费带宽),并且StretchBlt可能不会进行GPU加速。总而言之,你想做的事情是低效的,甚至可能降低质量。

我假设您将图标作为资源存储在可执行文件中。最简单的方法是创建一个带有DIBSECTION(CreateDIBSection)的内存DC(CreateCompatibleDC),将图标绘制到该图标并将DIBSECTION数据加载到OpenGL纹理中。然后,要使用glViewport在窗口坐标中选择目标矩形,请使用标识转换绘制覆盖整个视口的矩形(位置值 (-1,1)→(1,1)、纹理坐标值 (0,0)→(1,1) 为您提供正确的结果)。

重要的侧面修复:如果您的程序做了一些愚蠢的事情,例如在窗口调整大小处理程序中设置视口和固定的函数管道GL_PROJECTION矩阵,您应该清理该反模式并将其移动到它所属的位置:在绘图代码中。