提高点光源的阴影贴图性能?

Posted

技术标签:

【中文标题】提高点光源的阴影贴图性能?【英文标题】:Improving shadow map performance of point lights? 【发布时间】:2013-06-02 07:11:44 【问题描述】:

我正在使用阴影贴图制作点光源,目前我使用六个深度贴图纹理完成了它,每个纹理都单独渲染并应用于光照贴图。这工作得很好,但性能成本很高。

现在,为了通过减少深度贴图着色器和光照贴图着色器之间的 FBO 更改和着色器交换来提高性能,我正在考虑几种方法。第一个涉及拥有一个比阴影贴图大六倍的纹理,并“一次”渲染所有点光深度图,然后使用此纹理在一次调用中布置光照贴图。是否可以只渲染部分纹理?

为了详细说明第一个示例,它会是这样的:

1. Set shadow map size to 128x128
2. Create a depth map texture of 384x256 (3 x 2 shadow map)
3. Render the first 'side' of a point light to the rectangle (0, 0, 128, 128)
4. Render the second 'side' to the rectangle (128, 0, 128, 128)
5. - 9. Render the other 'sides' in a similar manner
10. Swap to light map mode
11. Render the light map in a single call using the 'cube-map'-ish depth texture

我认为的第二种方法是使用 3D 纹理而不是部分渲染,但我仍然有一个类似的问题:我可以只渲染 3D 纹理的某个“层”而保留其他层吗?

【问题讨论】:

实际使用几何着色器进行分层渲染怎么样? opengl.org/wiki/Geometry_Shader#Layered_rendering @Grimmy 这可能行得通,但出于兼容性目的,我尽量不使用 GS。 我不知道你对阴影贴图了解多少,阴影应该有什么质量。所以我想提一些技术,如 Cascaded Shadow MapsVariance Shadow MapsPerspective Shadow Maps,您可能应该在尝试之前考虑这些技术进行优化。因为根据您使用的技术,您可以用来优化的技术有限 您可以同时支持(GS 和非 GS)版本。说到性能,很难说你会从中获得什么。过去我做了太多“明显的优化”,导致完全没有收获。也许你是对的,有一种更快的方法..谁知道.. :) 【参考方案1】:

为什么组合阴影贴图会有优势?

你必须渲染场景六次。

您可以渲染 6 次 128x128 FBO,然后创建 256x384 纹理并用之前渲染的纹理填充它。但是每个像素的带宽和采样率保持不变。

在保留其他部分的同时渲染一个部分可能会使用模板缓冲区完成,但在这种情况下,我看不到创建组合阴影贴图的任何意义。

希望这会有所帮助。任何反馈将不胜感激。

【讨论】:

以上是关于提高点光源的阴影贴图性能?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 OpenGL 中使用立方体贴图数组来渲染带有阴影贴图的多个点光源?

如何获得可用于点光阴影贴图的投影矩阵?

带有立方体贴图的 OpenGL 点光阴影映射

ShaderLab学习小结简单的支持光照贴图的shader

✠OpenGL-8-阴影

◰GL-阴影贴图核心步骤