openGL 双缓冲问题
OpenGL与window GDI接合编程一般方式是:
1 调用SetPixelFomart, 指定像素格式为双缓冲
2 用DC创建RC hRC=wglCreateContext(hDC);
3 指定当前的DC、RC
4 调用OpenGL接口画图
5 画完之后,调用SwapBuffer(hdc) 将内容刷新到屏幕上.
6 释放DC, RC
我现在问题是:
1 在第四步中,能否调用GDI的接口,还是必须调用OpenGL接口
2 根据这些步来看,DC与RC进行了关联,这个DC显示范围是针对window窗口还是只针窗口客户区,或者还是整个屏幕.
3 在window中,存在多个窗口相互overlap的问题,如果被盖窗口调用了swapbuffer函数,显示又是怎么样的?
因为我对OpenGL一点都不清楚,盼DX解答!
问题点数:50、回复次数:3Top
1 楼Diab1o(菠萝)回复于 2005-04-02 21:37:09 得分 50
1. 必须用OpenGL的接口,因为无法得到后台帧缓存的句柄,直接用GDI接口修改DC的话会闪烁。
2. dc的显示范围自然是创建它的窗体客户区。
3. swapbuffer操作只改变设备环境关联的那个窗体,前端的窗口不受影响。
这种问题不如自己试一试。Top
2 楼kmzwm(狂战士)回复于 2005-04-03 21:58:14 得分 0
如果在WM_PAINT消息中调用OpenGL绘图函数,有一个问题是WM_PAINT消息中,Window只会将需要刷新的区域更新那屏幕上,而没有脏的区域不会更新!
这样,如果调用OpenGL函数,有可能已经需要刷新的区域而window窗口管理系统不知道而得不到刷新!这样显示内容不全!
另外,假设这个缓冲区显示范围是整个窗口客户区,如果客户区被别的窗口盖了一部分,如果调用SwapBuffer()函数是将整个后背缓冲区内容刷新到屏幕上,这样会将前面的那个窗口内容搞乱!这些情况,window和OpenGL是怎么样处理?Top
3 楼Diab1o(菠萝)回复于 2005-04-04 14:18:55 得分 0
你所说的情况是你亲眼所见还是猜测的?至少我没碰到过。如果OpenGL窗口的内容不完全是被动更新(只更新脏区域)的话,就不应该在WM_PAINT消息中调用OpenGL绘图函数,而应该另开线程或者在窗体空闲时不停的更新。如果完全是被动更新则不存在需要更新而系统不知道的情况。
关于SwapBuffer我已经说过了,不会影响前台的窗口。
Top




