RC与DC的介绍与使用
OpenGL的绘图方式与Windows一般的绘图方式是不同的。主要区别如下:
1、Windows采用的是GDI绘图
2、OpenGL采用的是渲染描述表RC绘图。
3、OpenGL使用的是特殊的像素格式。
在Windows中使用GDI绘图时必须指定在哪个设备环境DC中绘制,同同样的在使用OpenGL函数时也必须指定一个所谓的渲染环境。正如DC要存储GDI的绘制环境信息如笔,刷和字体等,RC也必须保存OpenGL所需的渲染信息如像素格式等。
渲染环境主要由以下六个wgl函数来管理:1、HGLRC wglCreateContext( HDC hdc )
该函数用来创建一个OpenGL可用的渲染环境。hdc必须是一个合法的支持至少16位色的屏幕设备描述表DC或内存设备描述表的句柄。该函数在调用前,设备描述表必须设置好适当的像素格式。成功创建渲染描述表之后,hdc可以释放或删除。函数返回NULL值表示失败,否则返回值为渲染上下文的句柄。
2、BOOL wglDeleteContex( HGLRC hglrc )
该函数删除一个RC,一般应用程序在删除RC之前,应使它成为非现行RC,不过,删除一个现行RC也是可以得。此时,OpenGL系统冲掉等待的绘图命令并使之成为非现行RC,后删除之。注意:删除一个属于别的线程的RC时会导致失败。
3、HGLRC wglGetCurrentcontext( void )
该函数返回线程的现行RC,如果线程无现行RC则返回NULL
4、HDC wglGetCurrentDC( void )
该函数返回与线程现行RC关联的DC,如果线程无现行RC则返回NULL。
5、BOOL wglMakeCurrent( HDC hdc, HGLRC hglrc )
该函数把hdc和hglrc关联起来,并使hglrc成为调用线程的现行RC,如果传给hglrc的值为NULL,则函数解除关联,并置线程的现行RC为非现行RC,测试忽略hdc参数。
注意:传给该函数的hdc可以不是调用wglCreateContext时使用的值,但是,他们所关联的设备必须相同并且拥有相同的像素格式。一个RC可以由几个现行RC,这是针对调用线程而言的。一个线程在拥有现行RC进行绘图时,别的现场将无法同时绘图。一个线程一次只能拥有一个现行的RC,但是可以拥有多个RC;一个RC也可以由多个线程共享,但是他每次只能在一个线程中试现行RC。在使用RC时,不应该释放或者删除与之关联的DC。如果应用程序在整个生命期内保持一个现行RC,则应用程序也一直占有一个DC资源。Windows系统只有有限的DC资源。
管理RC与DC两种方法
1、在WM_CREATE消息响应时创建RC,创建后立即释放DC;当WM_PAINT消息到来时,程序再获取DC句柄,并与RC关联起来,绘图完成后,立即解除RC与DC得关联并释放DC;当WM_DESTROY消息到来时,程序只需简单的删除RC。
2、RC在程序开始时创建并使之成为现行RC。它将保持为现行RC直至程序结束。相应的,GETDC在程序开始调用,RELEASEDC在程序结束时才调用。此中方法的好处是在相应WM_PAINT消息时,无需调用十分耗时的wglMakeCurrent函数。一般它要消耗几千个时钟周期。
RC与DC的关系在WINDOWS下,使用GDI(图形设备接口)开发应用程序时,首先需要获得一个Device Context(设备描述表,简称DC),然后才能在这个DC下完成绘图工作,这一过程就类似于现实生活中纸和笔的关系,DC就是纸,而象刷子、画笔这样 的GDI对象就是笔。从Windows内部运行机制来分析,DC应该理解为状态保持器,就是它可以而且必须保存当前系统的状态,这些状态包括:当前的画 笔、刷子等GDI的具体类型(颜色、粗细等),当前的调色板类型以及系统的其他信息。当用户开始在DC上进行绘制工作时,系统就会先查看DC中相应的当前 状态值,然后利用这些状态值进行图形绘制,假如希望改变当前状态值,那么可以通过SelectObject这样的Win32函数来将指定的状态或者对 象选入DC即可。实际上基于OpenGL的应用程序也是这样的,只是这里不是直接在DC上进行绘制工作,而是通过Render Context(渲染描述表或者绘制描述表,简称为RC)这样一个桥梁在DC上进行绘制工作,对于程序来说实际上可以理解为就是在RC上绘制图形。另外只 要RC不被释放(有效),那么就可以进行绘制工作;相比之下,DC却需要不断的创建和释放。所以要使用OpenGL图形库进行图形应用开发,首先要获得RC,然后要将其设置为”当前RC”,最后后面所有的绘制工作都是在”当前RC”下面进行的,直到”当前RC”无效为止。
管理DC与RC的两种方法:
法一
法二