Metalights : Improved Interleaved Shading 论文解析

在这里插入图片描述在这里插入图片描述

交错采样

本文是在交错采样的基础上进行的一个改进版。我在使用原本的交错采样过程中产生了闪烁的效果,闪烁原因很简单,就是交错采样的本质就是想用一个像素去代替周围的像素去计算光照,这样就大大减少了需要计算光照的像素,而这样一来就会出现闪烁的问题。闪烁的本质就是采样率不够,因为周围的光照计算都落到了一个像素的头上,那个这个像素在某一帧光照的贡献发送突变的话,那么就会发送闪烁。如果我们正常的计算光照,某一个像素光照发生突变的话周围的像素并不会受到影响,所以看起来就很难看出来抖动。因此我又想采用交错采样的大幅优化,又想解决闪烁的问题,所以就发现这篇文章。由于本文是在交错采样基础上进行的改进,因此需要大家已经看过交错采样这篇文章才行。

增强交错采样

本文的思路和实现都是非常的简单。其实本文就是发现了,我们在计算光照的时候,每一块所对应的光源强度相差可能非常大,比如说有的块光照非常强,而有的块又非常弱。而这些块本质上就是把局部的像素分到不同的块中,让他们单独计算一点光照,然后再收集起来。如果有的块光照非常强,有的块光照非常弱,这样一来,如果这个非常强的一块所对应的光照强度发生了突变,那么就会产生非常明显的闪烁。

因此本文的思路就是将光源按照重要度进行一个排序,然后再将这些光源均匀进行分堆,每一堆的重要度都差不多,如此一来对于某一个像素,与他周围的像素大家计算的光源都差不多.这样如果某一个像素的光照强度发送了突变,周围的像素可以进行一个缓冲,从而减少闪烁的现象。

光源重要度

那本文的核心就是如何确定光源重要度的问题。作者给出的解决办法就是我们先渲染一个低精度的场景,然后依次遍历每个光源,然后计算每个光源对这个场景的每个像素的光照贡献度的综合作为重要度。

计算低精度场景

在这里插入图片描述
计算低精度的场景的时机要在光照计算之前即可。我们假设我们低精度的场景宽高为LowWidth,LowHeight。那么我们应该每间隔 Width/LowWidth,Height/LowHeight这么大的间接进行一下场景的采样即可得到一个低精度的场景。

光源重要度计算

在计算完低精度场景之后并且在计算光照之前。我们遍历每一光源,然后对这个低精度的所有像素计算光照强度,然后把每个像素的光照强度之后作为光源重要度即可。然后按照光照重要度进行排序,在分类即可。可以用计算着色器进行排序分堆也可以在CPU上进行排序分堆。我推荐是用计算着色器进行排序,如此一来就不用进行GPU与CPU的数据传输,可以大大的降低时延。
在这里插入图片描述

结果

在这里插入图片描述
在这里插入图片描述
第一张是用本文优化后的,第二张是未经优化的。从中间红框区域大家可以看到第一张的网格确实要比第二张更少点,但是这个优化还是不太明显。
不过这篇文章确实给了我很多启发,从一开始学习写代码,大家都说排序耗时,长此以往我就非常排斥使用排序来解决问题,很多时候根本都想不到还可以用排序来解决问题,这确实是一个不太好的现象。排序是很有效的一个手段,不能因为耗时就完全不去利用他。

代码链接 : https://github.com/AngelMonica126/GraphicAlgorithm/tree/master/TestCase_004_A

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章