OpenGL是一个底层图形库规范。它为程序员提供了一个小的几何图元(点、线、多边形、图片和位图)库和一个支持2D/3D几何对象绘图命令库,经过所提供的图元和命令来控制对象的呈现(绘图)。html
因为OpenGL的绘图命令仅限于画一些简单的几何图元(如点、线和多边形),因此OpenGL实用工具包(GLUT)应运而生,它可以帮助绘画出更复杂的三维对象(好比球体、圆环甚至茶壶)。若是你要构建须要利用到OpenGL所有特性的应用的话,GLUT未必适合,可是对刚学习OpenGL的人来讲GLUT就很是有用。程序员
GLUT是为知足windows系统下OpenGL程序独立编程接口的需求而设计的,接口被设计的很是简单而又实用。从OpenGL中移除windows系统的操做是一个很是英明的决定,由于这意味着OpenGL图形系统可以被应用于更普遍的系统中(包括功能强大但昂贵的图形工做站以及须要大量图形运算的视频游戏、互动电视机机顶盒和我的电脑)。编程
GLUT简化了用OpenGL进行渲染的程序的实现。GLUT应用编程接口(API)只须要调用不多的接口就能够用OpenGL来渲染图形场景,而且GLUT接口所需的参数也相对较少。windows
渲染管线数组
大多数OpenGL实现都有着相似的操做顺序,这一系列的操做过程叫作OpenGL渲染管线。尽管OpenGL并不严格要求须要按照渲染管线这一顺序来实现,可是这样作能够为预测OpenGL下一步将要作什么提供可靠的指引。几何数据(点、线、多边形)将会沿着一条依次经过求值器、顶点操做和装配阶段的路径进行传递,而像素数据(像素,图形,位图)将会沿着另外一条路径传递,在最终像素写入帧缓冲区前,像素数据和几何数据都会经历相同的最后一步——栅格化处理。缓存
Display Lists: 全部数据,不管是用来描述几何体仍是像素的,均可以保存在一个display list中来在当下或未来使用(用以替代display list的用法是在须要时当即处理数据——称为当即模式)当一个display list被触发时,保存的数据就像当即模式同样被发送至显示器。函数
Evaluators: 全部几何原语最终都是由顶点描述的,但evaluator提供了一种用控制点表示面的方法。这种方法是拟合多项式,能够经过控制点提供面法线、颜色、和空间纹理坐标。工具
基于顶点和图元的装配:对于顶点的数据,下一步就是将它们转换成图元。某些类型的顶点数据被转换为4x4的浮点型矩阵。空间坐标从三维世界中的一个位置被投影到您显示屏上的一个位置。在某些情形中,这一步以后会进行透视除法,利用它可以使远处的几何物体看起来比近处的物体小。而后,咱们再对数据进行视口和景深的操做。至此,咱们获得的结果是几何图元,这些图元与相关的颜色值和景深值,以及光栅化步骤的指标等一同进行转换。学习
像素操做:在几何数据经过OpenGL渲染管线的一条路径的同时,像素数据则经过了另一条路径。系统内存中的一个数组中的像素首先被解压,从若干格式中的一种转换成拥有恰当数目的份量的那种。而后,咱们对数据进行尺度放缩,偏移,再根据像素映射处理,随后这些结果被发送至光栅化步骤。lua
光栅化:光栅化是指将几何数据和像素数据都转换成片断的过程。各方形片断对应帧缓存中的一个像素。当顶点被链接起来造成直线,或者计算填充的多边形的内部像素时,直线的宽度,点的大小,着色模型,以及用以支持抗锯齿的覆盖计算等都被考虑在内。颜色值和深度值被赋予各方形片断。而后,处理后的片断被存入合适的缓存中,在那里,它最终被转化成一个像素,从而完成了它的最终使命。
OpenGL提供了一组强大但原始的渲染命令,并且全部的高层绘制都必须经过这些命令来完成。有若干库文件可以简化您的编程任务,包括:
包含文件
对于全部OpenGL应用程序,你都须要在全部文件中包含gl.h。几乎全部OpenGL应用程序使用GLU,即上文提到的OpenGL实用库(OpenGL Utility Library),它也须要包含gl.h才能使用。因此几乎全部OpenGL源文件这样开头:
1
2
|
#include <GL/gl.h>
#include <GL/glu.h>
|
若是你用OpenGL 实用工具集(OpenGL Utility Toolkit,即GLUT)来管理窗体事务,你须要包含:
1
|
#include <GL/glut.h>
|
记住glut.h保证会正确包含gl.h和glut.h,因此把三个文件全包含是画蛇添足。为使你的GLUT程序通用性更佳,包含glut.h而 不要明确包含gl.h或glu.h。
Makefile:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
# insert the name of your source file here (omit the .c)
TARGET = progname
LIBS = -lglut -lGLU -lGL -lXmu -lXext -lXi -lX11 -lm
CC = /usr/gnu/bin/gcc
default
: $(TARGET)
all:
default
.c.o:
$(CC) -c $<
$(TARGET): $$@.o
$(CC) $@.o -Wall $(LIBS) -o $@
clean:
-rm -f *.o $(TARGET)
|