学习OpenGL是学习计算机图形学的一个工具,因为计算机上图形的显示要依靠底层的软件和硬件,学习图形学除了学习基本的概念,线,曲面,图形生成,变换,渲染这些,做三维的图形图像显示时,从操作系统和驱动这一底层设计起显然费时不切实际,所以我们需要一套高级的图形接口。

我们可以认为 Opengl 就是这样的一个 API,OpenGL 有多种语言绑定,但是最终地最底层是一个 C 语言的 API接口。这组 API由一些 typedef,#define 和enumerator 值和函数(function)组成,typedef 定义了 GL 的基本类型,如 GLint,GLfloat。但是复杂的类型如结构没有直接在 OpenGL 显示出来。

在 C++中,如果一个对象包括一个整数,一个浮点数和一个字符串时,一般你会这样创建并读取它们:

struct Object{
    int count;
    float opacity;
    char *name
};

Object newObject;

newObject.count = 5;
newObject.opacity = 0.4f;
newObject.name = "some string";

在 OpenGL 中,一般你会这样用 API:

GLuint objectName;
glGenObject(1, &objectName);

glBindObject(GL_MODIFY, objectName);
glObjectParameteri(GL_MODIFY, GL_OBJECT_COUNT, 5);
glObjectParameterf(GL_MODIFY, GL_OBJECT_OPACITY, 0.4f);
glObjectParameters(GL_MODIFY, GL_OBJECT_NAME, "Some String");

:以上只是一个例子说明API 的接口对象有什么不同,不是真实的 OpenGL 函数。

OpenGL 规范

从技术的意义上来说,OpenGL 不是一个 API,而是一种规范,一个文件。我们所说的 C API 只是它的一个实现。规范定义了 OpenGL 的初始状态,什么样的函数不改变他的状态,调用渲染的函数时会发生什么这些。

这个规范是 OpenGL Architectural Review Board(ARB)写的,这个组织由 Apple,Nvidia,AMD(ATI part)等公司的人员组成,这个组织,也是 Khronos Group 的一部分。这个是复杂而且十分技术性的,当然你也可以去阅读他,需要注意的是,这个规范只规定了结果,而不是实现过程,是面对用户来说的,不论硬件的供应商如何实现 OpenGL,用户应该不能分辨出不同。所以说,尽管 ARB 组织管理着 OpenGL 规范,但不控制 OpenGL 的代码,在一个硬件上如何用代码实现是由供应商的开发者决定的。OpenGL 在不同的操作系统上实现也不相同,在 Windows 上,这些实现是由硬件制造商实际控制的,但在 Mac OSX 上大部分由 Apple实现,硬件供应商开发内部的驱动,Linux 上则更为复杂。。。(如 Mesa 3D 就是 OpenGL 的开源软件实现)总的来说,OpenGL 实现由软件操作系统和硬件制造商共同协商实现。

OpenGL 版本

OpenGl 的实现有很多版本(最新的是4.4),我们不需要对所有版本都熟悉,应该从尽可能新的版本学起。OpenGL 的版本不像 Direct3D 版本,会更改大部分 API,OpenGL 大多向下兼容,但是到了 OpenGL 3.0以后,随着图形卡的架构发展,OpenGL的结构也发生了很大改变(可编程着色器),v3.1后移除了很大一部分函数,去除了大部分固定管线的内容,所以如果再有书上或教程上从固定管线讲起,那么它一定是过时的了。所以现在的 OpenGl分为两个部分(或者称为 profiles):core 和 compatibility,compatibility 部分仍让向后兼容。

OpenGL Framework

OpenGL 是比较底层的 API,有利于我们学习计算机图形学,但是利用这些接口做出可与操作系统交互的程序,或者简化我们编程时的工作量,我们需要一些框架工具,当然以 OpenGL 为核心的框架很多,都包括基本的和不同的操作系统窗口交互,创建上下文,加载 OpenGL 函数直至面向对象的框架。这些可以称为 OpenGL 的 SDK ,其中包括了很多的 Framework,详细资料可以查看 OpenGL 的官方网站。这些可以由简单或由底层到面向对象几个层次。

  1. OpenGL 初始化工具:建立 OpenGL 上下文经常需要平台相关的一些代码去创建窗口,然后加载 OpenGL 函数,这些工具大大简化了这些过程,并提供跨平台的解决方案
  2. 上下文/窗口工具
simple window“multimedia library”widget toolkits
freeglut Allegro version 5 FLTK
GLFW SDL Qt
GLUT SFML wxWigets
  • OpenGL 加载函数

GlEW和 gl3w(主要集中与 OpenGL3/4 Core )

  1. 实用工具:不非常依赖 OpenGL,但是在开发 OpenGL 工具时十分有用。
  • 图像和纹理库
    DevIL
    FreeImage
    SOIL
    GLI
    glraw

  • 数学库

GLM 和 TVMet

  1. 利用 OpenGL 开发的面向程序接口或者引擎,便于3D 图形绘制。

Open Inventor,Oger3D,ClanLib 等。

在初学 OpenGL 时,一般我们会用到 freeglut(相对简单)、GLFW、GLEW 这几个框架,配合 QT 开发图形界面,或者用 SDL 做一些简单的应用

很多书上都把 OpenGL 的 API 接口定义为一种状态机模型,(不过我在比较新的 OpenGL 编程模型学习中觉得这一个观点已经过时了,但是这一句话估计在有关 OpenGL 的书上很常见,而且 OpenGL 又是向后兼容了,称为状态机模型不能说错)。所以会经常见到 OpenGL context(上下文)这一术语,context 不能简单地概括,从以后的学习我们可以了解。

原文链接:http://foryo24.farbox.com/post/opengl