本节书摘来自华章出版社《OpenGL编程指南》一书中的第1章,第1.1节,作者 Bill Licea-Kane ,更多章节内容可以访问云栖社区“华章计算机”公众号查看
1.1 什么是OpenGL
OpenGL是一种应用程序编程接口(Application Programming Interface, API),它是一种可以对图形硬件设备特性进行访问的软件库。OpenGL库的4.3版本(即本书所使用的版本)包含了超过500个不同的命令,可以用于设置所需的对象、图像和操作,以便开发交互式的3维计算机图形应用程序。
OpenGL被设计为一个现代化的、硬件无关的接口,因此我们可以在不考虑计算机操作系统或窗口系统的前提下,在多种不同的图形硬件系统上,或者完全通过软件的方式(如果当前系统没有图形硬件)实现OpenGL的接口。OpenGL自身并不包含任何执行窗口任务或者处理用户输入的函数。事实上,我们需要通过应用程序所运行的窗口系统提供的接口来执行这类操作。与此类似,OpenGL也没有提供任何用于表达3维物体模型,或者读取图像文件(例如JPEG文件)的操作。这个时候,我们需要通过一系列的几何图元(geometric primitive)(包括点、线、三角形以及Patch)来创建3维空间的物体。
OpenGL已经诞生了很长时间,它最早的1.0版本是在1994年7月发布的,通过Silicon的图形计算机系统开发出来。而到了今天已经发布了非常多的OpenGL版本,以及大量构建于OpenGL之上以简化应用程序开发过程的软件库。这些软件库大量用于视频游戏、科学可视化和医学软件的开发,或者只是用来显示图像。不过,如今OpenGL的版本与其早期的版本已经有很多显著的不同。本书将介绍如何使用最新的OpenGL版本来创建不同的应用程序。
一个用来渲染图像的OpenGL程序需要执行的主要操作如下所示。(1.4节将对这些操作进行详细解释。)
从OpenGL的几何图元中设置数据,用于构建形状。
使用不同的着色器(shader)对输入的图元数据执行计算操作,判断它们的位置、颜色,以及其他渲染属性。
将输入图元的数学描述转换为与屏幕位置对应的像素片元(fragment)。这一步也称作光栅化(rasterization)。
最后,针对光栅化过程产生的每个片元,执行片元着色器(fragment shader),从而决定这个片元的最终颜色和位置。
如果有必要,还需要对每个片元执行一些额外的操作,例如判断片元对应的对象是否可见,或者将片元的颜色与当前屏幕位置的颜色进行融合。
OpenGL是使用客户端-服务端的形式实现的,我们编写的应用程序可以看做客户端,而计算机图形硬件厂商所提供的OpenGL实现可以看做服务端。OpenGL的某些实现(例如X窗口系统的实现)允许服务端和客户端在一个网络内的不同计算机上运行。这种情况下,客户端负责提交OpenGL命令,这些OpenGL命令然后被转换为窗口系统相关的协议,通过共享网络传输到服务端,最终执行并产生图像内容。