games101着色(7~9)

深度缓存

1. 何为深度

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

2. 为什么需要深度?

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

在这里插入图片描述

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

3.深度缓冲原理

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

image-20220428112422848

着色模式

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

漫反射(diffuse

在这里插入图片描述

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

折射

在这里插入图片描述

I_refl为该点反射的光强 I_trans为到达该点背后的光强 Kt 该点的透射系数

I = ( 1 − k t ) I r e f l + k t I t r a n s f I = (1-k_t)I_{refl} + k_tI_{transf} I=(1kt)Irefl+ktItransf

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,所以我们需要各向异性的过滤

在这里插入图片描述

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

在这里插入图片描述

纹理的应用

在现代GPU中,纹理 = 内存 + 范围查询

环境光可以通过镜面球来存储,但展开之后会产生扭曲,不能均匀描述

我们可以用一个立方体包住这个球,把光照信息存储在立方体表面上

在这里插入图片描述

凹凸贴图

凹凸贴图使用灰度值提供凹凸信息,可以通过纹理定义高度的变化,在不改变几何形体的情况下实现凹凸的效果

凹凸映射和纹理映射非常相似。然而,纹理映射是把颜色加到多边形上,而凹凸映射是把粗糙信息加到多边形上。需要注意的是这个物体是平的,但是它看起来却是粗糙不平的。凹凸映射是一种负责光方向的纹理映射。

法线贴图

与之前通过灰度表现界面的凹凸程度,进而修改法线的方式完全不同,这种Normal Map直接将法线存储到了法线贴图中,也就是说,我们从法线贴图读取的法线直接就可以使用了,而不是需要像上面那样,再通过灰度渐变值来修改法线。这种法线对于制作来说,没有灰度图那样直白,但是却是真正的法线贴图技术,所谓烘焙法线,烘焙的就是这个。

法线向量是个几何工具,而纹理通常只用于储存颜色信息,用纹理储存法线向量不是非常直接。类似的我们也可以将法线向量的x、y、z元素储存到纹理中,代替颜色的r、g、b元素

在二维贴图中如何计算法线方向?

首先看如何计算二维函数的法线

通过相邻一个单位的邻近点计算出近似的切线方向,根据切线的向量表示方法计算出法线的向量表示

然后在3D空间中分别计算出UV方向上的切线方向,根据法线与两条切线组成的平面相垂直得到(记住最后公式就行了)

这是在局部坐标系当中的,因为默认了平面法线为(0,0,1)

在这里插入图片描述

位移贴图

事实上改变了各个三角形顶点的位置,从边缘以及阴影位置可以看出和法线贴图的区别

在这里插入图片描述

但是他需要模型的三角形足够细致,能够跟上纹理定义的改变频率

纹理映射

如何将一幅图案贴在物体上?

对于物体上的每一个像素,如何在纹理表(texture map)中查找其对应颜色而不同Map shape产生不同效果

平面

Map shape 是一个平面, 对于物体上每个点(x, y, z)抛掉其中一个分量,得到二维坐标 (x, y) 利用该值查找texture map中对应值

在这里插入图片描述
在这里插入图片描述

圆柱

圆柱体:

  • 物体表面坐标(x, y, z)转换为 圆柱体坐标(𝑟, 𝜃, ℎ)
  • 𝜃 – 对应于texture map中x坐标
  • h – 对应于texture map中y坐标

在这里插入图片描述
在这里插入图片描述

球体

球体:

  • 物体表面坐标(x, y, z)转换为 球面坐标
  • 纬度 – 对应于texture map中x坐标
  • 经度– 对应于texture map中y坐标

在这里插入图片描述
在这里插入图片描述

凹凸映射

• 凹凸映射 – 使用扰动函数并在光照模型计算中使用扰动法向量

• 令P(u,v)表示一个参数曲面上的点
N = P u ∗ P v N = P_u * P_v N=PuPv
• Pu和Pv – 关于参数u和v的偏导数

• 增加一个小的扰动函数(凹凸函数)b,在表面法向量𝑛 = 𝑵 / |𝑵| 方向上增加凹凸效果:
P ′ ( u , v ) = P ( u , v ) + b ( u , v ) ∗ n P'(u,v) = P(u,v) +b(u,v)*n P(u,v)=P(u,v)+b(u,v)n
再将P’分别对u、v求导,假设凹凸函数b很小可以忽略最后一项
在这里插入图片描述

最后化简成为

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值