一、什么是OpenGL
OpenGL是一个图形API,包含了一系列的可以操作图形、图像的函数。它并不是一个独立的平台,需要使用一个编程语言来工作,最常见的就是使用C++。然而,更严格的定义来讲,OpenGL应该是指一套规范。
二、OpenGL的一些基础概念
1、核心模式与立即渲染模式
早期的OpenGL使用的是立即渲染模式(固定渲染管线),OpenGL的大多数功能都被库隐藏起来,基于OpenGL的开发者很难去控制计算的自由。虽然在立即渲染模式下,图形的绘制很方便。
但是从3.2版本开始,就开始废弃立即渲染模式了,推出了核心模式,这个模式完全移除了旧的特性。
当使用OpenGL的核心模式时,OpenGL迫使开发者去使用现代函数。虽有难度,但更灵活,效率更高,更重要的是可以更深入的理解图形编程。
2、扩展
OpenGL的一个比较重要的特性就是对扩展的支持。 当一个显卡公司提出一个新特性或者渲染上的大优化,通常会以扩展的方式在驱动中实现。
3、状态机
OpenGL本身就是一个巨大的状态机:一系列的变量描述此时的OpenGL如何运行。其状态通常被称为上下文(context)。一般使用设置选项、操作缓冲来更改OpenGL的状态。最后使用当前的OpenGL上下文来渲染。
4、对象
OpenGL是用C语言编写的,同时支持多语言的派生,但内核仍然是C库。由于C语言不容易被翻译到其它高级语言,因此OpenGL开发过程中,引入了一个抽象层。“对象”就是其中一个。在OpenGL中的对象指的是一些选项的集合,代表OpenGL状态的一个子集。可以把对象看作是一个C风格的结构体(struct),如下代码块所示:
1 struct object_name{ 2 GLfloat option1; 3 GLuint option2; 4 GLchar[] name; 5 };
特别注意:基元类型
使用OpenGL时,建议使用OpenGL定义的基元类型。比如使用float时我们加上前缀GL(因此写作GLfloat)。int、uint、char、bool等等也类似。OpenGL定义的这些GL基元类型的内存布局是与平台无关的,而int等基元类型在不同操作系统上可能有不同 的内存布局。使用GL基元类型可以保证你的程序在不同的平台上工作一致。
当我们使用一个对象时,大致如下:
1 // OpenGL的状态 2 struct OpenGL_Context { 3 ... 4 object* object_Window_Target; 5 ... 6 };
OpenGL常见的工作流:
1 // 创建对象 2 GLuint objectId = 0; 3 glGenObject(1, &objectId); 4 5 // 绑定对象至上下文 6 glBindObject(GL_WINDOW_TARGET, objectId); 7 8 // 设置当前绑定到 GL_WINDOW_TARGET 的对象的一些选项 9 glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_WIDTH, 800); 10 glSetObjectOption(GL_WINDOW_TARGET, GL_OPTION_WINDOW_HEIGHT, 600); 11 12 // 将上下文对象设回默认 13 glBindObject(GL_WINDOW_TARGET, 0);
使用对象的一个好处就是,在程序中不止可以定义一个对象,并设置它们的选项,每个对象都可以是不同的选项。 执行一个使用OpenGL状态的操作的时候,只需要绑定含有需要的设置的对象即可。