0
点赞
收藏
分享

微信扫一扫

games101 光栅化(5~6)

小黑Neo 2022-05-06 阅读 95

深度缓存

1. 何为深度

深度其实就是该象素点在3D世界中距离摄象机的距离(绘制坐标),深度缓存中存储着每个象素点(绘制在屏幕上的)的深度值!深度值(Z值)越大,则离摄像机越远。

2. 为什么需要深度?

在不使用深度测试的时候,如果我们先绘制一个距离较近的物体,再绘制距离较远的物体,则距离远的物体因为后绘制,会把距离近的物体覆盖掉,这样的效果并不是我们所希望的。

在这里插入图片描述

而且如果出现上图这种情况,这种方法便失效了。而有了深度缓冲以后,绘制物体的顺序就不那么重要了,都能按照远近(Z值)正常显示,这很关键。

3.深度缓冲原理

深度缓冲区原理就是把一个距离观察平面的距离与窗口中的每个像素相关联。
首先,把所有像素的深度值设置为无限远。然后,在场景中以任意次序绘制所有物体,此时并不考虑是否被其他物体遮挡。在绘制每个像素之前,会把它的深度值和已经存储在这个像素的深度值进行比较。新像素深度值<原先像素深度值,则新像素值会取代原先的;反之,新像素值被遮挡,他颜色值和深度将被丢弃。

image-20220428112422848

着色模式

着色只考虑一个点,不考虑其他物体

漫反射(diffuse

在这里插入图片描述

反射光的强度取决于在表面法向量和入射光的光线之间的角度的余弦值。

Blinn-Phong模型

只要不是绝对光滑,入射角就会喝反射角有一定夹角

也只有观察方向和反射方向相近的时候,物体才会展现出高光效果
但是观察方向和镜面反射方向相近的时候可以以转换成他们之间的角平分向量和法线方向接近,所以我们可以求出半程向量

同样我们可以利用点乘的方式求出他们之间的接近程度,而这个公式就比之前的公式容易计算的多
这个公式中的指数p指的是对接近判断的严格程度,因为夹角余弦对于接近的太宽容,夹角达到45度时余弦仍然是较大值,一般采用的是128次方
环境光就是在光的基础上乘以一个固定系数
最后我们就能得到完整的Blinn-Phone反射模型

在这里插入图片描述

着色频率

flat shading

在每个三角形上着色,三角形内部没有着色的变化

gouraud shading

在每个顶点上进行着色,在三角形内部进行插值着色
如何定义每个顶点的法线?
我们可以将它周围的面的法线向量求平均,同时根据三角形面积的大小进行加权平均

phong shading

在每个像素上进行着色,并不是blin-phone模型
如何定义逐像素的法线
给两个顶点的法线向量进行差值
在这里插入图片描述

在几何模型足够多面数的情况下,各个着色频率之间的差距已经可以忽略不计

图形管线

在这里插入图片描述

shader

对每个像素或者是fragment执行

纹理贴图

将三维空间物体展开成一个平面,我们的材质贴图作为2D贴图,他们之间存在着三角形面的对应关系
在这里插入图片描述

为了制定纹理上的点,我们采用UV坐标,不管长宽比UV范围都是0~1

重心坐标

在这里插入图片描述

纹理贴图尺寸不匹配产生的问题

贴图过小

贴图过小会导致屏幕空间内的多个像素点都对应到贴图上的同一个像素,这就会导致走样。只是根据最近的像素点则会产生明显的锯齿,于是我们对周围四个点进行平均

双线性插值

在这里插入图片描述

如果你觉得这个效果仍然不够理想,那么还可以采用周围16个点进行平均

贴图过大

纹理贴图在过大的时候也会出现问题,尤其是在透视投影中,会导致远处出现摩尔纹,而近处出现锯齿。

在这里插入图片描述

为什么会导致这样的结果呢

如果将100X100的贴图应用到10X10的平面上,平面当中的每一个像素点都要对应多个纹理像素,这就是采样频率过低,导致图片失真。

MipMap

既然采样会导致这样的结果,那么干脆我们不进行采样,而是采用一种求颜色均值的方式。

求颜色均值就必然要规定一个范围,但是屏幕空间中的一个像素点在不同远近的位置占据的贴图大小是不同的,因此我们就要定义不同的级别来供选择,也就是MipMap

在这里插入图片描述

我们将周围四个相邻像素点求均值合并为一个像素,区域查询就是到不同level中进行点查询

接下来就需要知道如何确定是哪一个level的

在这里插入图片描述

在屏幕空间中取当前像素点的右方和上方的两个相邻像素点(4个全取也可以),分别查询得到这3个点对应在Texture space的坐标,计算出当前像素点与右方像素点和上方像素点在Texture space的距离,二者取最大值

但是呢这样的level计算出来都是正数,在图片上不会连续变化,我们可以将D向上取整和向下取整的level在进行一次线性插值

在这里插入图片描述

其他形式的MipMap

在不同level我们都是采取的正方形区域,但是很多时候我们只需要竖直或者是水平方向上的高Level,所以我们需要各向异性的过滤

在这里插入图片描述

各向异性过滤的贴图采用不同的长宽比

在这里插入图片描述

举报

相关推荐

0 条评论