Join GitHub today
GitHub is home to over 40 million developers working together to host and review code, manage projects, and build software together.Sign up
Multisampled multiview support #2912
We need to support multisampled multview rendering, but how to do so is tricky.
Since we are using texture arrays for multiview, there are two options:
EXT_multiview_texture_multisample has a good brief on the two:
OVR_multiview_multisampled_render_to_texture was first-to-market, and is generally better supported on ES, particularly ES3.0. OVR_multiview_multisampled_render_to_texture is possible to implement on top of EXT_multisampled_render_to_texture, but not, strictly speaking, vice-versa.
The tricky part is the behavior of implicit resolve in OVR_multiview_multisampled_render_to_texture, as described in EXT_multisampled_render_to_texture:
Can we as the browser tell when this happens or prevent it? No and no:
Mid-render resolves cause shimmering artifacts between frames that are interrupted in different places. These artifacts can be acceptable for occasional frames, but it does violate portability of results. (It's these same artifacts that make it inviable to implement EXT_multiview_texture_multisample in terms of OVR_multiview_multisampled_render_to_texture)
It'll take some work in Firefox's WebGL implementation to ensure that we aren't incurring more implicit resolves than we have to, and even then, there will be times we can't protect from implicit resolves. (there are other OpenGL contexts rendering, after all!)
Can we use OVR_multiview_multisampled_render_to_texture to support multisampled multiview? Yes, but imperfectly, with important caveats.
Honestly, I think the fact that OVR_multiview_multisampled_render_to_texture drops unfinished buffers is actually a good thing: it clearly will indicate abuse of mid-frame flushes and will force devs to design more optimal experiences. The way how it is implemented in https://www.khronos.org/registry/OpenGL/extensions/EXT/EXT_multisampled_render_to_texture.txt is harmful, since it hides such design flaws as mid-frame flushes and produces sub-par quality of rendering.
I think we should go down the route of building on top of OVR_multiview_multisampled_render_to_texture because it has the best likelihood of leaving the multisamples in chip memory on tiled architectures. Agree with @Artyom17 's assessment that eliminating shimmering may be something that developers will optimize for.
@jdarpinian spent a long time investigating and eliminating mid-frame resolves in Chrome on Android and, aside from poor application behavior, I'm optimistic that the auto-resolve solution can work well for VR/XR content in all web browsers.