欢迎光临散文网 会员登陆 & 注册

GAMES101-现代计算机图形学入门-闫令琪

2022-07-29 00:51 作者:没急死吐司卿  | 我要投稿


Lecture 03 Transformation P3 - 00:28


1. 旋转矩阵:通过特殊点(0,1)和(1,0)构造旋转结果可以得到

2. 平移矩阵:为了所有的变换都能写成矩阵乘向量的形式,需要引入齐次坐标(变成三维矩阵)——这是一个tradeoff,后续要关注下引入齐次坐标会带来什么问题

3. 齐次坐标表征:二维点(x,y,1),二维向量(x,y,0)——这样保证了点与向量之间的加减操作的有意义性

4. 逆变换:矩阵的逆

5. 组合变换:矩阵乘法,注意矩阵相乘的顺序

6. 齐次坐标表示是先变换再平移


Lecture 04 Transformation Cont. P4 - 00:26


1. 三维中的旋转:需要确定是左手坐标系还是右手坐标系,右手坐标系的坐标顺序是XYZXY...Z轴指向屏幕外;左手坐标系是XZYXZ...Z轴指向屏幕内;由于循环对称的特性,假设用的是右手坐标系,那么绕Y轴的旋转是从Z转向X的方向,所以其旋转矩阵与绕X/Z轴的旋转矩阵会有所不同

2. Rodrigue's Rotation Formula: 可以给出(在原点)绕一个轴旋转任意角度的旋转公式

3. 四元数:听老师意思是为了解决旋转矩阵之间的加减?感觉有点类似引入齐次坐标的原因?

4. (右手坐标系的)相机坐标系:相机放在原点,看向-Z,向上是Y,然后把所有物体移到相机坐标系下——先平移到原点,然后把物体的坐标轴旋转与相机坐标系对齐——这个对齐的旋转矩阵不好直接写,可以先写逆变换,再取逆(其实就是转置)

5. 正交投影:把中心平移到原点,然后缩放成标准立方体;如果用右手坐标系,因为看向-Z,那会导致近处平面的z坐标大于远处平面的z坐标

6. 透视投影:把锥台先挤压成一个立方体,再做正交投影——第一步里,关于XY坐标,可以通过相似三角形去推导,而Z坐标需要和特殊点(0,0,f,1)联立方程组去求解


Lecture 05 Rasterization 1 (Triangles) P5 - 00:33


  1. 怎么定义视锥?如果直接把所有坐标都指定好了,那当然最直接;不过更常用的定义是通过长宽比aspect ratio和垂直可视角度vertical field of view(fovY)来定义
  2. 光栅化:就是把物体画到屏幕上——先将透视投影变换成标准立方体后,再将标准立方体变换到屏幕空间[0, width]*[0, height](通过平移与拉伸变换即可)
  3. 逐行扫描progressive scan vs. 隔行扫描interlaced scan:隔行扫描就是利用人眼的暂留现象,一帧只显示偶数行,一帧只显示奇数行
  4. 液晶显示器LCD:通过液晶的扭曲影响光的偏振?(听君一席话如听一席话。。。)
  5. 为什么常用三角形光栅化?三角形是最基础的多边形,并具有一些良好性质:三角形内部一定是一个平面(四边形往对角线一折就不是了);点是否在三角形的内部是well-defined的(向量的叉积);三角形内的点很容易插值(barycentric interpolation)
  6. 怎么把三角形变成像素?最简单的办法就是采样——判断像素的中心点是否在三角形内——点与所有任意两个顶点(顶点按顺/逆时针排序)构成的向量叉积同号
  7. 实际上像素不一定是内部颜色均匀的方块;RGB的密度也不一定一样,比如可以放多点绿色感光单元,可以让人眼看起来更舒服点


