1. Blinn-Phong 反射模型
1.1 漫反射项
独立于视图方向的着色。

Ld=kd(I/r2)max(0,n⋅l)
- Ld :漫反射的反射光。
- kd :漫反射系数,向四周漫射的光通量与总的反射光通量之比。
- (I/r2) :在着色点处的光的能量(该式根据光的能量衰减模型来获得)。
- max(0,n⋅l) :着色点接收到的光的能量(根据兰伯特余弦定律,特别地,当余弦为负数时,能量为零)。
1.2 镜面反射项(Blinn-Phong 模型)
强度取决于视图方向

观察到“高光”的条件:观察方向与镜面反射方向接近时,即 v 和 R 足够接近。
v 与镜面反射方向接近 ⇔ 半程向量(half vector)接近法向量

hLs=bisector(v,l)=∥v+l∥v+l=ks(I/r2)max(0,cosα)p=ks(I/r2)max(0,n⋅h)p
- h :半程向量,向量 v 和 l 的角平分线。
- Ls :镜面反射光。
- ks :镜面反射系数,通常设置为“白色光”。
- p :随着指数 p 的增加,反射波瓣变窄,此时只有“足够接近”时才会产生镜面反射。


1.3 环境光照项
该部分着色不依赖于任何条件
- 添加恒定颜色,表现出忽略的照明和填充黑色阴影;
- 是一种近似的/假的。

La=kaIa
- La :反射环境光。
- ka :环境光系数,该着色点的颜色。
1.4 实例

L=La+Ld+Ls=kaIa+kd(I/r2)max(0,n⋅l)+ks(I/r2)max(0,n⋅h)p
2. 着色频率(Shading Frequencies)

2.1 平面着色(flat shading)
为每个三角形平面进行着色
- 将三角形面视为单位平面,对应一个法向量。
- 该方法不适合光滑表面。
2.2 Gouraud 着色(Gouraud shading)
- 先计算每个顶点的着色;
- 在三角形上根据对应的三个顶点的着色进行插值获得三角形的颜色;
- 每个顶点都有其对应的一个法向量。
2.3 Phong 着色(Phong shading)
- 在 Gouraud 着色的基础上,对三角形内部的每个像素进行插值着色。
- 在每个三角形上插入法向量。
- 计算每个像素的完全着色模型。
- 注意该处指的是一种着色频率,不是 Blinn-Phong 反射模型。
2.4 三种着色频率

NOTE:当几何面数较大,模型足够复杂的情况下,可以使用相对简单的着色模型。
2.5 定义每个顶点的法向量

最好的方法是从基础几何体获取顶点法线

一般情况下,从三角形面推断顶点法线
Nv=∥∑iNi∥∑iNi

3. 实时渲染管线

3.1 着色代码
- 程序顶点和像素处理阶段。
- 代码中仅需要描述单个顶点(或像素)上的操作。
GLSL片段着色器程序示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| uniform sampler2D myTexture;
uniform vec3 lightDir;
varying vec2 uv;
varying vec3 norm;
void diffuseShader() { vec3 kd; kd = texture2d(myTexture, uv); kd *= clamp(dot(–lightDir, norm), 0.0, 1.0); gl_FragColor = vec4(kd, 1.0); }
|
- 着色器功能每个片段执行一次。
- 在当前片段的屏幕样本位置输出表面颜色。
- 此着色器此时执行纹理查找以获取表面的材质颜色,然后执行漫反射照明计算。
3.2 参考网址
http://shadertoy.com/view/ld3Gz2