概论
- 什么是计算机图形学?
使用数学算法将三维或二维图像转化为计算机显示器的栅格形式。 - 计算机图形学的四大组成部分
光栅化成像、几何表示、光的传播理论、动画与模拟
基本的数学知识
- 点乘:用于计算向量投影,判断物体之间的方位
- 叉乘:用于判断两个向量的相对位置,以及点是否在三角形内部(在光栅化阶段很重要)
- 左手、右手坐标系:不同软件、图形接口用的是不同的坐标系,一般是右手坐标系。(OpenGL为左手坐标系)
- 矩阵运算:自己翻书去,略。
基础变换矩阵
线性变换:缩放、剪切、旋转
仿射变换:位移
齐次坐标:由于位移无法用单一矩阵实现,因此为了使基础变换矩阵都能用单一矩阵描述,引入齐次坐标,即多加入一个维度,1表示点,0表示向量。
视图变换
即将虚拟世界中的物体,从它的模型坐标,一步步转化到屏幕坐标系。(通过MVP矩阵)。
模型变换(modeling tranformation)
将虚拟世界(游戏场景)中的物体,调整至它们应该在的位置。(模型空间转化到世界空间)。
用基础变换矩阵简单调整。摄像机变换(camera tranformation)
为了得到物体与摄像机的相对位置,将摄像机和物体一起移动,让摄像机坐标与世界空间的原点坐标重合。
定义相机位置e,观察方向g,上方向t,建立摄像机坐标系。
由于旋转矩阵是正交矩阵,所以通过逆推,即可求出摄像机变换的矩阵。投影变换(projection tranformation)
将三维空间中的顶点坐标映射到二维空间,投影变换又分为正交投影和透射投影。
正交投影:将物体转换到一个[-1,1]^3的空间之中(保留z是为了方便之后的遮挡剔除)
透射投影:将物体进行压缩,再进行正交投影。视口变换(viewport tranformation)
将处于标准平面映射到屏幕分辨率范围之内,即[-1,1]^2==>[0,width]*[0,height], 其中width和height指屏幕分辨率大小
光栅化
光栅化是将向量图形格式表示的图像转换成位图以用于显示器或者打印机输出的过程。
屏幕可以简单理解为,由离散的、二维的像素点构成。
而最基本的二维图像是三角形,对其离散化的操作便是生成图像的重点,方法就是采样。(说人话:判断三角形和像素的位置关系)
采样(Sampling)
如果采样频率<变化频率,就会出现走样现象(锯齿、摩尔纹等)
解决思路:先Filter(模糊)后采样,Filter包括卷积(类似于低通滤波)
目前运用广泛的方法有:- MSAA:将像素再度划分,通过平均/卷积求其颜色值,这是一种Filter的方法,并非提高采样率。
- FXAA:先采样,再通过深度学习等方法弥补锯齿。
- TAA:静态场景,相邻两帧同一像素用不同的位置来采样,会借助前面帧的信息。
光栅化算法
直线光栅化算法- DDA数值微分算法:通过判断斜率,来确定主要前进方向是x轴还是y轴。
- 中点Bresenham算法:根据接下来可能要画的几个像素的中点和直线的位置关系判断。
三角形光栅化算法 - 简单粗暴:对屏幕中的每一个像素进行采样,如果这个像素点在三角形之中那么这个像素点就应该被采用。(叉乘判断)
- 优化:ABB包围盒
Z-Buffer算法
- 要把物体渲染显示在屏幕上,还要判断物体先后顺序,这就需要用到MVP变换之后所得到的深度值Z了。
- Z-Buffer算法需要为每个像素点维持一个深度数组记为zbuffer,其每个位置初始值置为无穷大(即离摄像机无穷远)。
- 随后我们遍历每个三角形面上的每一个像素点[x,y],如果该像素点的深度值z,小于zbuffer[x,y]中的值,则更新zbuffer[x,y]值为该点深度值z,并同时更新该像素点[x,y]的颜色为该三角形面上的该点的颜色。
局部光照模型
到了着色(shading)的环节,就要计算出每个采样像素点的颜色是多少。
可以先将光线简单的分为3类:
- 镜面反射
- 漫反射
- 环境光
泛光模型
泛光模型即只考虑环境光,这是最简单的经验模型,只会去考虑环境光的影响,并且不会去精确的描述,而只是用一个简单的式子表示: 环境光 = 反射率 * 入射光亮度Lambert漫反射模型
漫反射 = 漫反射系数 * 光照强度 * max(0,法线向量和入射方向的点乘)Phong反射模型
高光反射 = 反射系数 * (入射光强/距离^2)* max(0,cos反射方向和观察方向的夹角)^衰减系数Blinn-Phong反射模型
将Phong反射模型的角度计算换为 半程向量和法线向量 的夹角
着色频率
- Flat Shading:以面为单位进行着色
- Gouraud Shading:以顶点为单位进行着色
- Phong Shading:以像素为单位进行着色
图形渲染管线

- 空间中的点 ->MVP矩阵,投影到屏幕上
- 点形成三角形
- 光栅化
- 着色
- 整合信息,输出
纹理映射(Texture Mapping)
我们可以将三维物体上的任意一个点都映射到一个2维平面之上,将每个点的颜色信息即漫反射系数存储在2维的Texture之上,每次利用光照模型进行计算的时候根据映射关系就能查到这个点的漫反射系数是多少。
纹理坐标(UV):横轴和纵轴的最大值都为1,在纹理空间之内任意一个二维坐标都在[0,1]之内
Reference
[1] GAMES101-现代计算机图形学入门-闫令琪