1. Screen Space Directional Occlusion
Screen Space Directional Occlusion (SSDO) 是对 Screen Space Ambient Occlusion (SSAO) 的一个改良,其中心思想非常简单,即在对每个 fragment 做半球采样的时候同时累积各个采样方向的 irradiance。假设在半球采样空间中,取均匀分布的N个采样点,每个采样点所占有的 solid angle 为 2PI / N,那么对于任意采样点 s_i ,其贡献的 irradiance 为:
其中L是来自s_i 所在方向的 radiance;V 是visibility function,按照SSAO的方式来获得; cos(theta)是fragment的法线与s_i采样方向的夹角余弦。
将每个采样点贡献的 irradiance 累加起来,乘上漫反射系数 Cdiff 再除以 PI,即得到当前fragment 的 radiance.
2. Indirect Bounces
在SSDO中,那些被遮挡(即 visibility function 的值为0)的采样点是不参与 irradiance的累积的。如果将这些采样点也考虑进来,可以近似的模拟 Indirect Bounces,得到漂亮的 Color Bleeding效果。比如若某采样点s_j,被p点所遮挡,那么根据下面的公式算出p 对当前 fragment贡献的 irradiance,并进行累积即可。
其中 Lp 是 p 点的 radiance, V 的意义同上,后面的一长串类似于 radiosity 中的 form factor.
3. Implementation
下面提供一个很囧的实现。虽然效果不是很理想,但大体上的特征应该还是体现出来了。因为所使用的参数并没有采用正确的物理量纲,结果在实现中不得已添加了很多丑陋的Scaling 系数,看来以后还是不能偷懒啊。
1. Variance Shadow Map (VSM)
2. VSM + SSAO
3. VSM + SSDO
4. VSM + SSDO + First indirect bounce
RM Project: https://files.cnblogs.com/atyuwen/SSDO.rar
增加GPU Pro中的ssdo实现:https://files.cnblogs.com/atyuwen/gpu_pro_ssdo.7z