GAMES101—Lec 07~09:Shading 定义、着色模型、着色频率、图形渲染管线、纹理

1.Shading定义

定义:引入明暗与不同颜色的过程称为着色

2.Blinn-Phong的着色模型

在这里插入图片描述
如上:可以先将光线简单的分为3类:
环境光照(Ambient Lighting):上面的茶杯图中,有些部分是背光面但是仍然有颜色,因为其接受了各种间接光照。来自环境的反射光很复杂,为了模拟这个,我们会使用一个环境光照常量,它永远会给物体一些颜色。
漫反射光照(Diffuse Lighting):模拟光源对物体的方向性影响(Directional Impact)。它是Blinn-Phong光照模型中视觉上最显著的分量。物体的某一部分越是正对着光源,它就会越亮。
镜面光照(Specular Lighting):模拟有光泽物体上面出现的高光处。镜面光照的颜色相比于物体的颜色会更倾向于光的颜色。

2.1环境光照

泛光模型即只考虑环境光,这是最简单的经验模型,只会去考虑环境光的影响,并且不会去精确的描述,而只是用一个简单的式子表示
在这里插入图片描述
其中Ka代表物体表面对环境光的反射率,la代表入射环境光的亮度,Ienv 存储结果,即人眼所能看到从物体表面反射的环境光的亮度。
在这里插入图片描述
泛光模型只能让我们看到一个物体的平面形状,怎么能够有体积感呢,这就要添加漫反射了,即Lambert漫反射模型。

2.2漫反射光照

Lambert漫反射模型其实就是在泛光模型的基础之上增加了漫反射项。漫反射便是光从一定角度入射之后从入射点向四面八方反射,且每个不同方向反射的光的强度相等,而产生漫反射的原因是物体表面的粗糙,导致了这种物理现象的发生。
在这里插入图片描述

这种漫反射我们该去怎么模拟呢?首先应该考虑入射的角度所造成的接收到光强的损失,如下图所示:
在这里插入图片描述
只有当入射光线与平面垂直的时候才能完整的接受所有光的能量,而入射角度越倾斜损失的能量越大,具体来说,我们应该将光强乘上一个cos(θ)= l·n其中l是入射光方向,n为平面法线方向。

除了入射角度之外,光源与照射点的距离也应该考虑,直观来说,离得越远当然强度也就越弱!具体来说如图所示:
在这里插入图片描述

图中中心为一个点光源,光线均匀的向周围发射,可以想象光源发射出来的能量其实是一定的,那么在任意两个圈上接受到的能量之和一定相等。而离圆心越远,圆的面积越大,单位面积所接受能量也就越弱,因此会将光强I除r^2r

在这里插入图片描述

其中Kd为漫反射系数,I入射光强,n,l分别如图中所示为法线向量和入射方向,max是为了剔除夹角大于90°的光。
注意漫反射光线强度是与出射方向无关的,因此无论人眼在哪观察接收到的强度都是一样的
将环境光与漫反射一起考虑之后:
在这里插入图片描述
因为漫反射的存在我们已经能够很明显的看出茶壶的体积感了,但依然感觉不是很真实,因为缺少了高光

2.3高光光照

在这里插入图片描述
在这里插入图片描述
我们能看到镜面反射(高光)的情况,应该是观察方向和镜面反射方向足够接近的时候
观察方向和镜面反射方向足够接近的时候,其实也就是半程向量与法线方向足够接近的时候
我们衡量能不能看到高光,只要看n和h是不是接近
最前面系数为镜面反射系数
在Blinn-Phong光照模型中,简化了物体表面对镜面反射的吸收。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2.4合成Blinn-Phong光照模型

在这里插入图片描述

3. 着色方法(频率)

在上文中我们讲解完了局部光照模型,其中主要利用了观察方向,入射光线与法线向量的位置关系,但并没有具体说究竟是三角形面的法线向量还是三角形顶点的法线向量,这也就牵扯出了本章内容——着色频率(面着色,顶点着色,像素着色),这3种不同的着色频率其实也就对应了三种不同方法。接下来一一介绍

