前言
今天主要讲shading(着色)。在讲着色前,要先讲图形中三角形出现遮挡问题的方法(深度缓存或缓冲)。
先采样再模糊错误:对信号的频谱进行翻译(在这期间会有频谱的混叠),采样就是对这个信号进行截断。此时会发现混叠的信号还是混叠的。
Lecture 07 Shading 1 (Illumination, Shading and Graphics Pipeline)哔哩哔哩bilibili
光栅化内容
画家算法
先给远处的东西画好(做光栅化),然后再给近处的做。这样就可以得到一个处理了遮挡的结果的"画"。
例如画一个正方体,按照后、左、下、右、上、前的顺序画,就可以得到一个正方体。
但是如果画的顺序改一改,可能会出现不同的效果。这是因为左、下、右、上这几个面到我们眼睛的距离在我们看来都是差不多的(视点到面的距离,又叫"深度")
- 需要深度排序(对于n个三角形为0(n log n))可以具有无法解析的深度顺序
因此实际中,不能用画家算法。
深度缓存(缓冲)
由于不能使用画家算法,因此引入深度缓存的算法。
概念
-
这是最终胜出的算法。
-
idea:
存储当前最小值。
每个样本的Z值(像素)需要一个额外的缓冲区用于深度值
-帧缓冲存储器存储颜色值 -深度缓冲区(z缓冲区)存储深度
-
重要:为简单起见,我们假设Z总是正数 (较小的z->更近,较大的z->更远)
图形学中,在渲染成品的图像时,会额外生成一个深度图/深度缓存(只存任何一个像素他所看到的最浅的深度信息)
算法(做法)
一开始我们认为所有记录深度的点都是无限远的。
数字越小代表越近,近的会把远的遮挡。
复杂度
-
以不同的顺序画三角形?
-
最重要的可见性算法:在所有GPU的硬件中实现
我们认为每个三角形中有常数个像素,然后又n个三角形,那么复杂度就是0(n)(个人认为这里就有点离谱了,算法的复杂度要是这么算的话,那就所有都是On了。。。。。不过闫老师补充了下一般一个三角形会覆盖100个左右的像素,那就也行)
假设不会出现两个不同的三角形在一个像素上有同样的深度(在图形学中,这些数字大多都是用浮点型来表示,这意味着总会有些误差,这也因此浮点型的判断相同十分困难,尤其时两个经过运算得来的浮点型更加不可能相同),紫色和红色三角形画的顺序不一样,结果也是一样的。
知识回顾
到目前为止,我们的学习到的内容:模型变换->坐标系变换->投影变换->视口变换->光栅化
着色(Shading)
对不同的物体有不同的材质。
Blinn-Phong模型
Blinn-Phong反色模型是一款着色模型。
-
镜面高光
-
漫反射
-
环境照明
定义
-
在特定阴影点处反射到摄像机的计算机光
-
输入: 观察者方向,v 表面法向,n 光的方向,I(为许多光的每一个) 表面参数(颜色、光泽度等)
目前所说的着色不考虑物体的存在,先不考虑关系打在物体后环境的变化(即没有阴影),只看光找过来物体表面的情况。着色具有着色性。
漫反射(Diffuse Reflection)
-
光均匀地向各个方向散射
-
所有观看方向的表面颜色相同
当一个光线会到达某个点,然后这个光线会被均匀的反射出去,这就叫漫反射。
能量的接收
-
但是接收到多少光(能量)呢? 一朗伯余弦定律
-
立方体的顶面接受一定量的光
-
60°旋转立方体的顶面拦截了一半的光线
-
一般来说,单位面积的光与cos 0=l·n成正比(朗伯余弦定律)
其实就是光通量。
此时就可以算出,这个着色点接收到的光的能量。
能量的发射
假设一个点光源。任何时刻,点光源辐射到四面八方。
一个单位的距离上,光的强度为I。那么在距离为r时,强度为I/r2
光传播的能量和距离成反比。
此时就可以通过物体距点光源的距离,算出来点光源发送到该物体表面的光的能量。
漫反射的能量
-
Ld:漫反射光
-
kd:传播系数(颜色)
-
(I/r2):能量到达阴影点
-
max(0,n·l):阴影点接收的能量
向量点乘(n·l)<0时,表示这个光线从下面打向了物体的表面,此时是没有任何物理意义的(也可以认为我们一般是不会考虑物体内部有光源向外的),因此不考虑。所以这里要用max。
这个shadingPoint是会吸收一部分的光/颜色,它会有一定的吸收率,我们就定义一个系数kd。
总结
本节课讲的东西比起前面来说,难度直线下降!
今天主要讲着色,讲着色前补充了前面光栅化深度缓存的知识。
光栅化内容中,首先讲解了画家算法的思想。由于画家算法无法很好的满足计算机图形学的需求,因此引入深度缓存的概念。
-
每个导出的图像都有一张对应的深度图,这个深度图记录着所有像素的深度信息。
-
此外还讲了深度缓存算法的实现方法,其本质就是一个双重循环。
着色部分通过Blinn-Phong反色模型引入漫反射、高光等显示中光照的效果情况。
-
主要讲了物体漫反射中,光的能量问题。
-
着色点平面与光发现的角度可以得到着色点对光能量接收的情况。
-
光源与物体的距离可以得到着色点处光能量的发射状况。
-
通过光能量的接收和发射状况,我们就可以量化漫反射的能量。