1 概述
1.1 什么是全局光照(GI)?
全局光照 = 直接光照 + 间接光照,GI非常重要,但是很复杂,但如果只有考虑直接光照,很多地方都是黑的,减少了渲染的真实感。
1.2 光照模型处理间接光照的方法
Bling-Phone模型处理间接光照的方法:假设接收各个点的间接光照都是相同的,分解为环境光项。
1.3 实时全局光照的思想
实时渲染中,通常只考虑一次间接光照,把一切被直接光照照亮的物体称为次级光源。
2 GI的主要问题
需要知道什么来计算着色点p的间接光照?
主要有两项:
- 哪些surface patches能被直接照亮?
- 每一个surface path对着色点p的贡献是多少?
3 方法一:Reflective Shadow Maps(RSM)
在游戏中常常用来做手电筒(flashlights)的效果。
3.1 使用shadow map来寻找能被直接照亮的点
思想:将每一个shadow map上的像素当成次级光源。
问题:需要知道每个像素位置每个出射方向的radiance,但实际上只能知道到相机的方向。
假设:所有的反射物都是diffuse的(不要求点p是diffuse的),因此点p的所有出射方向是相同的。
3.2 对直接照亮的patch进行积分计算着色点p的contribution
L o ( p , ω o ) = ∫ Ω p a t c h L i ( p , ω i ) V ( p , ω i ) f r ( p , ω i , ω o ) cos θ i d ω i = ∫ A p a t c h L i ( q → p ) V ( p , ω i ) f r ( p , q → p , ω o ) cos θ p cos θ q ∥ q − p ∥ 2 d A \begin{aligned} L_o\left(\mathrm{p}, \omega_o\right) &=\int_{\Omega_{\mathrm{patch}}} L_i\left(\mathrm{p}, \omega_i\right) V\left(\mathrm{p}, \omega_i\right) f_r\left(\mathrm{p}, \omega_i, \omega_o\right) \cos \theta_i \mathrm{~d} \omega_i \\ &=\int_{A_{\mathrm{patch}}} L_i(\mathrm{q} \rightarrow \mathrm{p}) V\left(\mathrm{p}, \omega_i\right) f_r\left(\mathrm{p}, \mathrm{q} \rightarrow \mathrm{p}, \omega_o\right) \frac{\cos \theta_p \cos \theta_q}{\|q-p\|^2} \mathrm{~d} A \end{aligned} Lo