OpenGL简介
OpenGL是一种应用程序编程接口(Application Programming Interface,API)它是一种可以对图形硬件设备特征进行访问的软件库。
在OpenGL 3.0以前的版本或者使用兼容模式的OpenGL环境,OpenGL包含一个固定管线(fixed-function pipeline),它可以在不使用着色器的环境下处理几何与像素数据。我们看到的glBegin()、glRectf()以及glEnd()这些函数都是以前固定管线模式中所使用的API函数。
从3.1版本开始,固定管线从核心模式中去除,因此我们必须使用着色器来完成工作。现代OpenGL渲染管线严重依赖着色器来处理传入的数据,我们一般会使用GLSL(OpenGL Shading Language)编写着色器程序,GLSL语法类似于C语言,GLSL编译以后运行在GPU端。
OpenGL的可编程管线包含如下过程(下图来自OpenGL红宝书《OpenGL Programming Guide》第八版):
可以看到从开始的顶点数据到最后在界面上的显示需要经过很多过程,这里我比较重要的是和必经的阶段包括Vertex Shader(顶点着色阶段)、Rasterization(光栅化阶段)和Frgament Shader(片元着色阶段)。
下面的图详细说明了这几个几段内部图形的处理与变化《摘自https://open.gl/drawing》:
顶点着色阶段将接受你在顶点缓存对象中给出的顶点数据,独立处理每个顶点。这个阶段对于所有的OpenGL程序都是必需的,而且必需绑定一个着色器。
光栅化就是把顶点数据转换为片元的过程。片元中的每一个元素对应于帧缓冲区中的一个像素。
片元着色阶段会处理OpenGL光栅化之后生成的独立片元,并且这个阶段也必需绑定一个着色器。
总结一下:
一个用来渲染图像的OpenGL程序需要执行的主要操作如下:
1. 从OpenGL的几何图元中设置数据,用于构建形状。
2. 使用不同的着色器(shader)对输入的图元数据执行计算操作,判断它们的位置、颜色,以及其他渲染属性。
3. 将输入图元的数学描述转化为与屏幕位置对应的像素片元(fragment)。这一步也称为光栅化(rasterization)。
4. 最后,针对光栅化过程产生的每个片元,执行片元着色器(fragment shader),从而决定这个片元的最终颜色和位置。
5. 如果有必要,还需要对每个片元执行一些额外的操作,例如判断片元对应的对象是否可见,或者将片元的颜色与当前屏幕位置的颜色进行融合。
OpenGL开发环境搭建
说了OpenGL的基本原理,下面来看看开发现代OpenGL程序需要准备的前期开发环境。
在我的上篇博文《OpenGL+Visual Studio 2010开发环境搭建 》中提到:
OpenGL主要由以下库函数组成:
OpenGL核心库:包含115个最基本的命令函数,它们都是以”gl“为前缀,可以在任何OpenGL的工作平台上应用。这部分函数用于常规的、核心的图形处理。
OpenGL实用库函数:包含43个函数,以”glu“作为前缀,在任何OpenGL平台上都可以应用。这部分函数通过调用核心库的函数来实现一些复杂的操作。
OpenGL辅助库函数:OpenGL Utility Toolkit (GLUT)包含31个函数,以”aux“作为前缀,但它们不能在所有的OpenGL平台上使用。OpenGL的辅助库函数主要用于窗口管理、输入输出处理以及绘制一些简单的三维形体。
其实GLUT主要用于窗口管理、输入输出处理以及绘制一些简单的三维形体。而且GLUT不是开源的,所以现在有很多GLUT的替代库,比如GLUT的开源版本Freeglut和OpenGLUT。在https://open.gl/context这个教程中,作者提到了三个用于取代GLUT的第三方库:SFML、SDL、GFLW有兴趣的朋友可以自己Google一下这些库。由于SFML(Simple and Fast Multimedia Library)是使用C++编写的,我本人比较喜欢使用C++而非C语言,所以下面的示例程序会使用SFML库。
此外,还需要介绍一个库GLEW(OpenGL Extension Wrangler)。GLEW是一个跨平台的C&#