2013-06-02 46 views
1

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

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

+2

实际使用几何着色器进行分层渲染怎么样? http://www.opengl.org/wiki/Geometry_Shader#Layered_rendering – Grimmy

+0

@Grimmy这可以工作,但我尝试不使用GS出于兼容目的。 – manabreak

+0

我不知道你有多少关于阴影映射的知识以及阴影应该具有的质量。所以我想提一些像_Cascaded Shadow Maps_,_Variance Shadow Maps_和_Perspective Shadow Maps_这样的技术,您可能应该在尝试优化之前考虑这些技术。因为取决于你使用的技术,你可以用它来优化。 –

回答

2

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

您必须渲染场景六次。

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

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

希望这会有所帮助。对于任何反馈,我们都表示感谢。