作者:心动前端工程师 山楂
山楂最近入坑计算机图形学,在心动外部做了一次分享,分享内容次要基于闫令琪的课程。上面是这次外部分享的笔记,请配此 slide 食用。
计算机图形学在游戏、电影、设计、VR & AR、可视化、模仿、GUI、字体等畛域失去广泛应用,包含光栅化(rasterization)、几何(curves & meshes)、光线追踪 (ray tracing)、动画模仿(animation/simulation)等内容。其中,光栅化能够说是计算机图形学中最为根底的概念。简略来说,光栅化是将三维场景映射成立体图形,再将图形分解成多边形,多边形打碎成像素,显示到屏幕上的过程。
光栅化波及的数学知识次要是线性代数,包含向量(求和、点积、叉积)和矩阵(乘积、转置、单位矩阵)等。光栅化波及的大量变换都能够表白为向量和矩阵的运算。
缩放、切变、翻转、旋转这些线性变换能够用矩阵乘法示意,引入齐次坐标后,平移也同样能够像线性变换一样用矩阵乘法解决。蕴含俯仰、偏航、滚转的三维简单旋转,能够用罗德里格斯旋转方程形容。
缩放、旋转、平移等根本的变换操作产生在模型变换(modeling tranformation)阶段,相似拍照过程中的找景、模特就位。模型变换之后是相机变换(view tranformation)阶段,在这一阶段咱们确定相机和物体的绝对地位,相似拍照过程中的找角度、放相机。具体来说,咱们通过相机的地位、看向的方向、往上的方向来示意相机,而后为了简化计算,将相机和物体一起挪动,在放弃两者绝对地位不变的前提下将相机挪动至坐标系原点。下一阶段是投影变换(projection tranformation),相似拍照过程中的按快门。投影次要分为正交投影和透视投影两种。正交投影绝对简略,光线平行,各点的绝对地位不变,将场景平移缩放至 [-1, 1]^3
的规范立方体上,再去除 Z 值压到立体上。这里,缩放至规范立方体是为了简化计算。透视投影,近大远小,相似人眼观看物体的形式。使用近立体通过挤压不会发生变化、远立体通过挤压 Z 值不会发生变化、中心点通过挤压也不会发生变化三点性质,能够实现透视投影。这三个阶段组成了视图变换。最初还有一个视口变换(viewport transformation),将之前缩放至规范大小的场景依据屏幕的长宽再进行一次变换,投射到屏幕上。
光栅化合成图形为多边形,其中使用最宽泛的是三角形,因为三角形外部是立体,内外定义很清晰,外部任意一个点都能够插值突变。三角形输入到屏幕时,会遍历屏幕上的每个像素,通过向量的叉乘判断像素点是否在三角形内。当然,理论计算时会应用突围盒简化计算,突围盒外的像素点就不必再进行向量叉乘运算了。为了应答锯齿、摩尔纹等采样瑕疵,能够先含糊再采样。尽管对每个像素进行卷积操作能够实现含糊,但计算量比拟大,所以个别应用超采样,每个像素外部减少采样点再进行均匀。
利用 Z 值能够解决遮挡的问题,保护一个 Z-Buffer 记录像素点的深度,如果三角形面上的像素点 Z 值小于 Z-Buffer 中的值,那就更新 Z-Buffer 中的值为以后 Z 值,同时更新该像素点的色彩为以后三角形面上的像素点的色彩。
再接下来要解决的是着色(shading)问题,因为物体的色彩会受光照影响,更简单的是,不同的材质和光线的相互作用不同。最根底的着色模型是 Blinn-Phong 反射模型,它从高光、漫反射、环境光三个维度去综合思考着色。漫反射次要思考材质的漫反射系数、光线强度、光源远近、入射方向和材质外表的夹角大小。不同的着色频率会产生不同的显示成果,有逐立体法线(flat shading)、逐顶点法线(gouraud shading)、逐像素法线(phong shading)三种。逐立体法线以三角形面为着色单位,计算很快,但成果较差。将共享一个顶点的所有三角形面的法线向量相加求均值,能够失去顶点的法线向量,据此能够对每个顶点进行着色,而后间接插值计算三角形面内每个点的色彩,这就是 gouraud shading。如果不间接插值计算三角形内每个点的色彩,而是间接光栅化后造成像素点,再据此对每一个点着色,就是 phong shading。
计算机图形中经常提到的渲染管线通常可分为顶点解决、三角形解决、光栅化、片元解决、帧缓冲解决,其实具体来说大抵就是下面提到的这些内容。顶点解决就是对所有顶点数据进行视图变换,三角形解决就是这些顶点组合成各三角形面(三角面剖分),而后是光栅化判断像素点是否在三角形内,再接下来是片元解决,对每个片元进行着色,最初则是整合所有信息输入至屏幕。其中,片元解决除了之前提到的着色外,也能够进行纹理映射,用纹理贴图代替色彩。
最初举荐两个超棒的视频教程:
- 3Blue1Brown 的 线性代数的实质,以可视化的形式来了解线性代数(总时长:2h40m)。
- 闫令琪的 古代计算机图形学入门,全程无一句废话,通俗易懂,滑稽风趣(总时长:28h+)。