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

Opengl 提高点光源的阴影贴图性能?,opengl,glsl,framebuffer,shadow-mapping,Opengl,Glsl,Framebuffer,Shadow Mapping,我正在用阴影贴图制作点光源,目前我已经用六个深度贴图纹理完成了,每个纹理单独渲染并应用于光贴图。这工作得很好,但性能成本很高 现在,为了通过减少FBO更改和深度贴图着色器和光照贴图着色器之间的着色器交换来提高性能,我考虑了几种方法。第一种方法是使用一个纹理,比阴影贴图大六倍,并“一次”渲染所有点光源深度贴图,然后使用此纹理在一次调用中布局光源贴图。是否可以仅渲染部分纹理 要详细说明第一个示例,可以是这样的: 1. Set shadow map size to 128x128 2. Create

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

现在,为了通过减少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纹理的某个“层”而保留其他层吗?

为什么组合阴影贴图有任何优势

您必须渲染场景六次

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

渲染一个部分而保留另一个部分可能使用模具缓冲区来完成,但在这种情况下,我看不到创建组合阴影贴图的任何意义


希望这有帮助。如果您有任何反馈,我们将不胜感激。

如何实际使用几何体着色器进行分层渲染@Grimmy这可能行得通,但我尽量不使用GS来实现兼容性。我不知道您对阴影贴图有多少了解,阴影应该具有什么质量。所以我想提到一些技术,比如级联阴影贴图、方差阴影贴图和透视阴影贴图,在尝试优化之前,您可能应该考虑这些技术。因为根据您使用的技术,您可以使用的优化内容有限。您可以同时支持(GS和非GS)版本。说到性能,很难说你会从中获得什么。在过去,我做了太多“明显的优化”,完全没有任何好处。也许你是对的,有一种更快的方法。。谁知道……)