将OpenGL绘制到屏幕外位图

时间:2016-07-08 12:14:08

标签: c++ windows opengl bitmap

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

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

在StackOverflow(eg. this question without an accepted answer上有几个问题在这里提出类似的问题。这可能吗?如果是这样,有一个相对简单的教程描述过程?如果过程非常复杂,需要详细的OpenGL知识,那么我可能只需要离开它并与闪烁一起生活,因为它是我们软件中很少使用的模式。

1 个答案:

答案 0 :(得分:0)

使用纹理四边形使用OpenGL绘制图标。

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

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

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