3.1面着色(Flat Shading)

面着色,顾名思义以每一个面作为一个着色单位。模型数据大多以很多个三角面进行存储,因此也就记录了每个面的法线向量,利用每个面的法线向量进行一次Blinn-Phong反射光照模型的计算,将该颜色赋予整个面,效果如下:
在这里插入图片描述
Flat Shading 虽然计算很快,只需对每一个面进行一次着色计算,但是效果确是很差的,可以很明显的看到一块块面形状。因此一种改进方法就是对三角形面的每个顶点进行着色,再对三角形面内的颜色插值,即Gouraud Shading。

3.2顶点着色(Gouraud Shading)

Gouraud Shading会对每个三角形的顶点进行一次着色,那么首当其冲的问题便是,我们只有每个面的法线向量,如何得到每个顶点的法线向量呢。做法其实很简单,将所有共享这个点的面的法线向量加起来求均值,最后再标准化就得到了该顶点的法线向量了。

有了每个三角形的顶点向量之后,自然就可以计算出每个顶点的颜色了,那么对于三角形内部的每一个点应该怎么办呢?对,就是利用我们在计算机图形学三中所提到了重心坐标来插值了!公式如下:
在这里插入图片描述
其中c1,c2,c3为三角形三个顶点的颜色,α , β , γ为三角形面内一点的重心坐标,c为该点的插值之后得到的颜色。
效果如下:
在这里插入图片描述
可以明显看出相对于Flat Shading,Gouraud Shading的效果有着明显的提升,但这样依然还不是最好的做法,因为我们实际上只对每个三角形顶点进行了着色,然后其它的颜色都是通过插值得到,有没有一种做法可以真正的对每个点用Blinn-Phong模型计算得出颜色呢?没错,那就是Phong Shading了!

3.2.1重心坐标插值

3.2.1.1作用

在图形学中,利用重心坐标在三角形内部进行任何属性(位置、纹理坐标、颜色、法线、深度、材质属性…)的插值。一般我们通过其他步骤都会得到三角形顶点上的属性,但继续计算时需要用到三角形内部的某点的属性值,利用重心坐标可以得到三角形内部该值的平滑过渡。

3.2.1.2什么是重心坐标

重心坐标是由三角形顶点定义的坐标。
三角形上的任一顶点p(x,y)都可以用三个顶点的线性组合表示:p=w1a+w2b+w3c
且系数之和为1:w1+w2+w3=1 (只有系数之和为1,p点才在这个三角形所在的平面上)
当满足三个系数都为非负数时,该点在三角形内部
可以看出,重心坐标是齐次坐标的一种
这三个系数所表示的坐标(w1,w2,w3),就是该三角形上p点的(归一化)重心坐标。
插值举例:假设三角形顶点的三个颜色C1,C2,C3,那么p点的颜色就是 Cp=w1
C1+w2C2+w3C3

3.2.1.3重心坐标与重心不要混淆

三角形内每一个点都有它的重心坐标,换句话说重心坐标其实是三角形内的点换了一个重心坐标系(参考标题3)来表示该点的方法。因此三角形的重心也有它的重心坐标(1/3,1/3,1/3)。
三角形的重心坐标将该三角形分成了三个面积相等的三角形,所以坐标都是1/3。

3.2.1.4计算方法

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

3.2.2透视矫正插值

3.3像素着色

Phong Shading的做法其实也是很好理解的,既然要对每个点都进行光照计算,那么自然我们应该要有每个点的法线向量才可以,在第2章中,我们提到了如何得到每个顶点的法线向量,那么对于三角形内部的每一个点的法线向量自然也可以像插值颜色一般得到:
在这里插入图片描述
其中n0 , n1 , n2 分别是三角形三个顶点的法线向量,α,β,γ为三角形面内一点的重心坐标,n为该点插值之后得到的法线向量。如此便得到了任意一点的法线向量了,也当然可以对任意一点进行Blinn-Phong模型的计算了。最终对比渲染效果如下:
在这里插入图片描述

