CSM Speed Improvements
#1 Members - Reputation: 347
Posted 26 September 2012 - 01:53 PM
I tried updating one cascade per frame, but when the camera moved very fast, I could notice a quick flickering error. Most likely because the camera no longer matches the camera that was used when a cascade was updated, so it doesn't correct until the cascade is "updated".
I'm going to try static shadow maps for far distances. Of course, they will not support animated meshes. Any other ideas?
#3 Members - Reputation: 561
Posted 26 September 2012 - 03:19 PM
Anyway, depending on your problems I can think of two things.
This should help cull a lot of stuff out, and give you speedup at least: http://www.cg.tuwien...1-scc-paper.pdf
Think of it as "sparse shadow caster culling" or rather, just culling out objects that aren't going to directly affect the players view from the shadow map.
Another, more relevant to the draw call problem is this: http://advances.real...ggraph2012).pdf
It's essentially shadow map cache for CSM. Not sure how you'd adapt this too well to a moving overhead lightsource/the sun. But maybe you're doing an all static sun all the time, in which case the above should work out very well indeed.
Edited by Frenetic Pony, 26 September 2012 - 03:21 PM.
#4 Members - Reputation: 527
Posted 27 September 2012 - 07:17 AM
The geometry is provided to the geometry shader with a 8-bit (max 8 splits) mask so that the geometry shader is dispatching the geometry on the appropriate render targets only.
The drawback is that I have also to compute these flags using each split frustum. (ie frustum culling for each split)
Hope it can help (?)
Nico
#5 Members - Reputation: 386
Posted 27 September 2012 - 08:38 AM
Have you tried it without the geometry shader? My experience with using geometry shaders to render something from different views have been discouraging in the past. I'm curious whether newer graphics cards make this more feasible.I use a geometry shader to dispatch the geometry on the render targets. (I can't use instancing in my case, at least not easily, because I already use instancing to automatically render duplicated geometry.)
The geometry is provided to the geometry shader with a 8-bit (max 8 splits) mask so that the geometry shader is dispatching the geometry on the appropriate render targets only.
The drawback is that I have also to compute these flags using each split frustum. (ie frustum culling for each split)
Hope it can help (?)
Nico
#6 Members - Reputation: 527
Posted 27 September 2012 - 10:02 AM
Hello, no I haven't tried with instancing .... I've used this , using the geometry shader methodMy experience with using geometry shaders to render something from different views have been discouraging in the past. I'm curious whether newer graphics cards make this more feasible.
#7 Members - Reputation: 1204
Posted 28 September 2012 - 08:29 AM
The method described in the provided link is something to be avoided (as far as I know), The geometry shader can't handle efficiently outputting lots of primitives.
However, the geometry shader has its use. You can use the GS to define the render target index. You should modify your instancing code in a way that you have the render target index available for shadow rendering. So instead of drawing your scene * number of cascades times, you can draw everything in a single loop. Although drawing the meshes belonging to several cascades multiple times, your total number of draw calls doesn't increase.
Cheers!






