Is Clustered Forward Shading worth implementing?

Started by
45 comments, last by Matias Goldberg 11 years, 2 months ago
deferred shading is really unhandy when it comes to anti aliasing and lighting transparent objects is not solved in this approach.

forward shading is the way to go, I expect in the next generation consoles to go back to it. I use a similar approach on my phone engines, I've a view space aligned 3d grid (texture) that has a 'count' and 'offset' value per voxel, that I use to index into a texture containing the light sources that affect that voxel. the grid creation is done every frame on CPU, I don't have 30k of lights, but I run with antialiasing, I use the same shader for solid and transparent objects, very convenient to use, I can even assign this texture on the vertexshader for lighting particles in a cheap way.

one problem you still have is to apply shadows/projectors, it's solveable by having an atlas and store more data per lightsource (projection matrix, offsets,extends etc), but it makes quite a lot of overhead.

Many have solved transparency with deferred, Epic and Avalanche among them. Anti Aliasing is also doable. Multiple BRDF's are handled straightforward in deferred. You also have direct access to all those buffers should you need anything, and don't have to worry about processing and pixels you can't see it. And most modern hardware, including the 4th Gen Ipad and Tegra 4 from what I've heard, have enough bandwidth and memory to get some sort of deferred done, though if you're doing thousand and thousands of lights mobile probably isn't your target platform anyway.

I'd rather make sure there's not any unnecessary shading going on. Of course you can't do 8xMSAA with deferred, at least not cheaply, but you can do something like SMAA, which looks just as good and is cheaper in any case. I suppose it's all based on what you'd like to be doing. If you've got the time for it, and are on the right platform (new consoles, high end pc stuff) then I don't see any reason not to go deferred. If you don't have the time to solve all those problems, or somethings I'm probably not even thinking of, then forward might be your solution. But calling out all the old problems with deferred isn't relevant, as they've been solved for most part.

Advertisement
Many have solved transparency with deferred, Epic and Avalanche among them. Anti Aliasing is also doable. Multiple BRDF's are handled straightforward in deferred. You also have direct access to all those buffers should you need anything, and don't have to worry about processing and pixels you can't see it. And most modern hardware, including the 4th Gen Ipad and Tegra 4 from what I've heard, have enough bandwidth and memory to get some sort of deferred done, though if you're doing thousand and thousands of lights mobile probably isn't your target platform anyway.

I don't remember Avalanche using Deferred Shading in it's titles. Which titles do use it?

Handling transparency... nice way of saying "solved". Switching to forward is not a "solution", neither is using lighting accumulative aproaches. It's a workaround. Anti aliasing is doable, but at a gigantic cost. I'm talking about MSAA and CSAA (SSAA is always expensive). Not about "FXAA" & Co. which is a cheap trick.

As for multiple BRDFs, it's not straightforward in deferred. It needs an extra cost in the MRT to store material ID, and you either use branching in your code and pray for high branch coherency (low frequency image) to get the best BRDFs (Cook Torrance, Oren Nayar, Phong, Blinn Phong, Strauss, etc) at decent speed, or resort to texture array approaches (which produce very interesting/creative results that I love, but aren't optimal for those seeking photorealism).

So, no, I wouldn't call the old deferred problems as "solved".

I don't see any reason not to go deferred

Forward vs Deferred arguments are silly and useless out of context, because different games are better suited to different pipelines. There is no one-pipeline-to-rule-them-all, and as a side-rant: any engine that lists "deferred shading" on it's feature list is missing the point (an engine should give you the tools to build different pipelines, and a deferred rendering pipe should be in the engine samples/examples, not the core).

There's still many games shipping today that use "traditional forward" rendering, and almost every game is a hybrid, where some calculations are deferred and others aren't.
Choosing where to put calculations in your graphics pipeline is an optimization problem, which means it's unsolvable except in the context of your particular data.

e.g. on my last game, we calculated shadow data in screen-space for some objects (Deferred Shadow Maps), and also used deferred decals, then forward rendered everything, then calculated shadow data in screen-space for some other objects, then applied these 2nd shadow results to the forward-rendered lighting data to get the final lighting buffer.

That's not traditional forward or deferred rendering. Vanilla doesn't work for most games.

Note that Forward+ (aka Clustered Forward, Light Indexed Deferred) is a very new topic and there's a lot of research coming up this year.

The original version (light-indexed deferred) has actually been around for 5 years or so, and is even very easy to implement on DX9! However, DX11 has made these kinds of forward renderers easier and more efficient to implement with less restrictions too, so the idea is making a big comeback wink.png

the reason a lot of games went deferred is that it's not possible on current consoles to go forward. dynamic branching etc. would just kill you, and you don't really have benefits of it as most games are not rendering insane AA resolutions. that might change on future gen, they'll probably be very alike to PCs and there you don't worry about branching, but you want to support high AA resolutions without paying the cost of shading every sub sample.

