我正在用阴影贴图制作点光,目前我已经完成了六个深度贴图纹理,每个纹理单独渲染并应用到光贴图上。这工作得很好,但性能成本很高。
现在,为了通过减少FBO变化和深度贴图着色器和光贴图着色器之间的着色器交换来提高性能,我正在考虑几种方法。第一种方法是使用一个比阴影贴图大6倍的纹理,并"一次"渲染所有的点光深度贴图,然后使用这个纹理在一次调用中布局光贴图。有可能只渲染部分纹理吗?
为了详细说明第一个例子,它应该是这样的:
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的纹理,并填充之前渲染的纹理。但带宽和每像素采样率保持不变。
在保留其他部分的同时渲染一部分可能会用模板缓冲区完成,但在这种情况下,我不认为创建组合阴影地图有任何意义。
希望这对你有帮助。