Merge remote-tracking branch 'origin/ssao' into qzdoom

This commit is contained in:
Magnus Norddahl 2016-10-22 00:14:35 +02:00
commit 2ba7915d1a
5 changed files with 32 additions and 28 deletions

View File

@ -205,12 +205,12 @@ FGLRenderer::~FGLRenderer()
}
if (mBuffers) delete mBuffers;
if (mPresentShader) delete mPresentShader;
if (mPresent3dCheckerShader) delete mPresent3dCheckerShader;
if (mPresent3dColumnShader) delete mPresent3dColumnShader;
if (mLinearDepthShader) delete mLinearDepthShader;
if (mDepthBlurShader) delete mDepthBlurShader;
if (mSSAOShader) delete mSSAOShader;
if (mSSAOCombineShader) delete mSSAOCombineShader;
if (mPresent3dCheckerShader) delete mPresent3dCheckerShader;
if (mPresent3dColumnShader) delete mPresent3dColumnShader;
if (mPresent3dRowShader) delete mPresent3dRowShader;
if (mBloomExtractShader) delete mBloomExtractShader;
if (mBloomCombineShader) delete mBloomCombineShader;

View File

@ -120,6 +120,7 @@ class FRenderState
FShader *activeShader;
EPassType mPassType = NORMAL_PASS;
int mNumDrawBuffers = 1;
bool ApplyShader();
@ -491,6 +492,22 @@ public:
return mPassType;
}
void EnableDrawBuffers(int count)
{
count = MIN(count, 3);
if (mNumDrawBuffers != count)
{
static GLenum buffers[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2 };
glDrawBuffers(count, buffers);
mNumDrawBuffers = count;
}
}
int GetPassDrawBufferCount()
{
return mPassType == GBUFFER_PASS ? 3 : 1;
}
// Backwards compatibility crap follows
void ApplyFixedFunction();
void DrawColormapOverlay();

View File

@ -160,9 +160,8 @@ void FGLRenderer::Set3DViewport(bool mainview)
{
bool useSSAO = (gl_ssao != 0);
mBuffers->BindSceneFB(useSSAO);
GLenum buffers[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2 };
glDrawBuffers(useSSAO ? 3 : 1, buffers);
gl_RenderState.SetPassType(useSSAO ? GBUFFER_PASS : NORMAL_PASS);
gl_RenderState.EnableDrawBuffers(gl_RenderState.GetPassDrawBufferCount());
gl_RenderState.Apply();
}
@ -479,6 +478,11 @@ void FGLRenderer::DrawScene(int drawmode)
static int recursion=0;
static int ssao_portals_available = 0;
if (drawmode == DM_MAINVIEW)
ssao_portals_available = gl_ssao_portals + 1;
else if (drawmode == DM_OFFSCREEN)
ssao_portals_available = 0;
if (camera != nullptr)
{
ActorRenderFlags savedflags = camera->renderflags;
@ -495,35 +499,14 @@ void FGLRenderer::DrawScene(int drawmode)
}
GLRenderer->mClipPortal = NULL; // this must be reset before any portal recursion takes place.
// Decide if we need to do ssao for this scene
bool applySSAO = gl_ssao != 0 && FGLRenderBuffers::IsEnabled();
switch (drawmode)
{
case DM_MAINVIEW: ssao_portals_available = gl_ssao_portals; break;
case DM_OFFSCREEN: ssao_portals_available = 0; applySSAO = false; break;
case DM_PORTAL: applySSAO = applySSAO && (ssao_portals_available > 0); ssao_portals_available--; break;
}
// If SSAO is active, switch to gbuffer shaders and use the framebuffer with gbuffers
if (applySSAO)
{
GLenum buffers[] = { GL_COLOR_ATTACHMENT0, GL_COLOR_ATTACHMENT1, GL_COLOR_ATTACHMENT2 };
glDrawBuffers(3, buffers);
gl_RenderState.SetPassType(GBUFFER_PASS);
gl_RenderState.Apply();
gl_RenderState.ApplyMatrices();
}
RenderScene(recursion);
// Apply ambient occlusion and switch back to shaders without gbuffer output
if (applySSAO)
if (ssao_portals_available > 0 && gl_RenderState.GetPassType() == GBUFFER_PASS)
{
GLenum buffers[] = { GL_COLOR_ATTACHMENT0 };
glDrawBuffers(1, buffers);
gl_RenderState.EnableDrawBuffers(1);
AmbientOccludeScene();
mBuffers->BindSceneFB(true);
gl_RenderState.SetPassType(NORMAL_PASS);
gl_RenderState.EnableDrawBuffers(gl_RenderState.GetPassDrawBufferCount());
gl_RenderState.Apply();
gl_RenderState.ApplyMatrices();
}

View File

@ -227,6 +227,7 @@ void GLWall::RenderFogBoundary()
{
int rel = rellight + getExtraLight();
gl_SetFog(lightlevel, rel, &Colormap, false);
gl_RenderState.EnableDrawBuffers(1);
gl_RenderState.SetEffect(EFF_FOGBOUNDARY);
gl_RenderState.AlphaFunc(GL_GEQUAL, 0.f);
glEnable(GL_POLYGON_OFFSET_FILL);
@ -235,6 +236,7 @@ void GLWall::RenderFogBoundary()
glPolygonOffset(0.0f, 0.0f);
glDisable(GL_POLYGON_OFFSET_FILL);
gl_RenderState.SetEffect(EFF_NONE);
gl_RenderState.EnableDrawBuffers(gl_RenderState.GetPassDrawBufferCount());
}
else
{

View File

@ -41,8 +41,10 @@ public:
gl_RenderState.GetColorMask(saved[0], saved[1], saved[2], saved[3]);
gl_RenderState.SetColorMask(r, g, b, a);
gl_RenderState.ApplyColorMask();
gl_RenderState.EnableDrawBuffers(1);
}
~ScopedColorMask() {
gl_RenderState.EnableDrawBuffers(gl_RenderState.GetPassDrawBufferCount());
gl_RenderState.SetColorMask(saved[0], saved[1], saved[2], saved[3]);
gl_RenderState.ApplyColorMask();
}