Lecture 06 Rasterization 2 (Antialiasing and Z-Buffering) P6 - 09:40


  1. 采样造成的artifacts:如Jaggies/剧齿、Moire Patterns/摩尔纹、Wagon Wheel Illusion/车轮效应、etc.
  2. 从傅立叶变换的角度来解释为什么采样会造成失真:傅立叶变换可以把图像分解成不同频率的波的组合,低频波对应图像的内容,高频波对应图像内容的边缘/edge,而要尽可能完全表示高频波,需要的采样率是远远高于低频波的
  3. 卷积定理:空域的卷积等价于频域的相乘
  4. 怎么保真
  5. SSAA/Super Sampling Anti-Aliasing: 在每个像素中进行多次采样,然后根据多次采样的结果综合来计算像素的颜色值,比如説有4个采样点,那该像素的颜色就是这4个采样点的颜色平均
  6. MSAA/MultiSampling AA:类似于SSAA,在光栅化阶段,判断一个三角形是否被像素覆盖的时候会计算多个覆盖样本(Coverage sample),但是与SSAA的差别在于,在pixel shader着色阶段计算像素颜色的时候每个像素还是只计算一次,比如説4个采样点只有两个被三角形覆盖了,那该像素点的颜色等于中心点的颜色*50%
  7. FXAA/Fast Approximate AA:后处理锯齿图,找到锯齿的边界,然后把这些锯齿给替换掉
  8. TAA/Temporal AA:基于相邻帧的信息
  9. 超分辨率


Lecture 07 Shading 1 (Illumination, Shading and 
Graphics Pipeline) P7 - 21:20


光栅化后就开始考虑怎么着色,着色需要先考虑物体之间的遮挡关系,再是考虑光照,最后看现代的图形学管线是怎么处理这个过程的

  1. 处理遮挡的算法:Z-Buffer
  2. 每个像素会存储当前位置的最小深度值/z-value,以及颜色值
  3. 实际操作时,就是遍历每个三角形的每个像素,如果其深度值比当前缓存的深度值小,就更新该像素当前的深度值与颜色值;否则不操作
  4. 着色(只考虑一个点)
  5. 定义:把材质应用到物体上的过程
  6. 感光类型:高光/Specular hightlights、漫反射/Diffuse reflection、环境光/Ambient lighting
  7. 着色输入:视角方向、平面法向量方向、光源方向、表面参数(颜色、亮度等)
  8. Blinn-Phong Reflectance Model:
  9. Lambert's cosine law: 物体表面接收到多强的光照与物体表面和光的角度有关
  10. Light Falloff:根据能量守恒,某个点的光的强度,在传播到距离光源r的地方的强度是I/r^2(这里没有考虑物体到观察点之间的距离的能量损失,是正常的,后面会讲到)
  11. Lambertain/Diffuse shading: 结合a和b,再考虑物体对光强的吸收率(漫反射系数),就得到了漫反射的物体表面明亮强度


Lecture 08 Shading 2 (Shading, Pipeline and Texture Mapping) P8 - 05:14


  1. Blinn-Phong Reflectance Model:上一节讲的只是漫反射项,这一节接着讲高光和环境光
  2. 高光项:与漫反射不同,高光项依赖于观察角度(镜面反射);怎么衡量能不能看到高光呢——看半程向量(观察角度与入射角度的平均)与法向量是否足够接近;这样高光项就是考虑这三项——高光系数、Light Falloff、以及半程向量与法向量之间的夹角大小
  3. 环境光项:假设任何点接收到的环境光是一样的,这样环境光项就只考虑物体本身材质的环境光系数*环境光亮度常量
  4. 着色频率/Shading Frequencies——影响着色的质量,如果顶点/面的数目足够多,那也不见得非得用逐像素
  5. Flat shading:每个三角形只着色一次,即三角形内部的颜色值是一样的
  6. Gouraud shading:每个三角形的顶点都做一次着色,三角形内部的颜色通过顶点的颜色进行插值得到
  7. Phong shading:逐像素着色(非Blinn-Phong模型)
  8. 根据Blinn-Phong模型,着色时需要知道平面的法向量,那顶点的法向量怎么得到呢?使用顶点相邻面的法向量的加权平均(根据面积加权);那平面内的像素呢?基于顶点的法向量做Barycentric interpolation(后面会介绍)
  9. 图形/实时渲染管线:三维的点渲染到屏幕上的过程
  10. Vertex Processing:顶点投影变换到屏幕上
  11. Triangle Processing:顶点构成三角形
  12. Rasterization:采样,判断像素点是否在三角形内
  13. Fragment Processing:Z-Buffer可见性判断
  14. Framebuffer Operations
  15. 着色发生在4.a和4.d;Shader其实就是一段代码,计算每个顶点/像素的颜色
  16. 老师推荐了一个shader网址:https://www.shadertoy.com/view/ld3Gz2
  17. 最后自己mark下一个有关于图像管线的学习资料:https://fgiesen.wordpress.com/2011/07/09/a-trip-through-the-graphics-pipeline-2011-index/


