这是本系列的第六篇笔记,涉及原课程第八课的内容(课程视频、课件)。这节课主要讲解了 Blinn-Phong 反射模型的高光、环境光部分,以及着色频率、实时渲染管线等。
Blinn-Phong 反射模型(剩余部分)
- 高光部分 Specular highlights
- 观察角度接近入射光的镜面反射方向时,高光较明显
- Blinn 对此进行了改进,使用了半程向量
- 半程向量 \(\vec h=\text{bisector}(\vec v, \vec l)=\frac{\vec v+\vec l}{|\vec v+\vec l|}\)
- 当半程向量与法线 \(\vec n\) 相接近时,高光较明显
- \(L_s=k_s(\frac{I}{r^2})\max(0, \vec n \cdot \vec h)^p\)
- 由于是模拟高光效果,\(k_s\) 一般设置为白色
- 幂次 \(p\) 越高,则容忍度越低(高光越集中)
- 一般取值在 \([100, 200]\) 之中
- Blinn 对此进行了改进,使用了半程向量
- 观察角度接近入射光的镜面反射方向时,高光较明显
- 环境光照部分 Ambient lighting
- 用常数来简单地模拟环境光照
- \(L_a=k_a\,I_a\)
- \(k_a\) 材质的环境光系数,可供调节
- \(I_a\) 全局的环境光强度
- 更佳的效果:应当使用全局光照
- 最终的 Blinn-Phong 反射模型计算公式:
- \(\begin{aligned}L&=&L_s+L_d+L_a\\&=&k_s\frac{I}{r^2}\max(0, \vec n\cdot\vec h)^p\\&=+&k_d\frac{I}{r^2}\max(0, \vec n\cdot\vec l)\\&=+&k_a\,I_a\end{aligned}\)
着色频率 Shading Frequencies
- Flat shading
- 整个三角形共用该面的法线与颜色(shading 一次)
- Gouraud shading
- 先计算出三个顶点的法线与颜色(shading 三次),其他像素以插值形式计算得到颜色
- Phong shading
- 先计算出三个顶点的法线,其他像素以插值形式计算得到法线,并计算颜色(为每个像素做 shading)
- 如何求顶点的法线
- 取相邻面的法线求(加权)平均
- 如何求像素的法线
- 重心坐标插值 Barycentric interpolation
实时渲染管线 Real-time Rendering Pipeline
原始的顶点数据 | |
Vextex Processing - MVP, texture mapping - | ⬇️ |
⬇️ | 屏幕空间上的顶点 |
Triangle Processing | ⬇️ |
⬇️ | 屏幕空间上的三角形 |
Rasterization - sampling - | ⬇️ |
⬇️ | 片元 ( ≈像素) |
Fragment Processing - z-buffer, shading, texture application - | ⬇️ |
⬇️ | 已着色的片元 |
Framebuffer Operations | ⬇️ |
图像(像素的组合) |
着色器 Shader
- 编程顶点、片元的处理流程
- 每个顶点/片元执行一次(无需自行编写循环)
纹理映射 Texture Mapping
- 纹理坐标:无论纹理大小,一般映射到 \(uv \in [0, 1]^2\)
- 三角形的每个顶点都对应着一个 uv 坐标
- 四方连续 tilable 概念:在重复铺设的情况下,上下左右可以无缝衔接
更新:GAMES101 作业已于近期(2021/06/08)重新开放提交啦!敬请关注官方公众号图形学与混合现实研讨会与课程主页跟踪最新情况~