将 OpenGL 绘制到屏幕外的位图
Draw OpenGL to an offscreen bitmap
我继承了一个使用 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矩阵,您应该清理该反模式并将其移动到它所属的位置:在绘图代码中。
- C / C++ 移位/偏移/向左或向右移动位图?
- 如何在快板的屏幕中显示子位图的绘制?
- CreateDIBSection为同一图像返回不一致的位图位值
- C++ 位图中的 ttc 字体
- 使用 GDI+ 旋转位图,然后转换为 HDC
- 难以从 CImageList 设置菜单项位图
- 如何将位图拉伸到父面板(wxWidgets 自定义)
- 如何使用 freetype2 访问单色位图中的像素状态
- 将位图 (bmp) 转换为具有透明度的 png (Windows c++)
- 安卓工作室 |CPP 文件错误错误: 位图库中对"AndroidBitmap_unlockPixels"的未定义引用
- 位图到垫子/2D 数组
- Gdiplus位图没有Alpha通道
- C++屏幕截图 - 如何读取位图?
- 如何将屏幕截图位图转换为 cv::Mat
- C++ WinRT - 如何动态缩放可写位图以匹配当前屏幕分辨率
- 从C++中的屏幕选择创建位图时的黑色图像
- 屏幕捕获到Direct2D兼容位图
- 在内存中将屏幕截图位图转换为jpeg
- 将 OpenGL 绘制到屏幕外的位图
- 我如何使用一个屏幕外的DC渲染位图的编译一次