mirror of
https://github.com/luanti-org/luanti.git
synced 2025-06-27 16:36:03 +00:00
Implement support for FSAA in combination with post-processing (#15392)
- Actually it's MSAA I think, or perhaps the terms are equivalent - I've made it fit into the existing Irrlicht architecture, but that has resulted in code duplication compared to my original "hacky" approach - OpenGL 3.2+ and OpenGL ES 3.1+ are supported - EDT_OPENGL3 is not required, EDT_OPENGL works too - Helpful tutorial: https://learnopengl.com/Advanced-OpenGL/Anti-Aliasing, section "Off-screen MSAA" - This may be rough around the edges, but in general it works
This commit is contained in:
parent
a8ea165042
commit
9b6a399011
23 changed files with 290 additions and 42 deletions
|
@ -675,6 +675,29 @@ IRenderTarget *COpenGL3DriverBase::addRenderTarget()
|
|||
return renderTarget;
|
||||
}
|
||||
|
||||
void COpenGL3DriverBase::blitRenderTarget(IRenderTarget *from, IRenderTarget *to)
|
||||
{
|
||||
if (Version.Spec == OpenGLSpec::ES && Version.Major < 3) {
|
||||
os::Printer::log("glBlitFramebuffer not supported by OpenGL ES < 3.0", ELL_ERROR);
|
||||
return;
|
||||
}
|
||||
|
||||
GLuint prev_fbo_id;
|
||||
CacheHandler->getFBO(prev_fbo_id);
|
||||
|
||||
COpenGL3RenderTarget *src = static_cast<COpenGL3RenderTarget *>(from);
|
||||
COpenGL3RenderTarget *dst = static_cast<COpenGL3RenderTarget *>(to);
|
||||
GL.BindFramebuffer(GL.READ_FRAMEBUFFER, src->getBufferID());
|
||||
GL.BindFramebuffer(GL.DRAW_FRAMEBUFFER, dst->getBufferID());
|
||||
GL.BlitFramebuffer(
|
||||
0, 0, src->getSize().Width, src->getSize().Height,
|
||||
0, 0, dst->getSize().Width, dst->getSize().Height,
|
||||
GL.COLOR_BUFFER_BIT | GL.DEPTH_BUFFER_BIT | GL.STENCIL_BUFFER_BIT, GL.NEAREST);
|
||||
|
||||
// This resets both read and draw framebuffer. Note that we bypass CacheHandler here.
|
||||
GL.BindFramebuffer(GL.FRAMEBUFFER, prev_fbo_id);
|
||||
}
|
||||
|
||||
//! draws a vertex primitive list
|
||||
void COpenGL3DriverBase::drawVertexPrimitiveList(const void *vertices, u32 vertexCount,
|
||||
const void *indexList, u32 primitiveCount,
|
||||
|
@ -1317,6 +1340,8 @@ void COpenGL3DriverBase::setBasicRenderStates(const SMaterial &material, const S
|
|||
GL.LineWidth(core::clamp(static_cast<GLfloat>(material.Thickness), DimAliasedLine[0], DimAliasedLine[1]));
|
||||
|
||||
// Anti aliasing
|
||||
// Deal with MSAA even if it's not enabled in the OpenGL context, we might be
|
||||
// rendering to an FBO with multisampling.
|
||||
if (resetAllRenderStates || lastmaterial.AntiAliasing != material.AntiAliasing) {
|
||||
if (material.AntiAliasing & EAAM_ALPHA_TO_COVERAGE)
|
||||
GL.Enable(GL_SAMPLE_ALPHA_TO_COVERAGE);
|
||||
|
@ -1631,12 +1656,18 @@ IGPUProgrammingServices *COpenGL3DriverBase::getGPUProgrammingServices()
|
|||
|
||||
ITexture *COpenGL3DriverBase::addRenderTargetTexture(const core::dimension2d<u32> &size,
|
||||
const io::path &name, const ECOLOR_FORMAT format)
|
||||
{
|
||||
return addRenderTargetTextureMs(size, 0, name, format);
|
||||
}
|
||||
|
||||
ITexture *COpenGL3DriverBase::addRenderTargetTextureMs(const core::dimension2d<u32> &size, u8 msaa,
|
||||
const io::path &name, const ECOLOR_FORMAT format)
|
||||
{
|
||||
// disable mip-mapping
|
||||
bool generateMipLevels = getTextureCreationFlag(ETCF_CREATE_MIP_MAPS);
|
||||
setTextureCreationFlag(ETCF_CREATE_MIP_MAPS, false);
|
||||
|
||||
COpenGL3Texture *renderTargetTexture = new COpenGL3Texture(name, size, ETT_2D, format, this);
|
||||
COpenGL3Texture *renderTargetTexture = new COpenGL3Texture(name, size, msaa > 0 ? ETT_2D_MS : ETT_2D, format, this, msaa);
|
||||
addTexture(renderTargetTexture);
|
||||
renderTargetTexture->drop();
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue