I am targetting a device with a PowerVR GPU. I know these models are known for fast MSAA.
I need to do post processing on a scene and was wondering what would be the most efficient way to do it?
I have access to OpenGL ES 3.0.
FBO + Texture MSAA -> Blit -> FBO2 Non MSAA -> Fullscreen Quad -> Backbuffer
3 FBO + Texture MSAA -> Fragment shader with texelFetch Fullscreen quad -> Backbuffer
Whenever I use 3 the result is always worse than the blit result. I just average the 4 samples manually in a shader.
Would very much appreciate a hint on this because I want to utilize the hardware in the best way with MSAA instead of using something like FXAA.
Can you elaborate on exactly what kind of post-processing would you like to do, and on what kind of input data?
Generally (working on Low Dynamic Range, LDR data) you would resolve the MSAA render target to a non-MSAA one, and do post-processing on that.
However with High Dynamic Range (HDR) data you can’t do that, and you have to have each sample individually tonemapped before resolving.
Mobile (tile-based) hardware is generally good at the former one, since they use their Pixel-Local-Storage (PLS) to do essentially free MSAA resolve on-chip. However as soon as you need to do a scatter/gather kernel on your data before resolving (for example a depth of field effect), you can’t use PLS (effectively) anymore and writing data out to the main memory will always cost you bandwith. This means that you can’t have a cheap (on-chip) resolve in the latter case.