什么是着色:
The process of applying a material to an object.
对不同物体应用不同材质的过程,不同的材质与光线有不同的相互作用。
着色是局部的! 阴影的产生与着色无关,着色不考虑其他物体的存在
Blinn-Phong着色模型(Blinn-Phong Reflectance Model):
特点:逐像素着色
Specular highlights:高光部分,镜面反射
Diffuse reflection:漫反射部分,光线均匀发散的部分
Ambient lighting:环境光照部分,接收的不是直接光照,而是间接反射光。
(1)漫反射部分:
以下都是单位向量:
shading point:位于物体表面,具有一些平面本身,决定颜色的属性,面积大小为单位面积。
L:shading point向光源的方向
V:观测方向
n:物体表面法线,光线与物体表面法线的夹角为0时,物体表面接收到最多的能量。
满反射获得能量表示方法:
距离点光源为r处获得的能量:I/r²
shading Point获得的能量:
I/r² :光源发射到shading Point处的总光能
max(0,n*l):l·n决定具体有多少能量被吸收,取决于光线与法线的角度
kd:漫反射系数,决定颜色
因为漫反射均匀发散,所以观察到的结果不取决于观察者的位置
(2)高光部分:
特点:高光接近镜面反射,当观察方向与镜面反射方向接近时即观察到高光。
因此入射光线与反射光线的半乘向量接近法线,因此衡量能否看到高光依据半程向量与法线是否接近即可。
ks:镜面反射系数,高光一般是白色。
n·h:决定的是半程向量与法线是否足够接近,镜面反射模型简化掉l·n的计算。
指数p:限制高光范围,因为cos的”容忍度“太高,如下图所示:
在Phong模型中,p一般在100~200之间。
(3)环境光部分:
特点:假设任何点接收到的环境光照都是相同的,和观测方向无关。
作用:保证没有地方是黑的,提升一个亮度
ka:环境光系数
Ia:环境光强度
(4)总公式:
其他着色模型
1、Flat-shading:逐三角形着色
2、Gouraud shading:逐顶点着色
Phong着色开销较大,在一些应用场景,如模型足够复杂,逐面和逐顶点的着色频率较高,效果也未必就次于Phong。
顶点法线的计算:
分情况讨论
(1)如果已知是用三角形模拟物体(比如模拟一个球),则直接按照球的方法计算法线即可。
(2)每个顶点都和很多三角形有关联,则顶点的发现可认为是对应面的法线求平均
得到顶点发现后,求内部像素的法线–>重心坐标
实时渲染管线
什么是图形管线?–> 从场景到图,中间经历了什么过程:
(1)将点投影到屏幕上,连接成三角形
(2)三角形光栅化
(3)对三角形进行着色(如果是逐像素,如Phong,是在光栅化后着色;如果是逐顶点,则在顶点处理后着色)
Shader:
现代GPU部分可编程,决定像素或顶点如何着色的代码叫做Shader,决定顶点的叫VertexShader(顶点着色器),决定像素的叫PixelShader(像素着色器),Shader是一个通用的程序,不针对单个像素。
PixelShader示例:
GLSL:openGL的一个着色语言
一个网站:ShaderToy
纹理映射
每一个三维物体都有一个基于表面的二维坐标:
这个表面,叫做纹理(texture),作用是定义着色时不同点的属性。
纹理映射:将纹理”蒙“在物体表面的过程,纹理坐标又称uv坐标,u和v的范围都在(0,1),三角形三个顶点,每个顶点都对应一个uv坐标:
不同位置映射到相同的纹理:
知道三角形三个顶点的uv坐标,如何求解内部点的uv?还是插值。
什么是插值:三角形的三个顶点有不同的属性,将属性在三角形内部做平滑过渡的过程。