4.实时渲染管线

所谓图形渲染管线指的是一系列操作的流程,这个流程具体来说就是将一堆具有三维几何信息的数据点最终转换到二维屏幕空间的像素。其实也就是本系列笔记之前的所有知识连贯起来。我们以如下图作为一个总结,再具体分步骤讲解:
在这里插入图片描述
(整个图形管线的步骤可能有不同的分法,不一定就是上图所述的5部分,但整体流程一定是一样的)
首先来看第一个,顶点处理:
在这里插入图片描述
顶点处理的作用是指对所有的顶点数据进行Model,View,和Projection的变换,最终得到投影到二维平面的坐标信息(同时为了Zbuffer保留深度z值)。当然如果超出观察空间的会被剪裁掉
而第二步三角形处理也十分容易理解,就是将所有的顶点按照原几何信息,变成三角面,每个面由3个顶点组成。得到了许许多多个三角形之后,接下来的操作自然就是三角形光栅化了,这也是前几节笔记之中的重点内容之一:
在这里插入图片描述
在进行完三角形的光栅化之后,知道了哪些在三角形内的点可以被显示,那么如何确定每个像素点或者说片元(Fragement)的颜色呢?[注:片元可能比像素更小,如MSAA抗拒齿操作的进一步细分得到的采样点]。那自然就是着色了,也就是片元处理阶段应该做的。
在这里插入图片描述
注意这阶段顶点处理也亮起来是因为我们需要顶点信息对三角形内的点进行属性插值(tips:当然也可以直接在顶点处理阶段就算出每个顶点的颜色值,如Gouraud Shading一样)。当然这一阶段也少不了Z-Buffer来帮助确定,哪些像素点应该显示在屏幕上,哪些点被遮挡了不应该显示
在这里插入图片描述
最后一步!Framebuffer的处理,就是将所有的像素颜色信息整合在一起,输送给显示设备加以显示。这也就完成了整个图形渲染管线了。

5.Texture Mapping 纹理映射

纹理:一张2D图
纹理映射:将这张图覆盖到3D物体上

在这里插入图片描述
无论是球上的图案,以及地板的木头纹理都呈现出了不同的颜色信息,那么回想在讲解Blinn-Phong反射模型的时候曾提到,一个点的颜色是由其漫反射系数决定的,反射什么颜色的光,人眼就能看见什么颜色。那么针对上面这幅图,难道要去针对每一个点自己去设定一个颜色吗?还是说有什么更方便的方法呢?那便是纹理映射了!
在这里插入图片描述

倘若拥有从3维World space到2维Texture space的一个映射关系,那么只需要将每个点的颜色信息即漫反射系数存储在2维的Texture之上,每次利用光照模型进行计算的时候根据映射关系就能查到这个点的漫反射系数是多少,所有点计算完之后,结果就像最左边的screen space之中,整个Texture被贴在了模型之上。
在这里插入图片描述
有了一张Texture之后,这种映射关系究竟是如何表示的呢?这就要从纹理坐标(UV)说起了。在纹理空间之内任意一个二维坐标都在[0,1]之内。如下图是一个可视化纹理坐标的结果:
横轴和纵轴的最大值都为1,为什么整幅texture图可视化之后是红色和绿色呢?可以将(u,v)坐标的两点想象成red和green就能明白了。一幅Texture上的任意一点都可以用一个(u,v)坐标来表示(0<=u<=1,0<=v<=1),因此只需要在三维world space中每个顶点的信息之中存储下该顶点在texture space的(u,v)坐标信息,自然而然的就直接的得到了这种映射关系。

有一种特殊的纹理称为tile,这种纹理的特征是重复拼接之后上下左右都是连续的,因此这种纹理可以复制很多张贴在墙面或地板上。

6.纹理过小和纹理过大

