计算机图形学入门教程OpenGL版.第1篇.基本概念

开始学习前,首先明确一些基本概念。

1.1 图形学是什么

在国内,图形学是一门冷僻的学科。除了GPU设计者,其余从事图形学行业的人大多与游戏相关,因为需要处理游戏的图形渲染引擎或效率性能优化而研究图形学。关于图形学是什么、解决的是什么问题,我能够给出的回答是:图形学的任务是将数学公式描述的世界展示在屏幕上。如何展示这个问题,前人已经解决过了,我们需要做的就是更好地展示。如何做到更好?两个方面:一是更高性能,二是更好效果。在图形学中,这两个分支分别称为实时绘制技术和真实感绘制技术。

以下是之前随便制作的一张光线追踪渲染效果图。光线追踪,顾名思义,是让计算机用物理方法模拟光源,通过计算光线的反射、折射与衰减得到最终效果。该方法显然精确且耗时严重,但它能够得到非常好的真实感效果。

计算机图形学入门教程OpenGL版.第1篇.基本概念_第1张图片

在达到一定的真实感效果前提下,我们希望加快绘制速度。比如围着这个场景转,多角度观察,而不想出现卡顿掉帧情况。如果实时进行光线追踪计算,以目前消费级显卡能力肯定是不可能的。因此考虑其它手段,比如把渲染后的结果作为纹理图片贴在几何体表面,这就是光照贴图技术,在Unity引擎中称为烘焙。烘焙一词在Unity中泛指预处理,光照贴图之外的其它预处理技术也叫作烘焙。

以下是NVidiaCUDA(关于CUDA,详见1.5 相关领域概念与技术)例程中提供的二次Mandelbrot图,这个分形图形是使人对图形学产生兴趣的最好的例子之一,它是由一个简单的递归函数生成的。

计算机图形学入门教程OpenGL版.第1篇.基本概念_第2张图片

现代计算机图形学主要讨论的是三维图形,二维图形(如上面的Mandelbrot图)的处理过程可以认为是三维图形处理过程的子集。图形学诞生的标志是1963年IvanSutherland的博士论文Sketchpad。Sketchpad仅涉及二维图形,Sutherland从事图形学研究直到1975年,这些年里他相继开拓了三维图形学、虚拟现实领域,成为计算机图形学之父。1975年之后他的研究转向时钟无关的设计,这里不再详细阐述。Sutherland是一位传奇人物,有兴趣可以搜索他的履历。

现在考虑这样一个问题:如何将数学公式描述的三维世界展示在屏幕上?这就是图形流水线或者又叫作图形渲染管线要解决的问题,详见第2篇。

1.2 图形与图像

图形是矢量描述的(连续),图像是像素点阵描述的(离散)。

由于图象由像素点阵描述,对图像的任何操作始终是针对像素的。在windows画图中放大图像会产生明显的锯齿(在Photoshop中放大图像不会有锯齿,会变模糊,是因为采用的插值算法不同)。图像放大缩小后信息量会变化。

计算机图形学入门教程OpenGL版.第1篇.基本概念_第3张图片

图形的点线面均由坐标和曲线方程记录,放大或缩小只改变显示到屏幕上的窗口的大小,不改变图形自身的信息量。下图的圆由控制点坐标和方程确定其曲线。现代的显示器以像素为显示单位,即使是矢量的图形,仍然要采样映射到像素才能显示在屏幕上。这种采样方法称为光栅化,详见第2篇。

计算机图形学入门教程OpenGL版.第1篇.基本概念_第4张图片

1.3 为何选择OpenGL

在编程API的选择上,为何选择OpenGL而不是D3D?原因有二。首先,一直以来我学习工作使用的是OpenGL,对D3D知之甚少,不敢妄言,但相信精通其一之后其二也不会太困难;其次,D3D属于Windows平台技术范畴,主要面向游戏领域;OpenGL则是跨平台的。在过去,OpenGL主要用于科学计算可视化,学校里用得多企业里用得少;而现在,移动终端的发展为OpenGL带来了新的前景,局势和过去完全不同了。由于跨平台特性,OpenGL的衍生物OpenGLES广泛用于移动终端,WebGL用于浏览器,它们原理相通、API相似,学一顶三,比较实用。

1.4 颜色表示法

计算机中表示颜色有若干种方法,其区别在于量化方式不同。可以认为颜色是连续的模拟信号,计算机对其采样生成离散的数字信号。图形学中使用的颜色采用RGBA表示法,将颜色分为4个字段:红Red,绿Green,蓝Blue,不透明度Alpha。每个字段的值越大,其对颜色的贡献值越大。如(1.0, 0.0, 0.0, 1.0)表示完全不透明的大红色。

注意,在图形学中,RGBA每个字段的值域是[0,1]。你可能知道24位真彩色的概念:RGB共计使用24位二进制,每个字段8位二进制,因此每个字段的十进制值域是[0, 255]。为什么图形学不采用[0, 255]值域?这是因为出于性能考虑,可以采用多种颜色模式,高精度的24位RGB可以,低精度的16位RGB也可以。在实际使用时,按照选择的颜色模式对[0, 1]区间内的数字量化取值。

下图从左到右红色成分逐渐增加,从0.0到1.0。它并非连续的,这张图片里包含了256种颜色。两种颜色间相差太小,肉眼难以辨别。将每种颜色进行256级采样量化,得到的就是24位RGB或32位RGBA。


下图对绿色成分0.0到1.0的色带进行了64级(6位)采样量化,已经能够看出条带。在16位RGB 模式中,R5位,G6位,B5位。绿色量化级数多是因为人眼对绿色更敏感,能够辨别更多种绿色。


下图对蓝色成分0.0到1.0的色带进行了8级(3位)采样量化,色带非常明显。


例如,R=0.375时,选择24位RGB模式,R值如何计算?0.375*255=95.625≈96,则得到其对应的24位RGB索引值为96,在RGB调色盘中找到R96G0B0对应的颜色即可。

你可能感兴趣的:(计算机图形学入门教程OpenGL版.第1篇.基本概念)