Lecture 08 Shading 2 (Shading, Pipeline and Texture Mapping) P8 - 54:48


  1. Texture Mapping/纹理映射:怎么把纹理映射到一个个三角形上——需要把三角形的顶点与纹理的坐标之间做一个映射


Lecture 09 Shading 3 (Texture Mapping Cont.) P9 - 08:02


  1. Barycentric Coordinates重心坐标
  2. 三角形平面内的任意一个点的坐标,都可以由三角形的三个顶点坐标的线性组合得到,条件是顶点的线性权重系数之和为1,这三个系数就是重心坐标。当三个系数都非负时,这个点在三角形内
  3. 如果已知一个点的坐标,怎么得到这个点的重心坐标呢?这个点把三角形划分成三个小三角形,每个小三角形的面积占比构成重心坐标之一;有一个公式可以直接计算得到
  4. 这样,我们就可以使用重心坐标来线性组合顶点的颜色等属性值,来得到三角形内的任意一个像素的颜色等属性值
  5. 要注意,重心坐标不是projection invariant的——这在计算深度值时要注意——计算深度值应该基于原始三维空间的重心坐标来插值,而非投影后三角形的重心坐标
  6. Texture Magnification纹理放大
  7. texel/纹素:a pixel on a texture,当纹理的分辨率太低时,多个像素会对应到一个texel上,这样就会有一些“小格子”,视觉效果就不好
  8. 可以用双线性/Bilinear插值(利用周围四个texel的属性做两次插值)、双三次/Bicubic插值(周围16个texel做三次插值)来优化这种情况
  9. Texture Minification
  10. 如果纹理太大了呢?一个像素就会对应到多个texel,这时就需要做采样。回想起之前,我们可以用supersampling的方法来做保真,但是在这种情况下,一个像素覆盖的texel可能太多了,那计算复杂度会比较高;这里换个思路,不做采样,给定一个区域,直接能得到这个区域的平均值——图形学里有比较高效的range query算法来解决这个问题
  11. Mipmap就是用来解决这个问题的区间查询算法,但是它只支持方形区域,而且是个近似算法;Mipmap其实就是把纹理变成一个图像金字塔,预先计算远端的纹理贴图,以空间来换时间的做法:每一层是上一层大小的1/4,直到最后变成1,所以内存会多占用1/3;另外,如果有个纹理无法准确的在某一层的Mipmap里找到,也可以通过相邻两层的结果,做一次双线性过滤来得到(因为做了三次线性过滤,所以也叫三线性过滤)
  12. Mipmap的问题:双线性过滤和三线性过滤在渲染时对不同坐标是同等对待的,也就是假设原始纹理是方形的,这对于非方形物体就容易造成overblur的问题;改进手段:Anisotropic Filtering/各向异性过滤——在构造图像金字塔时,比如原来64*64的,现在不止存了32*32的,也存了64*32和32*64的,以供纹理过滤时选择;更高级的做法还有EWA filtering(留坑)

GAMES101-现代计算机图形学入门-闫令琪的评论 (共 条)

分享到微博请遵守国家法律