All of our "normal" transparents are rendered at full resolution into the MSAA target before resolve, so they are handled.
Isn't this quite heavy for bandwidth if you are using RGBA16F render target? Transparencies are often BW bound even without MSAA. RGB11F/11F/10F seems quite handy for this kind of usage. I was pretty skeptical about this format at first, because the 10 bit float formats were quite badly implemented in last generation hardware. But it seems to work fine for our physically based rendering output (just enough to keep the banding away). 16 bit floats are of course easier to work with, because you don't need to care that much about losing some precision somewhere in your pipeline.
Really the only issue we have is depth of field, where have a sharp foreground against an out-of-focus background. In those cases if you're not MSAA aware, you can easily "overwrite" your antialiased edges and re-introduce aliasing. I don't have any silver bullets for this, but I'm pretty sure that by using the MSAA depth buffer you could perform a smarter composite that doesn't completely destroy the edges.
Keeping the MSAA depth buffer around is a good idea. I didn't even think about that. Solves some problems nicely.
Indeed, I don't think you can beat optimized deferred renderer when it comes to geometric complexity and perhaps lighting complexity as well. It's cool that you guys got your G-Buffer pass to be so efficient!
The thing I have hated most about deferred rendering is that you need to decompress your DXT data and store that data into an uncompressed buffer, and then read that uncompressed buffer later. That increases the BW cost of each texel quite a lot. We solved that problem, so I am again happy about deferred
On Xbox 360 we have always used 64 bit g-buffer (2x32 bit = half fill rate), and on GCN you can increase your g-buffer up to 128 bits to keep the fill rate acceptable (2x64 bit = half fill rate). I wouldn't personally go beyond that, but many 30 fps games are even willing to go to 1/4 fill rate, and that's quite a bad for many things (especially foliage and trees). I would choose forward over a very fat g-buffer any day.
In our case we were trying to develop and upgrade our shading models so quickly and we had so much diversity, that it was just simpler to not always have to go through a G-Buffer.
Agreed. Traditional g-buffers limit your data layout (as you store your data there). If you store a link to your data (or can calculate it somehow from your depth + pixel location + extra data), and you use some sort of clustered deferred (binning different lighting models to different bins), you don't have these problems. Obviously there's a lots of if's and lots of content pipeline considerations before a system like this is good enough for production.
However I think this is starting to get a bit off-topic from our original point regarding MSAA performance.
We could start a new forward vs deferred thread, since the next gen is here, and things have changed. Many new techniques have been invented for both sides of the fence. Maybe other developers would want to comment about their opinions as well.
Of course there's also the EQAA modes on GCN as well, which add a lot of interesting possibilities (especially when coupled with a custom resolve) even if you don't want to pay for a heavy sample footprint.
It's unfortunate that we have had coverage samples (without backing sample data) on PC hardware for long time, but no rendering API has given the programmer proper access to this data. If this data had been exposed, I think we would have already seen SMAA and/or other high quality PPAA algorithms use this data. It's going to be interesting to see if this extra coverage data alone is enough to boost PPAA quality enough to be the preferred choice at 1080p. Pixel density is now so much higher compared to last generation games that a very good PPAA algorithm (without subsample color data, but with subsample geometry information) could actually be enough.
Why can't you use the MSAA depth buffer (or any other MSAA information) as part of PPAA? That alone should be helpful for better identifying triangles edges.
Yes, you could do it, and that would be good enough for most games. Unfortunately in our case, the depth data is not enough for antialiasing. Our levels are built using a huge amount of small objects. We don't have big objects build purposefully for a single location, because we are heavily focused on user created content. For example a rock wall in our game is built from a big amount of separate rocks clipping each other. We need to antialias the clipping seams as well. Obviously on consoles you could keep the coverage data around (as it's very small) and use that to help in those cases.
I don't see why that would be the case, outside of having a bit of extra data available from your G-Buffer (if you've kept it around at MSAA resolution).
Deferred rendering pipelines with MSAA are often optimized to use sample precision only in areas that need it. On forward rendering you don't usually need this data, so you don't need to do any extra computation (and/or pay any extra storage cost) to calculate the area masks. However again, if you have low level access to the GPU generated MSAA structures, you actually get all this for free...
Slide 31 in BF4 Mantle presentation (
http://developer.amd.com/wordpress/...attlefield-4-with-Mantle-Johan-Andersson.ppsx) gives us information that FMASK, CMASK and HTILE are all exposed by Mantle. I would definitely be happy if we got some access to these structures on cross vendor APIs as well.