Lecture 8:Shading 2 (Shading, Pipeline and Texture Mapping)
Blinn-Phong 模型的后两种
高光像(高光反射 / 镜面反射)
当我们观察方向和光线反射的方向很接近的时候,那么就会产生镜面反射;
怎么算??
Blinn-Phong 模型中做了一个改进,它发现了,观察方向和光线反射的方向很接近 <=> 平面的法向量和半程向量很接近,所以考虑下面的计算方法:
指数 p 的一个作用:控制高光的衰减大小
环境反射(间接反射)
大胆假设:任何一个点接收到环境的光是一样的!
Ia:表示来自环境的光强
Ka:系数所以可以看到,环境光是一个常数,和观测方向无关!
Blinn-Phong 模型 小结:
把所有的光加起来就是最终结果:
所以:
Blinn-Phong 模型 = 漫反射模型 + 高光反射/镜面反射 + 环境反射
着色频率
着色模型
着色频率不同产生不同的效果:
第一种:对每个三角形的平面进行着色;
(求法线)
第二种:对于每个顶点求一个法线,然后进行着色;
第三种:对于每个像素我们都去着色;
(对每个像素都去求一个法线)
要看情况使用不同的着色频率,当我们的物体的平面比较多的时候(模型足够复杂),这时候我们就可以直接用简单的着色模型了,最终的效果也不会差。
定义一些东西
定义每个顶点的法向量
顶点的法向量 = 相关的面的法向量的加权平均值
定义每个像素的法向量
像素的法向量 = 顶点法向量平面的重心坐标
图形管线(实时渲染管线)
Graphics (Real-time Rendering) Pipeline
定义:如何从 一个场景 -> 一张图 的过程
就是一些列不同的操作:
- 3D模型
- 顶点处理
- 三角形处理
- 光栅化
- 着色
- 输出
现代GPU允许我们自己定义这些操作,所以也叫做 可编程渲染管线(也就是我们讲的Shader)
具体的讲:
对于一个顶点或者一个像素,我们可以自己编程计算,自己规定这个点或者像素最后显示的颜色;(只用统一写一次,应用于每一个点)
顶点着色器:给每个点写一个着色的程序
像素着色器 / 片元着色器:给每个像素写一个着色的程序
现代图形学发展
纹理映射(Texture Mapping)
定义一个点的不同属性,具体讲,对于一个三维空间,我们都可以把它展开成二维平面,从而和图像对于;
那么现在我们要解决的问题就是,我们如何将一张图像(纹理)贴到三维的物体上面?(这个过程就是纹理映射)
其实问题就是,对于物体上的三角形,我们要怎么映射到纹理上的三角形。
这个问题比较复杂…这里我们规定已经是映射好了的。
纹理的坐标:
U V 都在 0~1 之内
思考:
假设我们知道了三角形三个点对应的纹理坐标,我们如何知道三角形内部任意一点的纹理坐标(U V)?
在三角形的三个顶点有各自不同的属性,如何在三角形内部做一个平滑的过渡,使得我们能快速知道三角形内部任意一点通过插值之后的属性是多少?(重心坐标)