Sign in to follow this  
Quat

CSM Speed Improvements

Recommended Posts

I'm rendering outdoor scene with 6 cascades. I use spheres to avoid the "flicker" problem when the camera moves. The main problem is that the last two cascade spheres are very large (containing a good portion of my entire level). Therefore, I get a lot of "draw call" overhead.

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?

Share this post


Link to post
Share on other sites
Hello next gen game maker! I mean, by Zeus six???

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: [url="http://www.cg.tuwien.ac.at/research/publications/2011/bittner-2011-scc/bittner-2011-scc-paper.pdf"]http://www.cg.tuwien...1-scc-paper.pdf[/url]
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: [url="http://advances.realtimerendering.com/s2012/insomniac/Acton-CSM_Scrolling%28Siggraph2012%29.pdf"]http://advances.real...ggraph2012).pdf[/url]
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

Share this post


Link to post
Share on other sites
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

Share this post


Link to post
Share on other sites
[quote name='Tournicoti' timestamp='1348751855' post='4984337']
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
[/quote]
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.

Share this post


Link to post
Share on other sites
[quote name='B_old' timestamp='1348756738' post='4984367']
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.
[/quote]
Hello, no I haven't tried with instancing .... I've used [url="http://http.developer.nvidia.com/GPUGems3/gpugems3_ch10.html"]this [/url] , using the geometry shader method
[img]http://public.gamedev.net//public/style_emoticons/default/smile.png[/img]

Share this post


Link to post
Share on other sites
Hi,

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!

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this