OpenGL不是一种编程语言,它是一种图形API,它更像一种规范。(Khronos组织制定并维护的规范),这种规范严格规定了每个函数该如何执行,以及输出应该是什么,而具体实现过程则由使用此规范(API)的开发者自行决定。实现者通常是显卡开发商。(因而显卡bug出现时,通常可以通过更新显卡驱动来排除故障)
二.核心渲染模式与立即渲染模式早期OpenGL采用立即渲染模式(Immediate mode,即立即渲染管线),绘图方便。OpenGL的大多数功能被库隐藏,开发者少有控制其具体如何计算的自由。而开发者渴望运算的灵活性,因而规范愈发灵活,开发者可以更好掌握细节。立即渲染容易理解,但效率太低,自3.2版本开始,规范文档废弃立即渲染模式,鼓励开发者在OpenGL的核心模式(Core-profile)下进行开发,这一分支完全移除了旧的特性。核心模式下,我们将无法使用旧的(立即渲染模式下的)函数,必须使用现代函数,否则会抛出错误并终止绘图。现代函数的优势在于灵活性和效率。立即渲染模式从OpenGL实际运作中抽象掉了很多细节,因而虽然易于学习,却难以让人把握OpenGL究竟如何运作。现代函数要求使用者真正理解OpenGL和图形编程,难度与灵活性,效率并存。3.3及以上版本,均在3.3的基础之上引入额外功能,没有改动核心架构,因而3.3是最适合学习的版本。三.拓展OpenGL一大特性为对扩展的支持。新的优化通常会以扩展的形式在驱动中实现。使用扩展的代码通常如下if(GL_ARB_extension_name){ // 使用硬件支持的全新的现代特性}else{ // 不支持此扩展: 用旧的方式去做}本版本3.3,本套教程中很少会用到拓展实现功能。四.状态机(笔者学过虚幻引擎入门教程。虚幻引擎的动画系统就是一个以状态机为基础的系统)OpenGL自身就是一个巨大的状态机,即和动画系统一样,是通过一系列变量描述任意时刻OpenGL该如何运行的系统。OpenGL的状态通常被称为OpenGL上下文(Context)。通常使用如下途径更改OpenGL状态:设置选项,操作缓冲。最后我们使用OpenGL上下文完成渲染。例如我们告诉OpenGL画线段而非三角形,我们通过改变一些上下文变量来改变OpenGL状态,从而控制绘图。一旦改变了OpenGL状态为线段,下一个绘制命令就会画出线段而非三角形。使用OpenGL时,会遇到一些状态设置函数(state-changing-function),这些函数将会改变上下文。我们还会遇到一些状态使用函数(state-using-function),这类函数会根据当前OpenGL状态执行一些操作。重点在于其状态机的本质。五.对象OpenGL库是C语言实现的,同时也支持多种语言派生,但内核仍是一个C库。C语言的一些语言结构不易被翻译到其他高级语言,因而OpenGL开发的时候引入了一些抽象层。如“对象(Object)”Object是指一些选项的集合,代表OpenGL状态的一个子集。如可以用一个对象代表绘图窗口的设置,之后可以设置它的大小,支持的颜色位数等,可以将对象看成一个C风格的结构体。struct object_name{float option1;int option2;char[] name;};使用OpenGL的基本类型而不是C类型的好处是能保证在不同平台运行时,各种类型的大小是统一的。将上下文看成一个大结构体,那么在这个上下文结构体中使用对象Object,看起来就是这样的:struct OpenGL_Context{…object* object_Window_Target;…};OpenGL今后开发中常见的工作流:// 创建对象unsigned int objectId = 0;glGenObject(1, &objectId);// 绑定对象至上下文glBindObject(GL_WINDOW_TARGET, objectId);// 设置当前绑定到 GL_WINDOW_TARGET 的对象的一些选项glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_WIDTH, 800);glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_HEIGHT, 600);// 将上下文对象设回默认glBindObject(GL_WINDOW_TARGET, 0);首先创建一个对象,然后用一个id保存它的引用(实际数据存储在后台)。然后将对象绑定到上下文的目标位置。(其实就是一个属性列表里的具体某个属性)接下来设置窗口选项,最后将目标位置的对象id设为0(也就是解绑了这个对象)设置的选项将被保存在objectId所引用的对象中(后台数据没变)。一旦重新绑定这个对象到GL_WINDOW_TARGET位置,选项就会生效(引用依旧对应着之前设定的值,只在于是否被绑定到上下文,才会是否生效)使用对象的好处在于,在程序中可以定义不止一个对象,并设置不止一套选项,每个对象可以有不同的设置。在执行一个用到OpenGL状态的操作时,只需要绑定对应的对象即可。拥有数个这样的对象允许我们指定多个模型,在需要绘制某一个的时候,只需绑定对应对象即可。六.绘制第一个窗口