SSAO核心思想
LearnOpenGL高级光照,SSAO章节,对我个人而言很难理解,半知半解抄完所有代码之后突然顿悟了,故做个总结。
原文:SSAO
核心思想
对于屏幕上的每一个像素(它对应着 3D 世界中的一个点 fragPos),我们都在以该点为中心、以法线 normal 为方向的半球内,随机选取 N 个采样点(比如 64 个)。
然后,我们去检查这 N 个采样点所对应的位置,在真实的场景中是否被其他物体占据。
如果一个采样点的位置被占据了(即有物体比采样点更靠近相机),我们就认为这个采样点对当前像素造成了一次 “遮挡”。
最后,通过统计这 N 个采样点中有多少个造成了遮挡,我们就能计算出当前像素的环境光被遮蔽的程度(occlusion)。遮挡的采样点越多,occlusion 值越高,该像素就越暗。
碎碎念、作图、分析
这个算法本身不难理解,关键就是“遮挡”二字,只是原文里的图越琢磨脑子越乱。
想象一下,正在上课,面前有块黑板,假设你在黑板上画了个圈,你想模拟出那个圈里面的部分黑板表面明暗程度,再假设有个“聚光玻璃罩”,能完全罩住你画的圈,聚集的光完全落在你画的圈里,平时看那块儿是很亮的,但老师来了往前面一站,挡住了一部分光线,那里就暗不少了,因为落进去的光线少了。

能想象出这个场景就离理解原文很接近了,按照原文的理解方式,我们以一个像素为球心作一个半球(切面和法线表面法线垂直),在里面均匀放上一些采样点,然后判断遮挡关系决定明暗。相当于把一个点扩散成一片(还是3D的),让这一片被遮挡的程度决定一个点的明暗而已,这样在我们的视线所及之处,邻近物体被遮挡的一方就会暗一些了(多近取决于我们采样半球空间的大小)。