- reduce the number of direct OpenGL calls done by the post processing steps
This commit is contained in:
parent
ba9a340c1f
commit
46e2e0b57c
5 changed files with 282 additions and 290 deletions
|
|
@ -195,15 +195,10 @@ void FGLRenderer::AmbientOccludeScene()
|
|||
int randomTexture = clamp(gl_ssao - 1, 0, FGLRenderBuffers::NumAmbientRandomTextures - 1);
|
||||
|
||||
// Calculate linear depth values
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, mBuffers->LinearDepthFB);
|
||||
mBuffers->LinearDepthFB.Bind();
|
||||
glViewport(0, 0, mBuffers->AmbientWidth, mBuffers->AmbientHeight);
|
||||
mBuffers->BindSceneDepthTexture(0);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||
mBuffers->BindSceneColorTexture(1);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
mLinearDepthShader->Bind();
|
||||
mLinearDepthShader->DepthTexture.Set(0);
|
||||
mLinearDepthShader->ColorTexture.Set(1);
|
||||
|
|
@ -217,20 +212,10 @@ void FGLRenderer::AmbientOccludeScene()
|
|||
RenderScreenQuad();
|
||||
|
||||
// Apply ambient occlusion
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, mBuffers->AmbientFB1);
|
||||
glBindTexture(GL_TEXTURE_2D, mBuffers->LinearDepthTexture);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||
glActiveTexture(GL_TEXTURE1);
|
||||
glBindTexture(GL_TEXTURE_2D, mBuffers->AmbientRandomTexture[randomTexture]);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
|
||||
mBuffers->AmbientFB1.Bind();
|
||||
mBuffers->LinearDepthTexture.Bind(0);
|
||||
mBuffers->AmbientRandomTexture[randomTexture].Bind(1, GL_NEAREST, GL_REPEAT);
|
||||
mBuffers->BindSceneNormalTexture(2);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
mSSAOShader->Bind();
|
||||
mSSAOShader->DepthTexture.Set(0);
|
||||
mSSAOShader->RandomTexture.Set(1);
|
||||
|
|
@ -251,17 +236,15 @@ void FGLRenderer::AmbientOccludeScene()
|
|||
// Blur SSAO texture
|
||||
if (gl_ssao_debug < 2)
|
||||
{
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, mBuffers->AmbientFB0);
|
||||
glBindTexture(GL_TEXTURE_2D, mBuffers->AmbientTexture1);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||
mBuffers->AmbientFB0.Bind();
|
||||
mBuffers->AmbientTexture1.Bind(0);
|
||||
mDepthBlurShader->Bind(false);
|
||||
mDepthBlurShader->BlurSharpness[false].Set(blurSharpness);
|
||||
mDepthBlurShader->InvFullResolution[false].Set(1.0f / mBuffers->AmbientWidth, 1.0f / mBuffers->AmbientHeight);
|
||||
RenderScreenQuad();
|
||||
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, mBuffers->AmbientFB1);
|
||||
glBindTexture(GL_TEXTURE_2D, mBuffers->AmbientTexture0);
|
||||
mBuffers->AmbientFB1.Bind();
|
||||
mBuffers->AmbientTexture0.Bind(0);
|
||||
mDepthBlurShader->Bind(true);
|
||||
mDepthBlurShader->BlurSharpness[true].Set(blurSharpness);
|
||||
mDepthBlurShader->InvFullResolution[true].Set(1.0f / mBuffers->AmbientWidth, 1.0f / mBuffers->AmbientHeight);
|
||||
|
|
@ -280,10 +263,7 @@ void FGLRenderer::AmbientOccludeScene()
|
|||
glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
|
||||
glClear(GL_COLOR_BUFFER_BIT);
|
||||
}
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
glBindTexture(GL_TEXTURE_2D, mBuffers->AmbientTexture1);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||
mBuffers->AmbientTexture1.Bind(0, GL_LINEAR);
|
||||
mBuffers->BindSceneFogTexture(1);
|
||||
mSSAOCombineShader->Bind();
|
||||
mSSAOCombineShader->AODepthTexture.Set(0);
|
||||
|
|
@ -313,36 +293,32 @@ void FGLRenderer::UpdateCameraExposure()
|
|||
savedState.SaveTextureBindings(2);
|
||||
|
||||
// Extract light level from scene texture:
|
||||
const auto &level0 = mBuffers->ExposureLevels[0];
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, level0.Framebuffer);
|
||||
auto &level0 = mBuffers->ExposureLevels[0];
|
||||
level0.Framebuffer.Bind();
|
||||
glViewport(0, 0, level0.Width, level0.Height);
|
||||
mBuffers->BindCurrentTexture(0);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||
mBuffers->BindCurrentTexture(0, GL_LINEAR);
|
||||
mExposureExtractShader->Bind();
|
||||
mExposureExtractShader->SceneTexture.Set(0);
|
||||
mExposureExtractShader->Scale.Set(mSceneViewport.width / (float)mScreenViewport.width, mSceneViewport.height / (float)mScreenViewport.height);
|
||||
mExposureExtractShader->Offset.Set(mSceneViewport.left / (float)mScreenViewport.width, mSceneViewport.top / (float)mScreenViewport.height);
|
||||
RenderScreenQuad();
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||
|
||||
// Find the average value:
|
||||
for (unsigned int i = 0; i + 1 < mBuffers->ExposureLevels.Size(); i++)
|
||||
{
|
||||
const auto &level = mBuffers->ExposureLevels[i];
|
||||
const auto &next = mBuffers->ExposureLevels[i + 1];
|
||||
auto &level = mBuffers->ExposureLevels[i];
|
||||
auto &next = mBuffers->ExposureLevels[i + 1];
|
||||
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, next.Framebuffer);
|
||||
next.Framebuffer.Bind();
|
||||
glViewport(0, 0, next.Width, next.Height);
|
||||
glBindTexture(GL_TEXTURE_2D, level.Texture);
|
||||
level.Texture.Bind(0);
|
||||
mExposureAverageShader->Bind();
|
||||
mExposureAverageShader->ExposureTexture.Set(0);
|
||||
RenderScreenQuad();
|
||||
}
|
||||
|
||||
// Combine average value with current camera exposure:
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, mBuffers->ExposureFB);
|
||||
mBuffers->ExposureFB.Bind();
|
||||
glViewport(0, 0, 1, 1);
|
||||
if (!mBuffers->FirstExposureFrame)
|
||||
{
|
||||
|
|
@ -354,8 +330,7 @@ void FGLRenderer::UpdateCameraExposure()
|
|||
{
|
||||
mBuffers->FirstExposureFrame = false;
|
||||
}
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
glBindTexture(GL_TEXTURE_2D, mBuffers->ExposureLevels.Last().Texture);
|
||||
mBuffers->ExposureLevels.Last().Texture.Bind(0);
|
||||
mExposureCombineShader->Bind();
|
||||
mExposureCombineShader->ExposureTexture.Set(0);
|
||||
mExposureCombineShader->ExposureBase.Set(gl_exposure_base);
|
||||
|
|
@ -388,31 +363,25 @@ void FGLRenderer::BloomScene(int fixedcm)
|
|||
const float blurAmount = gl_bloom_amount;
|
||||
int sampleCount = gl_bloom_kernel_size;
|
||||
|
||||
const auto &level0 = mBuffers->BloomLevels[0];
|
||||
auto &level0 = mBuffers->BloomLevels[0];
|
||||
|
||||
// Extract blooming pixels from scene texture:
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, level0.VFramebuffer);
|
||||
level0.VFramebuffer.Bind();
|
||||
glViewport(0, 0, level0.Width, level0.Height);
|
||||
mBuffers->BindCurrentTexture(0);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||
glActiveTexture(GL_TEXTURE1);
|
||||
glBindTexture(GL_TEXTURE_2D, mBuffers->ExposureTexture);
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
mBuffers->BindCurrentTexture(0, GL_LINEAR);
|
||||
mBuffers->ExposureTexture.Bind(1);
|
||||
mBloomExtractShader->Bind();
|
||||
mBloomExtractShader->SceneTexture.Set(0);
|
||||
mBloomExtractShader->ExposureTexture.Set(1);
|
||||
mBloomExtractShader->Scale.Set(mSceneViewport.width / (float)mScreenViewport.width, mSceneViewport.height / (float)mScreenViewport.height);
|
||||
mBloomExtractShader->Offset.Set(mSceneViewport.left / (float)mScreenViewport.width, mSceneViewport.top / (float)mScreenViewport.height);
|
||||
RenderScreenQuad();
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||
|
||||
// Blur and downscale:
|
||||
for (int i = 0; i < FGLRenderBuffers::NumBloomLevels - 1; i++)
|
||||
{
|
||||
const auto &level = mBuffers->BloomLevels[i];
|
||||
const auto &next = mBuffers->BloomLevels[i + 1];
|
||||
auto &level = mBuffers->BloomLevels[i];
|
||||
auto &next = mBuffers->BloomLevels[i + 1];
|
||||
mBlurShader->BlurHorizontal(this, blurAmount, sampleCount, level.VTexture, level.HFramebuffer, level.Width, level.Height);
|
||||
mBlurShader->BlurVertical(this, blurAmount, sampleCount, level.HTexture, next.VFramebuffer, next.Width, next.Height);
|
||||
}
|
||||
|
|
@ -420,19 +389,16 @@ void FGLRenderer::BloomScene(int fixedcm)
|
|||
// Blur and upscale:
|
||||
for (int i = FGLRenderBuffers::NumBloomLevels - 1; i > 0; i--)
|
||||
{
|
||||
const auto &level = mBuffers->BloomLevels[i];
|
||||
const auto &next = mBuffers->BloomLevels[i - 1];
|
||||
auto &level = mBuffers->BloomLevels[i];
|
||||
auto &next = mBuffers->BloomLevels[i - 1];
|
||||
|
||||
mBlurShader->BlurHorizontal(this, blurAmount, sampleCount, level.VTexture, level.HFramebuffer, level.Width, level.Height);
|
||||
mBlurShader->BlurVertical(this, blurAmount, sampleCount, level.HTexture, level.VFramebuffer, level.Width, level.Height);
|
||||
|
||||
// Linear upscale:
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, next.VFramebuffer);
|
||||
next.VFramebuffer.Bind();
|
||||
glViewport(0, 0, next.Width, next.Height);
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
glBindTexture(GL_TEXTURE_2D, level.VTexture);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||
level.VTexture.Bind(0, GL_LINEAR);
|
||||
mBloomCombineShader->Bind();
|
||||
mBloomCombineShader->BloomTexture.Set(0);
|
||||
RenderScreenQuad();
|
||||
|
|
@ -447,10 +413,7 @@ void FGLRenderer::BloomScene(int fixedcm)
|
|||
glEnable(GL_BLEND);
|
||||
glBlendEquation(GL_FUNC_ADD);
|
||||
glBlendFunc(GL_ONE, GL_ONE);
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
glBindTexture(GL_TEXTURE_2D, level0.VTexture);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||
level0.VTexture.Bind(0, GL_LINEAR);
|
||||
mBloomCombineShader->Bind();
|
||||
mBloomCombineShader->BloomTexture.Set(0);
|
||||
RenderScreenQuad();
|
||||
|
|
@ -492,15 +455,13 @@ void FGLRenderer::BlurScene(float gameinfobluramount)
|
|||
const auto &level0 = mBuffers->BloomLevels[0];
|
||||
|
||||
// Grab the area we want to bloom:
|
||||
glBindFramebuffer(GL_READ_FRAMEBUFFER, mBuffers->GetCurrentFB());
|
||||
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, level0.VFramebuffer);
|
||||
glBlitFramebuffer(viewport.left, viewport.top, viewport.width, viewport.height, 0, 0, level0.Width, level0.Height, GL_COLOR_BUFFER_BIT, GL_LINEAR);
|
||||
mBuffers->BlitLinear(mBuffers->GetCurrentFB(), level0.VFramebuffer, viewport.left, viewport.top, viewport.width, viewport.height, 0, 0, level0.Width, level0.Height);
|
||||
|
||||
// Blur and downscale:
|
||||
for (int i = 0; i < numLevels - 1; i++)
|
||||
{
|
||||
const auto &level = mBuffers->BloomLevels[i];
|
||||
const auto &next = mBuffers->BloomLevels[i + 1];
|
||||
auto &level = mBuffers->BloomLevels[i];
|
||||
auto &next = mBuffers->BloomLevels[i + 1];
|
||||
mBlurShader->BlurHorizontal(this, blurAmount, sampleCount, level.VTexture, level.HFramebuffer, level.Width, level.Height);
|
||||
mBlurShader->BlurVertical(this, blurAmount, sampleCount, level.HTexture, next.VFramebuffer, next.Width, next.Height);
|
||||
}
|
||||
|
|
@ -508,19 +469,16 @@ void FGLRenderer::BlurScene(float gameinfobluramount)
|
|||
// Blur and upscale:
|
||||
for (int i = numLevels - 1; i > 0; i--)
|
||||
{
|
||||
const auto &level = mBuffers->BloomLevels[i];
|
||||
const auto &next = mBuffers->BloomLevels[i - 1];
|
||||
auto &level = mBuffers->BloomLevels[i];
|
||||
auto &next = mBuffers->BloomLevels[i - 1];
|
||||
|
||||
mBlurShader->BlurHorizontal(this, blurAmount, sampleCount, level.VTexture, level.HFramebuffer, level.Width, level.Height);
|
||||
mBlurShader->BlurVertical(this, blurAmount, sampleCount, level.HTexture, level.VFramebuffer, level.Width, level.Height);
|
||||
|
||||
// Linear upscale:
|
||||
glBindFramebuffer(GL_FRAMEBUFFER, next.VFramebuffer);
|
||||
next.VFramebuffer.Bind();
|
||||
glViewport(0, 0, next.Width, next.Height);
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
glBindTexture(GL_TEXTURE_2D, level.VTexture);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||
level.VTexture.Bind(0, GL_LINEAR);
|
||||
mBloomCombineShader->Bind();
|
||||
mBloomCombineShader->BloomTexture.Set(0);
|
||||
RenderScreenQuad();
|
||||
|
|
@ -530,9 +488,7 @@ void FGLRenderer::BlurScene(float gameinfobluramount)
|
|||
mBlurShader->BlurVertical(this, blurAmount, sampleCount, level0.HTexture, level0.VFramebuffer, level0.Width, level0.Height);
|
||||
|
||||
// Copy blur back to scene texture:
|
||||
glBindFramebuffer(GL_READ_FRAMEBUFFER, level0.VFramebuffer);
|
||||
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, mBuffers->GetCurrentFB());
|
||||
glBlitFramebuffer(0, 0, level0.Width, level0.Height, viewport.left, viewport.top, viewport.width, viewport.height, GL_COLOR_BUFFER_BIT, GL_LINEAR);
|
||||
mBuffers->BlitLinear(level0.VFramebuffer, mBuffers->GetCurrentFB(), 0, 0, level0.Width, level0.Height, viewport.left, viewport.top, viewport.width, viewport.height);
|
||||
|
||||
glViewport(mScreenViewport.left, mScreenViewport.top, mScreenViewport.width, mScreenViewport.height);
|
||||
|
||||
|
|
@ -576,10 +532,7 @@ void FGLRenderer::TonemapScene()
|
|||
}
|
||||
else
|
||||
{
|
||||
glActiveTexture(GL_TEXTURE1);
|
||||
glBindTexture(GL_TEXTURE_2D, mBuffers->ExposureTexture);
|
||||
glActiveTexture(GL_TEXTURE0);
|
||||
|
||||
mBuffers->ExposureTexture.Bind(1);
|
||||
mTonemapShader->ExposureTexture.Set(1);
|
||||
}
|
||||
|
||||
|
|
@ -699,9 +652,7 @@ void FGLRenderer::LensDistortScene()
|
|||
FGLPostProcessState savedState;
|
||||
|
||||
mBuffers->BindNextFB();
|
||||
mBuffers->BindCurrentTexture(0);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||
mBuffers->BindCurrentTexture(0, GL_LINEAR);
|
||||
mLensShader->Bind();
|
||||
mLensShader->InputTexture.Set(0);
|
||||
mLensShader->AspectRatio.Set(aspect);
|
||||
|
|
@ -709,8 +660,6 @@ void FGLRenderer::LensDistortScene()
|
|||
mLensShader->LensDistortionCoefficient.Set(k);
|
||||
mLensShader->CubicDistortionValue.Set(kcube);
|
||||
RenderScreenQuad();
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||
mBuffers->NextTexture();
|
||||
|
||||
FGLDebug::PopGroup();
|
||||
|
|
@ -747,15 +696,11 @@ void FGLRenderer::ApplyFXAA()
|
|||
mBuffers->NextTexture();
|
||||
|
||||
mBuffers->BindNextFB();
|
||||
mBuffers->BindCurrentTexture(0);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||
mBuffers->BindCurrentTexture(0, GL_LINEAR);
|
||||
mFXAAShader->Bind();
|
||||
mFXAAShader->InputTexture.Set(0);
|
||||
mFXAAShader->ReciprocalResolution.Set(rpcRes);
|
||||
RenderScreenQuad();
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
|
||||
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
|
||||
mBuffers->NextTexture();
|
||||
|
||||
FGLDebug::PopGroup();
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue