着色(shading)
定义
作用于一个物体的材质。
着色不考虑其他物体的存在,所以着色不考虑阴影。
布林冯反射模型Blinn-Phong Reflectance Model
最基础的反射模型
Specular highlights(镜面反射)
Diffuse reflection(漫反射)
Ambient lighting(环境照明)
定义观测基础信息
开展研究前,定义本次观测的基础信息。
法线(垂直于观测点):\(\vec{n}\)
观测方向 :\(\vec{v}\)
光照方向:\(\vec{l}\)
以上都是单位向量。
被照射物体光的接收程度
Lambert 余弦定律
物体接收到的能量与射入方向l与观测点的法线夹角有关
物体发生旋转后,接收到的光强度自然发生了变化,\(60^\circ\)接收的光强相比垂直方向少了一半
假设物体单位面积接收到的光强为1
那么单位面积光强为法线方向上的光线强度\(\vec{l}\cdot\vec{n}*1\)
发光物体的光照强度
光能量削弱的过程分析:
假设上图为一个点光源向四面八方发射光,那么在每一层光中,能量都是等量的(球体半径越小,单位面积的能量越高,能量守恒定律)
半径为R的球的表面积计算公式为\(S=4*\pi*R^2\)
假设在近点处(设半径为I)该点能量为I,在远点出能量可推出为\(\frac{I}{r^2}\)。
漫反射Diffuse reflection
红箭头为自然光射入,蓝色箭头为漫反射的效果
\[L_d=k_d(\frac{I}{r^2})max(0,\vec{n}\cdot\vec{l})
\]
知道了物体表面的光强,也知道了发光物体光照强度与距离的关系后就可以分析物体的漫反射情况了
距离光源r的观测平面的光能量为\(\frac{I}{r^2}\)
物体接受的光能力\(max(0,\vec{n}\cdot\vec{l})\)
kd表示漫反射能量吸收能力系数,若为0,表示光所有能量都被吸收了,表现为黑色,1表示反射全部的光。
与观测角度v无关,因为漫反射往四面八方反射,能量会均匀分布到四面八方(漫反射的特性)。
高光反射Specular highlights
近似于镜面反射方向上的光。
当光源的镜面反射向量R和观察向量v越接近,人眼就能观察到高光。
布林冯模型中优化了这步判断:
\[L_s=k_s(\frac{I}{r^2})max(0,\vec{n}\cdot\vec{h})^p
\]
引入了半程向量\(\vec{h}\),根据平行四边形法则,\(\vec{l}+\vec{v}\)可以获得平行四边形对角线方向的向量
布林冯模型中判断当半程向量\(\vec{h}\)和法线\(\vec{n}\)越接近,那么人眼能观察到的高光就越多
布林冯模型是一个经验形模型,简化了物体表面对于光的吸收程度,主要关注了是否能观察到高光
半程向量的计算比光源的反射向量更好计算,所以通过半程向量与法线来进行判断。
若用反射向量于观测向量来判断是冯模型
指数系数p表示,在一定的角度后就看不到高光了,给与一定系数后会比较符合实际效果。
系数变大后,当角度大于30°后就为0,人眼就看不到高光了,符合实际效果。
ks和p的关系效果图。
环境光Ambient lighting
假设某点的环境光从四面八方过来,接受到的强度是一致的。
跟射入向量l无关。不管从哪个角度看都是一样的,跟观测角度无关。
La:环境光
ka:环境光的系数
Ia:表示某点接受到的环境光是一致的,不变的(为了简化)
三种光结合
\[L=L_a+L_d+L_s\\=k_aI_a+k_d(\frac{I}{r^2})max(0,n\cdot l)+k_s(\frac{I}{r^2})max(0,n\cdot h)^p
\]
着色频率(Shading Frequencise)
什么造成了三个球的区别?
答:着色频率不同产生的不同
着色到一个一个面上,每一个面有固定的法线,每一个面做一个次着色。
着色到一个一个三角形顶点上,三角形内部颜色运用插值获得。
着色到一个一个每个像素上。
平面着色(FLat shading)
面裁成一个个三角形,对每个三角形获得其法向量(两条向量做叉积)
再根据入射光向量l和观测向量v,等系数获得shading,对每一个三角形shading处理
顶点着色(Gouraud shading)
每一个顶点求出法线向量,再根据入射光向量l和观测向量v,等系数获得shading
由每一个顶点组成三角形,在三角形内部插值获得颜色,获得如下图。
冯着色(Phong shading)
每一个顶点求出法线向量,顶点间构建出三角形
三角形内每个像素插值出独特的法线法相,对每个像素单独shading。
不是布林冯着色,一个是着色模型,一个是着色频率
三者的区别
当模型变得复杂(面数变多),逐面着色不见得比逐像素着色来的差,甚至对于复杂模型来说,逐面着色计算量更小。
问题:怎么求顶点法向量?
假如模型正好是一个球形,那么法线向量就是从圆心到顶点的方向。
但是一般的模型没有那么理想。大佬们就提出一个想法:
某个顶点的法线向量=该顶点所相关的平面向量的加权(与平面的面积相关)平均数
问题:怎么求三角形内部像素的法线呢?
(假设已经通过顶点获取到顶点向量并且连成三角形)
重心坐标(暂时不展开讲解)
渲染管线(Graphics Pipeline OR Real-time Rendering)
着色流程可以发生在顶点处理部分(Vertex Processing),也可以发生在片面处理部分(Fragment Processing)
这取决于选择什么渲染技术,引入了可编程渲染管线
Shader
控制任意片段、顶点、像素如何操作和展示。
shader只控制一个片段或者顶点或者像素。
一个网页在线编写shader:http://shadertoy.com/view/ld3Gz2