您的位置:首页 > 运维架构

文章标题

2016-03-31 22:16 211 查看

OpenGL Context讨论

翻译自wiki

一个OpenGL context 代表了很多东西,其存储了当前连接着的openGL的实例的所有状态。它最重要的一点是它管理着默认的帧缓存(frame buffer)——唯一会将其上绘制内容显示的帧缓存。可以将context想象成一个维护openGL的东西,假如context毁了,openGL也会退出。
Context是寄生在进程中的,一个进程可以同时拥有多个Context,这就意味着会有多个openGL。这个技术可以实现在一个进程窗口中又有多个“窗口”一样。
Context之间可以共享很多openGL的资源,例如贴图纹理,缓冲对象以及program object。这些资源的共享必须很清晰,无论是已经创建的context,还是即将创建的context。然而,context并不是必须要共享资源,其完全可以维护自己的一份资源。
所有的openGL命令都是针对“当前”的context的。一个线程可以有多个context,但只能有一个“当前”context。而多个线程之间的“当前”context,不能是同一个。一个进程中又可以有多个线程。


零碎的资料

context要绑定到一个窗口,就需要设置context的像素类型。而这个像素类型是通过系统查询获得的,可以发送一个自己希望的像素格式给系统,然后系统告诉你可以用你设置的像素格式或者给你一个与你期望的比较相近的像素格式。用户只能用系统返回的这个像素格式来设置context像素类型,否则会出错。(返回的像素格式是像素的ID)

要对openGL实现多线程来渲染同一个画面,就需要将context中需要多线程辅助渲染的对象设置成共享对象,各个线程有自己的“当前”context,这些context上都共享着相同的资源,这样就可以实现多线程。

openGL可以保证命令按照发送顺序执行。但是没有保证不同context之间命令的执行顺序。

一个“当前”的context必须和一个dc连接,但是context连接的dc不一定是最初连接的那个,可以随时更改,只要满足context最初绘图的设备还有像素格式相同即可。

-

GDI,openGL,DirectX关系

三者都是图形API。都是帮助系统管理绘图的一系列接口。只是三者性能,还有接口实现等有些区别。


openGL context,Device context

这里先约定openGL context简称为oc,device context简称我dc。虽然两者都是上下文,但是两者负责的内容有很大区别。
dc是windows定义的,用来记录绘图目标的属性以及物理信息。包括绘图区域的像素格式,颜色,画笔,一张位图存放的内存位置等等。可以将其理解为“一张画布”。一个窗口程序的不同区域,例如用户区,非用户区等等都有自己的“画布”。
而oc是记录openGL自己的属性的,前面已经有说,不再赘述。
oc依赖于dc,在不使用openGL绘图时。可以使用GDI来绘图。GDI绘图是通过获得dc的属性,才能正确地安排GDI的参数。也就是说,要在窗口上绘图,就需要知道这个窗口的属性,而这些属性都记录在dc中。将一个oc连接到dc上意味着openGL也可以获得窗口的属性,从而方便openGL安排它的绘图命令的参数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  openGL