6.1纹理过小

纹理过小的问题相对容易理解,想想我们把一张100x100的纹理贴图应用在一500x500的屏幕之上必然会导致走样失真,因为屏幕空间的几个像素点对应在纹理贴图的坐标上都是集中在一个像素大小之内。那么如果仅仅是使用对应(u,v)坐标在texture贴图下最近的那个像素点,往往会造成严重的走样。

6.1.1双线性插值(Bilinear Interpolation)

第一步,取出离红色点最近的4个黑色顶点,分别算出,该红色点在水平及竖直方向偏移的比率s,t,图示如下:
在这里插入图片描述
接着先利用s,可以线性插值出如下图所示的u0,u1点的颜色值
在这里插入图片描述
利用比例t,颜色值u0,u1插值出红色点的颜色值
如此这样利用两次线性插值,考虑到了所有4个点的颜色值,能够很好的缓解走样失真现象,并且计算速度较高。

6.1.2双三次插值

取周围16个点也是做竖直和水平的插值
每次用4个,做三次的插值,不是用线性的差值
双向三次插值运算量大,但是效果好
好像用不到,知道有这东西就好,需要时再补充

6.2 纹理过大

纹理过大时,一个pixel(屏幕上的)对应了多个texel(三维贴图的那张图) → 采样频率不足导致 摩尔纹+锯齿(走样)
远处地平面的一个像素,对应一个大块的纹理,简单的点采样不行
在这里插入图片描述
采样会引起走样,那么我们不采样,只得到一定范围的平均值。

这是点查询与范围查询的问题

点查询,给出一个点,得到一个点的值
范围查询,不采样,给出一个区域,得到区域的(平均)值
解决方法
在这里插入图片描述

6.2.1 Mipmap 多级渐远纹理

在这里插入图片描述
关于计算Mipmap的示意图
首先我们要把像素覆盖的区域找出来,进行近似

考虑一个像素时,也考虑上周围的点
然后把它们的中心一起映射到UV上计算距离
于是可以用距离为边长的 虚线的正方形框 来近似 映射过来不规则的四边形
层数D约为相邻pixel的映射uv之间的距离取2的对数
D的作用举例
如果区域的大小是1×1 D=0 那么在最原始的等级的Mipmap上找
如果区域的大小是4×4 D=2 那么在第二等级的Mipmap上找,也就是在第二等级上,这个4×4会变成1×1,然后去第二等级上去查这个像素的值,那就是这个区域的平均值
在这里插入图片描述
在这里插入图片描述
单纯只是整数层之间,会有不连续的缝隙
所以如果不是整数层,那么查前后两层,进行双线性插值,然后再进行一次插值
也就是三线性插值,得到结果

在这里插入图片描述

6.2.2各向异性过滤

Mipmap会把远处的细节都模糊掉
因为它只能查询方块的区域内,以及插值毕竟只是近似
各向异性过滤允许我们对长条的区域进行范围查询,但是对于斜着的区域不行
生成各向异性过滤的图(Ripmaps)的开销是原本的三倍
各向异性的意思是,在不同的方向上它的表现各不相同
各向异性的几X是压缩几倍,也就是从左上角往右下角多几层

EWA过滤,把任意不规则的形状拆成很多不同的圆形,去覆盖这个形状
多次查询自然可以覆盖,但是耗时大

参考:

学这几节课+完成作业的内容有点多,所以直接整合和CV了大佬的博客进行巩固和复习,大佬博客链接如下:
图形学数学 | 利用重心坐标平滑插值三角形顶点的任何属性
计算机图形学五:局部光照模型(Blinn-Phong 反射模型)与着色方法(Phong Shading)
计算机图形学六:正确使用重心坐标插值
GAMES101课程学习笔记

补充:

作业3用到的博客:
(深度解析)GAMES 101 作业3:渲染小奶牛
GAMES101 Assignment3
Games101 作业3 环境问题
这次作业太难了…对照着理解把。

  • 22
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值