好的,这基本上是一个引擎设计问题。我说到现在是优化渲染过程并开始使用阴影的时候了。目前我的引擎只渲染阴影贴图。对于大约5个投影阴影贴图和5个立方体贴图阴影,我在GT 640上得到235FPS左右(所有阴影都是512x512分辨率)。如果我将分辨率更改为2048x2048,我会得到55FPS,这实际上非常好。但我仍在考虑重新设计阴影贴图渲染,这就是为什么我打开这个话题只是为了讨论。我正在考虑两种方法,我希望您能分享想法或经验。
第一种方法是基于我所说的直接阴影映射方法。每个灯具有它自己的帧缓冲对象,具有16浮点RG纹理(用于方差阴影)。在我脑海中浮现的一个想法是拥有两种类型的fbo。如果光是完全静态的,我将只渲染静态对象并保存深度缓冲区(静态对象深度缓冲区)。这只需要渲染一次。现在,我只使用动态对象渲染第二个帧缓冲区,并将其与"静态深度缓冲区" (当渲染动态以进行早期z测试和丢弃片段时,使用静态深度缓冲)。每当光锥台内的物体移动或另一物体进入平截头体时,重复该步骤。 "静态深度缓冲区"复制,动态渲染并与静态合并。通过这种方式,我可以避免在每个帧上方和上方渲染静态对象。但我在这里的观点是内存开销。考虑使用50多个灯光的场景(其中一些点灯具有立方体贴图阴影)和可能的大量内存。
第二个方法就像我之前在互联网上发现它被称为"重要性阴影映射"我猜。该引擎具有例如10个投影阴影图和5个立方体图阴影。在进行平截头体剔除以及要渲染的对象和灯光列表时,10个投射光和5个点光源将分配给等待的阴影贴图。这种方式引擎仅限于几个阴影,并保存内存。但在这种情况下,我无法实现分离的静态和动态阴影系统。或者也许我可以将两种方法结合起来,每个灯只保存静态深度缓冲区"并将它与引擎阴影贴图结合起来?
使用第二种方法,我脑海中浮现的另一件事是检测哪些阴影落入摄像机视野。例如:一个立方体对光可见,但对相机不可见。显然,最终图像上可能会看到立方体的阴影。这取决于光线和相机的定位和旋转方式。有时立方体的阴影可能会影响最终图像,有时则不会。我的想法是对CPU进行简单的测试,以确定阴影是否可见。进行简单的边缘检测我可以创建一个多边形,从光点指向立方体AABB边缘并进入距离(由光照范围限定)。然后,我可以检测此多边形是否与相机截头相交,以确定相机是否可以看到阴影,从而将其从渲染到阴影贴图中丢弃。
这些是一些简单的想法,我想你对它们的想法?什么可以做,什么值得尝试。