OpenGL是一种APl,不是语言
在极大程度上,OpenGL并不是一种编程语言,而是一种API(Application Programming Interface,应用程序编程接口)。每当我们说一个程序是以OpenGL为基础的或者说它是一个OpenGL应用程序时,其意思是指它是用某种编程语言(比如C或C++)编写的,在程序中调用了一个或几个OpenGL库。我们并不
是指这个程序专业地使用OpenGL进行绘图。它可能是结合了两个不同的图形软件包的各自最好的功能,或者它可能使用OpenGL来做一些特定的任务,同时使用特定环境的图形学(例如Windows GDI)来执行其他任务。当然,这种规则的唯一例外就是将要在第二部分中介绍到的OpenGL阴影法语言。
作为一种API,OpenGL库遵循了C的调用习惯。这就意味着,这种调用习惯的选择使得在多数其它语言中,直接调用OpenGL都是简单可行的。在本书中,例子的程序都是用C++编写的。除了很少的一些次要因素外,C++程序能够和C使用一样的方式很容易地进入C函数和API。C++是目前大多数应用程序编程所选择的语言。一些很基础的C++类也能极显著地简化大部分编程任务。我们迫切地希望把对象的使用保持到最小,没有模板、过载运算符、元之类的。
像VB这样的能调用C库文件中的函数的其它编程语言,也都能够使用OpenGL,而且OpenGL的汇集都可被很多其他编程语言利用。然而,超出这本书的范围之外,在其它语言中使用OpenGL会多少有点难以解释。为了使事情简单和轻便,我们坚持用C++来作为例子。
库和头文件标准
尽管OpenGL是一个“标准”程序库,这个库有很多种实现和版本。例如,在Microsoft窗口中,实际的Microsoft软件的实现是位于设置在Windows system目录下的动态链接库opengl32.dll里面的。在大多数平台上,OpenGL库是附属于OpenGL实用库(GLU)的。这个实用库在Windows中就是位于也设置在Windows system目录下的glu32.dll里面的。这个实用库是一套用于完成普通的(但有时很复杂的)工作的实用函数,例如特殊的矩阵计算,或者是给曲线和曲面的公共类型提供支持。在Mac OSX操作系统上,OpenGL和GLU的库文件都包含在OpenGL架构中。这种基于truncated class file翻译OSX操作系统的架构在很多方面跟Windows中的动态链接库都极为相似。
为了使用正确的OpenGL头文件和链接到正确的OpenGL库文件,安装编译工具的步骤随着
工具和工作平台的不同而不同。当这些工具的新版本发布时,这些安装步骤也会随之改变。假设如果你正在读一本有关于3D图形编程的书,那么在你对开发环境的准备当中,你已经知道了如何实际地编译程序,这种情况总是安全的。应当经常记录句子中的斜体字。由于这个原因,在源代码的分配中,都将要为Windows操作系统上的Visual Studio、 Mac OSX操作系统的X代码和Linux上一些通用的“制作”文件查预配置的工程。在必要的时候,你可以在我们的网站(/superbible)上,到一些更多的详细的自学材料来帮助你。
在所有的工作平台上,所有OpenGl函数、类型和宏的原型都(按照规定)被包含在头文件gl.h中。实用库函数的原型在另一个文件glu.h中。当你安装开发工具的时候,这些文件总是自动的安装设置在包含路径的一个特殊目录下。例如,下面的代码显示了一个使用了OpenGL的基础Windows程序的初始头文件包含:
#include<windows.h>
#include<gl/gl.h>
#include<gl/glu.h>
在苹果的OSX系统上,包含的文件可能是这样的:
#include <Carbon/Carbon.h>
#include <OpenGL/gl.h>
#include <OpenGL/glu.h>
API的规定
OpenGL是被一些聪明人设计的,他们具有设计图形编程API的丰富经验。他们对函数命名和变量声明的方式指定一些标准规则。API简单清晰,而且使厂商很容易对其进行扩展。OpenGL试着尽可能地避免策略。策略是指假定设计者知道程序员将如何使用API。策略的例子是假定你总是明确指定顶点数据是浮点数值,假定雾化总是在进行绘制前被启用,或者假定场景中的所有的对象都受到相同的光照参数的影响。进行这些类型的假定将会消除很多已经开发了很长时间的、流行的绘制技术。
这个基本定律已经对OpenGL的寿命和演变做出了贡献。然而,随着时间的推移,硬件的性
能及研发人员和硬件厂商的创造力有了所没有预料到的发展进步,这给已经发展了这些年的OpenGL带来了损失。尽管如此,OpenGL的基础API已经显示了在应对新的、未预料到的特点上惊人的复原能力。这种可以编译十年来几乎没有变化的源代码的能力,对于应用程序研发人员来说是实质性的有利因素,而且OpenGL几年来在尽可能不对旧代码产生影响的前提下,已经增加了新的特点。未来的OpenGL的版本将会针对低可塑性的和平均性的侧面,而这些侧面中一些旧的特征和模板最终可能会被放弃。
数据类型
为了使OpenGL代码从一个平台导入到另一个平台更加容易,OpenGL定义了它自己的数据类型。如果你愿意的话,这些数据类型将映射为常规的C/C++数据类型,你可以使用C/C++数据类型来代替它们。然而,不同的编译器和环境,对于不同的变量类型,都有它们各自的大小和内存安排的规则。通过使用OpenGL定义变量类型,你能从这些类型的变化中隔离出你的代码。
表2.1列出了OpenGL的数据类型、它们在大多数32位环境(Win32、OSX等)下相对应的C/C++数据类型以及字面上所用的合适的后缀。在本书中,我们对所有的字面值使用这些后
缀。在后面你将会看到这些后缀也用在很多(但不是全部)OpenGL的函数名称中。不管是机器大小或者是编译器的使用,其内部的表示在所有的平台(甚至是64位的 OSs)上都是一样的(只要你拥有一个合适的SDK!)。
表2.1 OpenGL变量类型及其相应的C数据类型
OpenGL数据类型 | 内部表示 | 定义为C类型 | C字面值后缀 |
GLbyte | 8位整数 | signed char | b |
GLshort | 16位整数 | short | s |
GLint,GLsizei | 32位整数 | long | l |
GLfloat,GLclampf | 32位浮点数 | float | f |
GLdouble,GLclampd | 64位浮点数 | double | d |
GLubyte,GLboolean | 8位无符号整数 | unsigned char | ub |
GLushort | 16位无符号整数 | unsigned short | us |
续表2.1
OpenGL数据类型 | 内部表示 | 定义为C类型 | C字面值后缀 |
GLuint,GLenum, GLbitfield | 32位无符号整数 | unsigned long | ui |
GLchar | 8位字符 | char | None |
GLsizeiptr,GLintptr | 本地指针 | ptrdiff_t | None |
所有数据类型都以表示openGL的GL作为开头。大多数后面跟的是它们相对应的C数据类型(byte, short, int, float等等)。有一些先有个u,以表示是一个无符号数据类型,比如 ubyte表示了一个无符号字节。为了方便起见,提供了更具描述性的名称,比如 size表示一个长度值或深度值。举个例子,GLsizei是一个openGL变量,它表示了一个用整数代表的尺寸参数。clamp暗指了一个被要求成为“clamped”、范围在0.0~1.0之内的变量。GLboolean变量用于表示真或假的条件,GLenum用于枚举变量,而GLbitfield是用于包含二进制位字段的变量。
这里没有对指针和数组提供任何特殊的考虑。一个由10个GLshort变量组成的数组只需声明为
GLshort shorts[10];
而由10个指向GLdouble变量的指针组成的数组则声明为
GLdouble *doubles[10];
一些其他的指针对象类型用于NURBS曲线和曲面。它们需要更多的说明,这将会在稍后的章节中涉及到。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论