so the question whether you go deferred or forward is also very much dependent on what your hardware has to offer (beside the question of what you're trying to achive).

[quote name='Krypt0n' timestamp='1358171240' post='5021390']the reason a lot of games went deferred is that it's not possible on current consoles to go forward.[/quote]Many current-gen console games are forward, and forward has stuck around because it's very hard to go deferred on current-gen consoles... The amount of bandwidth required kills you. Even 16-bit HDR (64bpp) is a huge burden on these consoles.

the reason a lot of games went deferred is that it's not possible on current consoles to go forward.

Many current-gen console games are forward, and forward has stuck around because it's very hard to go deferred on current-gen consoles... The amount of bandwidth required kills you. Even 16-bit HDR (64bpp) is a huge burden on these consoles.

the more advanced games are, the more likely they become deferred, the reason is that it's not possible to get the amount of light-surface interactions with forward rendering in a fast way. as you said, it would seem deferred is more demanding, yet it's the only way to go if you want flexibility.

Not really; deferred might have solved some problems with regards to lights but it brought with it a whole host of others with regards to memory bandwidth, AA issues, problems integrating different BRDFs, transparency and other issues which required various hoops to be jumped through.

Going forward hybrid solutions are likely to become the norm, such as AMD's Leo demo which mixes deferred aspects with a forward rendering pass to do the real geometry rendering which can get around pretty much all of those problems (but brings its own compromises).

The point is; all rendering has trade offs and you'll find plenty of "advanced" engines which use various rendering methods - hell, the last game I worked on was all forward lit using baked lighting and SH light probes because it was the only way we were going to hit 60fps on the consoles.

Edit: also a good and advanced engine WONT force you to take one rendering path, it will let the game code decide (the engine powering the aforementioned game can support deferred as well as forward at least...)
the more advanced games are, the more likely they become deferred, the reason is that it's not possible to get the amount of light-surface interactions with forward rendering in a fast way. as you said, it would seem deferred is more demanding, yet it's the only way to go if you want flexibility.


What's 'advanced' mean? Huge numbers of dynamic lights? You can do just as many lights with forward as long as you've got a decent way of solving the classic issue of determining which objects are affected by which lights. Actually, the whole point of tiled-deferred was that it was trying to reduce lighting bandwidth back down to what we had with forward rendering, while keeping the "which light for which object" calculations in screen-space on the GPU.

If your environment is static, then you can bake all the lighting (and probes) and it'll be a ton faster than any other approach! wink.png
Most console games are still using static, baked lighting for most of the scene, which reduces the need for huge dynamic light counts.

Another issue with deferred is that it's very hard to do at full 720p on the 360. The 360 only has 10MiB of EDRAM, where your frame-buffers have to live. Let's say you optimize your G-buffer layout so you've got hardware depth/stencil, and two 8888 targets -- that's 3 * 4bpp * 1280*720, or ~10.5MiB -- that's over the limit and won't fit.

n.b. these numbers are the same as depth/stencil + FP16_16_16_16, which also makes forward rendering or deferred light accumulation difficult in HDR... wacko.png

Sure, Crysis, Battlefield 3 and Killzone are deferred, but there's probably many more games that use forward rendering, even "AAA" games, like Gears of War (and most other Unreal games), L4D2 (and other Source games), God of War, etc... Then there's the games that have gone deferred-lighting (LPP) as a half-way choice, such as GTA4 (or many rockstar games), Space Marine, etc...

Regarding materials, forward is unarguably more flexible -- each object can have unique BRDFs, unique lighting models, and any number of lights. It's just inefficient if you've got lots of small objects (due to shader swapping overhead and bad quad efficiency), or lots of big objects (due to the "which light for which object" calculations being done per-object).
Actually, you mentioned dynamic branches before, but forward rendering doesn't need any; all branches should be able to be determined at compile time. On the other hand, implementing multiple BRDFs in a deferred renderer requires some form of branching (or look-up-tables, which are just as bad).

Also, tiled-deferred and tiled-forward are implementable on current-gen hardware (even DX9 PC if you're careful), so there's no reason we won't see it soon wink.png

As usual, there's no single objectively better pipeline; different games have different requirements, which are more efficiently met with one pipeline or another...

A little off topic but still on topic, does anyone have any links to good tutorials on deferred vs forward rendering? I've read a fair bit about the detail on deferred but would rather get a good grounding on it before look into it further - couldn't find any decent sites with 'why deferred' other than 'you can have more lights'.

Apologies for borrowing this thread quickly...
Not really; deferred might have solved some problems with regards to lights but it brought with it a whole host of others with regards to memory bandwidth, AA issues, problems integrating different BRDFs, transparency and other issues which required various hoops to be jumped through.

exactly, one would think, having no MSAA (for shading), no solution for alphablend, problems with getting different BRDFs running, high memory storage and bandwidth cost, why on earth would anyone do that.

simply because the current gen console hardware does not offer another solution to create worlds that player, designer and artist expect, where you have tons of dynamic lights, where even particles light the close-by geometry.

This topic is closed to new replies.

Advertisement