(转)gLFlush()和gLFinish()
笔者初使用OpenGL之时,所遇到的命令不能生效的问题:比如开始想用gLClearColor来设置背景色为红色,结果执行后背景还是默认的黑色。后来查阅资料,才知道这与OpenGL的指令执行流程有关,要让设置的绘制效果实现,需要用到glFlush()或glFinish()函数。
OpenGL是用一条渲染管线线性处理命令的,它的绘图机制是:先用 OpenGL 的绘图上下文 Rendering Context (简称为 RC )把图画好,再把所绘结果通过 SwapBuffer() 函数传给 Window 的 绘图上下文 Device Context (简记为 DC)。要注意的是,程序运行过程中,可以有多个 DC,但只能有一个 RC。因此当一个 DC 画完图后,要立即释放 RC,以便其它的 DC 也使用。(转自http://blog.sina.com.cn/s/blog_4e6f376d0100c0o2.html)
回到开头那个问题,一般来说,我们提交给OpenGL的绘图指令(比如设置背景色)并不是马上送给图形硬件执行,而是放到一个缓冲区里面,等待缓冲区满了再将这些指令送给图形硬件执行,所以只写了短短的几条设置背景色之类的指令是无法填满缓冲区的,自然这些指令不能马上执行以达到所需要的效果了。因此每次在写完绘图代码需要让其完成效果时我们需要在代码后面添加glFlush()或gLFinish()函数:(1)gLFlush()作用是将缓冲区中的指令(无论是否为满)立刻送给图形硬件执行,发送完立即返回;(2)glFinish()作用也是将缓冲区中的指令(无论是否为满)立刻送给图形硬件执行,但是要等待图形硬件执行完这些指令才返回。