改善点光源的阴影贴图性能?

时间:2013-06-02 07:11:45

标签: opengl glsl framebuffer shadow-mapping

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

现在,为了通过减少深度贴图着色器和光照贴图着色器之间的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纹理的某个“层”,同时保留其他图层?

1 个答案:

答案 0 :(得分:2)

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

你必须渲染场景六次。

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

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

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