OpenGL图形开发入门笔记
前篇我们完成了OpenGL的环境搭建,在进入OpenGL编程之前,我觉得有必要对计算机图形学的基础理论进行一下简单的学习和梳理。为此,本文借助《OpenGL编程精粹》进行归纳学习和整理。
01 点
点是图形中最基本的几何对象。一般的,利用直角坐标系表示来确定物体在屏幕中的位置。坐标系分为左手坐标系、右手坐标系。OpenGL采用右手系。
重点内容
2D坐标(X,Y)
2D的距离公式
3D坐标(X,Y,Z)
3D的距离公式
02 向量
标量是个表示数量大小的值,区别于标量,向量是个既有方向又有大小的量。
2.1向量的大小
即向量的长度或模。
2.2向量的归一化
求一个向量的单位向量的过程,叫做向量的归一化。
2.3向量的四则运算
加减:加减要注意向量的维数必须相同,对应分量加减运算即可。
向量点乘(也称作内积):对应分量乘积的和;点乘的结果描述了两个向量的相似程度,结果越大两个向量越越近。
向量叉乘(也称作叉积):仅可用于3D场景,和点乘不太一样的是,叉乘之后得到一个新的向量,为此,叉乘运算在3D图形学上可用于诸多领域,例如碰撞检测、光照和物理计算等,运算常采用后面所说的矩阵运算。
03 矩阵
矩阵是3D数学的重要基础,对于坐标系的转换和物体的变换都要用到矩阵
OpenGL涉及的内容有
3.1几个常用的矩阵概念
方阵
行数和列数相同的矩阵。
对角矩阵
对角元素不全为0,非对角元素为0的矩阵。
单位矩阵
对角元素全为1的对角矩阵。
3.2矩阵的常用运算
矩阵的加减
矩阵乘法
标量和矩阵相乘、
向量(看成一维矩阵)和矩阵相乘、
矩阵和矩阵相乘。
04变换
在图形的开发过程中,我们经常要对物体进行一些几何变换操作,这也是计算机图形学当中的核心内容。其中最基本的三种变换是平移、旋转、缩放。
4.1平移变换
就是对坐标进行一下简单变换。
x’ =x+tx
y’ =y+ty
4.2旋转变换
二维旋转变换
三维旋转变换
绕X轴
绕Y轴
绕Z轴
4.3缩放变换
‘’
缩放公式用矩阵表示为:
坐标(x,y)以原点为中心,缩放Sx、Sy倍,则缩放矩阵为:
4.4齐次坐标
齐次坐标就是将一个原本是n维的向量用一个n+1维向量来表示,是指一个用于投影几何里的坐标系统,如同用于欧氏几何里的笛卡儿坐标一般。
《计算机图形学(OpenGL版)》的作者F.S. Hill Jr.曾说过一句话:
“齐次坐标表示是计算机图形学的重要手段之一,它既能够用来明确区分向量和点,同时也更易用于进行仿射(线性)几何变换。”
目前OpenGL及Direct3D图形卡均利用齐次坐标的优点,以具4个暂存器的向量处理器来实作顶点着色引擎。
05投影
在3D图形学中,需要涉及两种基本的投影方式:
平行投影
三维物体的坐标沿平行线投影到观察平面上,它保持物体的有关比例不变,在三维空间保持平行的直线经平行投影后依然保持平行。
根据标准线与投影面的夹角不同,还可以分成正交平行投影和斜角平行投影。
透视投影
透视投影是将投影平面置于观察点与投影对象之间的一种投影。这种投影产生对物体真实的观察效果,离观察者越远的物体形成的投影图越小。
06裁剪
在图形的显示过程中,我们还可以通过定义一个观察体(称作视体)来对场景进行裁剪。只有在视体中的那些物体才能在输出设备中显示,所有其他物体均被裁剪掉。观察体的大小依赖于窗口的大小,而观察体的形状依赖于生成显示结果的投影类型。
在z方向限制观察体的容量,可以得到一个有限观察体。这可以通过在观察体的前后各增加一个平面来实现,这两个平面被称为观察体的前平面和后平面或者近平面和远平面。两个平面必须在投影参考点的同一侧,后平面与投影参考点的距离要大于前平面的距离,这样产生的观察体包括6个面。对于正平行投影,6个面形成一个矩形平行六面体;在透视投影中,前后截面将无限棱锥观察体截成棱台。
07光照
要成具有真实感的因形,一方面要有物体的精确模型信息表示,另一个重要的方面就是光照效果的使用。为此我们也需要建立一些必要的光照模型, 光照模型包括许多因素,如物体类型、物体相对于光源的距离以及所设置的光源属性等。
下面就介绍基本的光照模型。
7.1环境光
在基本的光照模型中,只须改变一个场景的基准光亮度,即可简单地模拟一种从不同物体表面所产生的发射光的同一照明, 称为环境光( ambient light)。 环境光是没有空间或方向上的特征的,也就是说,在所有方向上和所有物体表面上投射的环境光的数量是恒定不变的。
需要注意的是,在环境光的作用下,虽然各个表面都得到相同数量的光照,但是各个面上的反射光强度却不一定相同,这还取决于各个表面的材质属性。
7.2漫射光
在真实世界中,我们经常见到的光线都是由某些固定的光源发出的,它们总是从某一个方向照射到物体上,而不像我们在讨论环境光时那样不用考虑光线的方向。为了模拟这种情况的反射效果,我们在考虑反射表面属性的同时,还要考虑光源的位置和类型。我们将光源分为点光源、聚光源以及方向光。漫反射模型就是指物体表面把这些光线均等地反射到各个方向。
7.3镜面反射光
当我们观察一个光照下的光滑物体表面,如光滑的金属时,可能在某个观察方向看到高光或强光,这个现象称为镜面反射,因为在接近镜面反射角的一个会聚区城内,人射光的全部或绝大部分成为反射光。
参考文献
《OpenGL编程精粹》
CSDN、博客园博主已在文中标识,一并致谢!
图片侵删。
来源:CSDN
作者:最近在搞OpenGL
链接:https://blog.csdn.net/qq_42349580/article/details/104667898