查看: 2345|回复: 6

关于在osg绘制窗口使用gdi函数的问题

[复制链接]

该用户从未签到

发表于 2010-4-1 09:36:01 | 显示全部楼层 |阅读模式
最近想在osg的绘制窗口使用gdi函数,但是发现输出的文字或者使用gdi函数绘制的线条总是不断的闪烁,找了好多方法都没有解决,请教各位如何解决,先谢谢了!

该用户从未签到

发表于 2010-4-1 11:06:18 | 显示全部楼层
在OpenGL窗口上使用GDI函数?我个人没有这方面的经验,也不确信您的方法是否可行

该用户从未签到

发表于 2011-2-14 00:06:46 | 显示全部楼层
你在用GDI的函数绘制完元素后,马上调用 函数 GDIFlush,应该就没有闪烁了。

该用户从未签到

发表于 2011-2-14 00:14:08 | 显示全部楼层
zero2top 是我的回复。使用GDIFlush还是不行。我使用OSG渲染到位图,然后将GDI也渲染到位图,可以解决文字闪烁问题,但是OSG绘制的内容也闪烁,而且在视点拉近时,OSG渲染的内容在窗口上看起来不正确。我问过这个问题。如下:
http://bbs.osgchina.org/viewthread.php?tid=4924&highlight=

该用户从未签到

发表于 2011-2-15 09:41:50 | 显示全部楼层
你可以考虑全部用osg绘制啊,二维的也行啊~~~

该用户从未签到

发表于 2011-2-15 11:42:22 | 显示全部楼层
OpenGL和GDI是可以部并存的,不过,OSG就未必能够了。
原因:
GDI绘图,通常(99%的时候)需要在WM_PAINT消息下绘图,若是使用MFC,那么就是在OnPaint函数里面绘图,这是没什么问题的,完全遵从微软的要求。GDI绘图不放在WM_PAINT消息下面,那么窗口客户区更新的时候,绘制的东西就消失了。据此理,所有需要往窗口客户区绘图的操作,原则上都需要放在WM_PAINT消息下面。
而OSG通常没这么做,大部分图形引擎都没有这么做。为了避免窗口客户区更新时能够维持窗口画面,就必须不断的绘制,比如做一个定时器,或者开一个线程,或者在程序空闲的时候,不间断地往窗口上绘图。这样就可以避免窗口客户区更新是画面被擦除。
但是,这样又导致了一个冲突:这种不间断地绘图,势必会覆盖在WM_PAINT消息下的绘图结果。

要解决你的问题,有两个办法:
1、若你的程序不是一个实时3D程序,比如CAD之类的程序,那么完全没有必要“不间断地绘图”,只需要将OSG的frame函数移到WM_PAINT消息里面去执行即可。在frame函数执行完了,再执行你的GDI代码,问题解决。
2、若你的程序的确是一个实时3D程序,那么,你在哪里调用的osg的frame函数?在调用完frame函数之后,立即开始你的GDI绘图(注意,此时GDI绘图所需要的HDC,使用GetDC函数获取,不得使用BeginPaint或者MFC的CPaintDC对象),也能达到一样的效果。此时,WM_PAINT消息下面的任何绘图操作都是看不到的,最好直接删除掉WM_PAINT消息的响应代码(若不删掉该消息的处理,那么一定要保证该响应代码里面有BeginPaint和EndPaint的成对调用,或者MFC的CPaintDC对象构造和析构)。

该用户从未签到

发表于 2011-2-15 11:42:36 | 显示全部楼层
我建议,若对WindowsGDI的绘图时机方面的知识了解不够,就别想简单地将OpenGL和GDI混合使用,轻则导致绘图不出来,重则会导致严重Windows资源泄露,GDI资源泄露很难检测到,而且常常是程序运行十几分钟之后就莫名挂起了。

混合绘图,不光是OpenGL会这样,DirectX也是这样的,不要责怪OpenGL有什么问题,更不要责怪OSG没有帮你包装好。程序就是这样写的。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表