OpenGL中的上下文(Context)
OpenGL状态机与上下文
OpenGL是一个状态机,它拥有非常多的状态变量,并且每个状态变量都有默认值。
OpenGL在渲染的时候需要一个Context来记录了OpenGL渲染需要的所有信息和状态,可以把它理解成一个大的结构体,它里面记录了当前绘制使用的颜色、是否有光照计算以及开启的光源等非常多我们使用OpenGL函数调用设置的状态和状态属性。
在程序中,我们设置的各种状态和默认状态会一直生效,直到我们再次修改它们。状态机并不是一个好的设计,多个绘制算法同时跑,容易被前面的状态所影响,OpenGL为了向前兼容,状态机的形式就被一直延续下来了。
GPU的CS模式和上下文
如上所述,OpenGL的一组状态机对应着一个上下文。OpenGL采用了Client-Server模式,GPU相当于一台服务器,可对应多个客户端即上下文,一个客户端维护着一组状态机。大部分的OpenGL命令都是异步的,不代表真正地执行,只是客户端向服务器发送了一些命令(同时有一些API可实现同步功能)。如果两个窗口分别对应两个不同的绘制上下文,则两个窗口彼此状态独立,绘制状态不会互相影响,宏观上看绘制也是并行的。
线程私有
OpenGL的绘制命令都是作用在当前的Context上,这个Current Context是一个线程私有(thread-local)的变量,也就是说如果我们在线程中绘制,那么需要为该线程制定一个Current Context的,当多个线程参