OpenGL入门(1)

来源:互联网 发布:大芬油画村 知乎 编辑:程序博客网 时间:2024/04/30 13:38

注:本文用全角括号“()”表示转义或注释,原括号用途全部使用半角括号“()”。

步入新阶段,开发方向从Computer Vision转向了图形处理,需要学习OpenGL相关的开发技术。在Mentor的建议下,我采用了经典的“红宝书”(以下称Redbook)——OpenGL编程指南(原书OpenGL Programming Guide,作者Dave Shreiner)作为学习指导书。在OpenGL入门系列里,我准备根据书中的一些要点结合例程写一些自己的体会分享。

Redbook在一开始便提到,“OpenGL(Open Graphics Library,GL图形库)图形系统是图形硬件的一个软件接口”,首先OpenGL是基于图形硬件的,如nvidia或amd的GPU,其次是一个软件接口,使得我们可以通过软件程序调用接口函数,实现精彩的图形呈现。书中还提到,“OpenGL实际上是一种独立于硬件的程序接口规范。在一种特定类型的硬件上,所使用的是它的一种特定实现”。这句话我理解的意思是,OpenGL本身是一种平台无关的抽象的接口规范,在不同情况下有不同的实现,在基于特定硬件时有针对性的具体实现。

在第1章中,Redbook提到了几个需要掌握的概念和观点:OpenGL程序的基本结构、函数的语法、OpenGL渲染管线的操作序列、渲染复杂性、OpenGL是一个状态机、OpenGL渲染管线、GLUT(GL Utility Toolkit)。

1.1 什么是OpenGL

OpenGL是一种“流线型”接口规范。为了能在不同硬件平台上实现,OpenGL并不包含用于执行窗口任务或者获取用户输入之类的函数;需要通过窗口系统来控制程序所使用的特定硬件。OpenGL的程序中,通过基本几何图元(如点、直线和多边形)来创建需要的复杂物体模型。

Redbook通过列举一系列封面彩图为例子介绍OpenGL渲染的流程。例子用线框模型(wireframe model)显示场景,使用大气效果(合称为“雾”)加入了深度提示(depth-cue),加入抗锯齿(antialiased)效果,分别进行单调着色(flat-shading)和平滑着色(smoth-shading),在场景上添加阴影(shadow)和纹理(texture)效果,其中纹理贴图(texture mapping)可以将一幅2D图像投射到一个3D物体上,随后还添加了运动模糊(motion-blurred)、展示角度转换、景深效果(depth-of-field effect)等高级效果。这是一个具体的例子,我们可以从中总结出OpenGL对场景中图像进行渲染时的主要图形操作:

(1). 根据几何图元创建形状,建立物体的数学描述;

(2). 在3D空间中排列物体,选择视角;

(3). 计算颜色;

(4). 把物体的数学描述和物体相关颜色信息转换为屏幕上的像素,即光栅化(rasterization)。

在有些OpenGL实现中,显示所创建的图形的计算机和运行图形程序的计算机可以不同,运行图形程序并发出绘图命令的计算机称为客户机(client),接收这些命令并执行绘图任务的计算机称为服务器(server)。客户机发给服务器的命令的传输格式(协议)总是相同的,因此OpenGL程序可以通过网络运行。

OpenGL一系列相关的处理阶段叫做OpenGL渲染管线(pipeline)。管线分为固定管线(fix pipeline)和可编程管线(programmable pipeline)。当你使用固定管线时,可以设置OpenGL的各种状态并使得一直生效直到再次修改。因此,OpenGL实际上是一个状态机。而如果使用可编程管线的着色器(shader),根据不同版本,shader所能识别的状态的数量也不同。

1.2 OpenGL相关库函数

GLU:工具函数库,函数前缀glu
GLX:使用X窗口系统的扩展,函数前缀glX
-WGL:MS Windows系统的扩展接口,函数前缀wgl
-AGL:Mac OS系统的扩展接口,函数前缀agl
-CGL:Mac OS系统的扩展接口,函数前缀cgl

1.2.1 包含文件

OpenGL
#include <GL/gl.h>(一般放在系统头文件包含目录中,比如UNIX中放在/usr/include/)
提供操作系统和窗口系统
#include <GL/glu.h>
扩展
#include "glext.h"
窗口接口库
#include <X11/xlib.h>
#include <GL/glx.h>
Windows中包含如下获得对WGL函数的访问
#include <windows.h>
GLUT
#include <freeglut.h>(glut.h和freeglut.h都已经包含了gl.h和glu.h,还保证在包含gl.h和glu.h之前正确地定义了所有依赖操作系统的内部的宏)
OpenGL3.1
#include <GL3/gl3.h>
#include <GL3/gl3ext.h>