Games101 图形学入门笔记

光栅化

概念定义

透视投影视锥体的定义 : 有一个近投影平面的宽高比,和一个垂直可视角(FOV),FOV就是从近平面上面的中心点到下面的中心点两边组成的角度,角度越小看的越近,反之亦然.

演示图片

下面公式可知道如果直接定义了屏幕长宽比和fov角度就知道了所有其他的值,如近平面的宽和高等

演示图片

屏幕,光栅化,和像素的定义

演示图片

屏幕空间定义:

演示图片

视口变换

下面就要把我们之前算出来的-1到1的立方体(因为我们不是把所有点缩放到正交标准空间里了吗)映射到屏幕空间里去,这个矩阵如下:我们先只考虑X和Y的映射,先把-1到1,也就是2的范围缩放到Width和Height的范围,分别对应X和Y,然后再平移,因为我们的空间是从原点0,0到W,H,之前的空间是从-1到1,所以缩放完还要平移一半的距离

演示图片

三角形可以组成任意矩形,在图形学中都是由三角形组成的,任意物体

演示图片

采样

在光栅化中的一个应用 循环遍历一个像素的中心点知否在三角形内 从而确定当前这个像素点是否被占用,0 or 1

演示图片

**判断一个点是否在三角形内,可以从p2,p0,p1,然后从p1到p2取一条向量,p1到Q点取一条向量,然后对这两个做叉乘,如果结果为正,那就代表Q在p1,p2的左侧,然后再看p0到p1取一条向量跟到Q点的去做叉乘,以此类推,一直到P2到P0,如果点都在这些向量的左侧,就代表着此点在三角形内,反之就不在,起始从哪个点开始取向量做不重要,重要的是如果你做的方向是逆时针就是判定点在左侧,顺时针就要判断点在右侧才是在三角形内 **

演示图片

采样判断时并不需要每个三角形都遍历完整个屏幕的像素,只需要去包围住三角形的盒里面的像素即可,这个盒子的四个点只需要通过三角形的三个点的最大X和最小X,最大Y和最小Y就得到

演示图片

上面的是取的AABB包围盒的方式只判断这些像素,有一种更快的方式只需要取每一行的起始X到结束X,这样的话只剩要被判断的像素

演示图片

锯齿(走样)

根据这些点把对应的像素填满后,会出现一些边缘不规则壮的情况,这种现象叫锯齿,原因是因为像素本身有一定的大小,然后我们的采样率对于信号来说是不够高的,然后产生了信号的走样问题

演示图片

演示图片

演示图片

所以要 抗锯齿,反走样,后面要讲这个\~

演示图片

作业纪念

演示图片

抗锯齿(反走样)

采样问题(Sampling Artifacts),锯齿,摩尔纹,车轮效应(既本来是顺时针渲染但是看起来像是逆时针)等等

演示图片

总的采样问题用一句话总结就是 信号变化的太快,采样跟不上所带来的问题

演示图片

反走样:采样之前先做一次 模糊(滤波)

演示图片

演示图片

深度缓存(Z-Buffering)

可见性/遮挡 为什么要使用深度缓存,因为如果使用"画家算法”,也就是先画远的再画近的,会有一些情况有问题,如下图:

演示图片

下面解释什么是深度缓存:在图形学里面有两个Buffer来诠释深度做法,就是按每个像素来,FrameBuffer存取每个像素的颜色值,Z-Buffer存取的就是离相机最近的深度值,当然离摄像机最近的深度值就越小,越大就越远

演示图片

逻辑很简单,就是要画一个新的三角形时,先判断他所覆盖的像素点目前的深度值是不是比你三角形的大,如果大说明这个三角形是离摄像机更近的,是需要覆盖之前的,那就把新的色值和深度信息存起来即可,反之被遮挡

演示图片