SL-18190 Rearrange render order so 3D UI has access to the depth buffer.
parent
26f99409d2
commit
4a4b0f8ee8
|
|
@ -1374,10 +1374,10 @@ void render_ui(F32 zoom_factor, int subfield)
|
|||
gGL.popMatrix();
|
||||
}
|
||||
|
||||
// Finalize scene
|
||||
gPipeline.renderFinalize();
|
||||
|
||||
{
|
||||
// draw hud and 3D ui elements into screen render target so they'll be able to use
|
||||
// the depth buffer (avoids extra copy of depth buffer per frame)
|
||||
gPipeline.mRT->screen.bindTarget();
|
||||
// SL-15709
|
||||
// NOTE: Tracy only allows one ZoneScoped per function.
|
||||
// Solutions are:
|
||||
|
|
@ -1394,41 +1394,46 @@ void render_ui(F32 zoom_factor, int subfield)
|
|||
gPipeline.disableLights();
|
||||
}
|
||||
|
||||
{
|
||||
gGL.color4f(1,1,1,1);
|
||||
if (gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI))
|
||||
{
|
||||
if (!gDisconnected)
|
||||
{
|
||||
LL_PROFILE_ZONE_NAMED_CATEGORY_UI("UI 3D"); //LL_RECORD_BLOCK_TIME(FTM_RENDER_UI_3D);
|
||||
render_ui_3d();
|
||||
LLGLState::checkStates();
|
||||
}
|
||||
else
|
||||
{
|
||||
render_disconnected_background();
|
||||
}
|
||||
gGL.color4f(1,1,1,1);
|
||||
|
||||
LL_PROFILE_ZONE_NAMED_CATEGORY_UI("UI 2D"); //LL_RECORD_BLOCK_TIME(FTM_RENDER_UI_2D);
|
||||
render_ui_2d();
|
||||
LLGLState::checkStates();
|
||||
}
|
||||
gGL.flush();
|
||||
bool render_ui = gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI);
|
||||
if (render_ui)
|
||||
{
|
||||
if (!gDisconnected)
|
||||
{
|
||||
LL_PROFILE_ZONE_NAMED_CATEGORY_UI("UI 3D"); //LL_RECORD_BLOCK_TIME(FTM_RENDER_UI_3D);
|
||||
render_ui_3d();
|
||||
LLGLState::checkStates();
|
||||
}
|
||||
else
|
||||
{
|
||||
render_disconnected_background();
|
||||
}
|
||||
}
|
||||
|
||||
gViewerWindow->setup2DRender();
|
||||
gViewerWindow->updateDebugText();
|
||||
gViewerWindow->drawDebugText();
|
||||
gPipeline.mRT->screen.flush();
|
||||
|
||||
LLVertexBuffer::unbind();
|
||||
}
|
||||
// apply gamma correction and post effects before rendering 2D UI
|
||||
gPipeline.renderFinalize();
|
||||
|
||||
if (!gSnapshot)
|
||||
{
|
||||
set_current_modelview(saved_view);
|
||||
gGL.popMatrix();
|
||||
}
|
||||
if (render_ui)
|
||||
{
|
||||
LL_PROFILE_ZONE_NAMED_CATEGORY_UI("UI 2D"); //LL_RECORD_BLOCK_TIME(FTM_RENDER_UI_2D);
|
||||
render_ui_2d();
|
||||
LLGLState::checkStates();
|
||||
gGL.flush();
|
||||
}
|
||||
|
||||
} // Tracy integration
|
||||
gViewerWindow->setup2DRender();
|
||||
gViewerWindow->updateDebugText();
|
||||
gViewerWindow->drawDebugText();
|
||||
}
|
||||
|
||||
if (!gSnapshot)
|
||||
{
|
||||
set_current_modelview(saved_view);
|
||||
gGL.popMatrix();
|
||||
}
|
||||
}
|
||||
|
||||
static LLTrace::BlockTimerStatHandle FTM_SWAP("Swap");
|
||||
|
|
|
|||
|
|
@ -7599,6 +7599,76 @@ void LLPipeline::renderFinalize()
|
|||
gGL.setColorMask(true, true);
|
||||
glClearColor(0, 0, 0, 0);
|
||||
|
||||
if (!gCubeSnapshot)
|
||||
{
|
||||
// gamma correct lighting
|
||||
gGL.matrixMode(LLRender::MM_PROJECTION);
|
||||
gGL.pushMatrix();
|
||||
gGL.loadIdentity();
|
||||
gGL.matrixMode(LLRender::MM_MODELVIEW);
|
||||
gGL.pushMatrix();
|
||||
gGL.loadIdentity();
|
||||
|
||||
{
|
||||
LL_PROFILE_GPU_ZONE("gamma correct");
|
||||
|
||||
LLGLDepthTest depth(GL_FALSE, GL_FALSE);
|
||||
|
||||
LLRenderTarget* screen_target = &mRT->screen;
|
||||
|
||||
LLVector2 tc1(0, 0);
|
||||
LLVector2 tc2((F32)screen_target->getWidth() * 2, (F32)screen_target->getHeight() * 2);
|
||||
|
||||
screen_target->bindTarget();
|
||||
// Apply gamma correction to the frame here.
|
||||
gDeferredPostGammaCorrectProgram.bind();
|
||||
// mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX);
|
||||
S32 channel = 0;
|
||||
channel = gDeferredPostGammaCorrectProgram.enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, screen_target->getUsage());
|
||||
if (channel > -1)
|
||||
{
|
||||
screen_target->bindTexture(0, channel, LLTexUnit::TFO_POINT);
|
||||
}
|
||||
|
||||
gDeferredPostGammaCorrectProgram.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, screen_target->getWidth(), screen_target->getHeight());
|
||||
|
||||
F32 gamma = gSavedSettings.getF32("RenderDeferredDisplayGamma");
|
||||
|
||||
gDeferredPostGammaCorrectProgram.uniform1f(LLShaderMgr::DISPLAY_GAMMA, (gamma > 0.1f) ? 1.0f / gamma : (1.0f / 2.2f));
|
||||
|
||||
gGL.begin(LLRender::TRIANGLE_STRIP);
|
||||
gGL.texCoord2f(tc1.mV[0], tc1.mV[1]);
|
||||
gGL.vertex2f(-1, -1);
|
||||
|
||||
gGL.texCoord2f(tc1.mV[0], tc2.mV[1]);
|
||||
gGL.vertex2f(-1, 3);
|
||||
|
||||
gGL.texCoord2f(tc2.mV[0], tc1.mV[1]);
|
||||
gGL.vertex2f(3, -1);
|
||||
|
||||
gGL.end();
|
||||
|
||||
gGL.getTexUnit(channel)->unbind(screen_target->getUsage());
|
||||
gDeferredPostGammaCorrectProgram.unbind();
|
||||
screen_target->flush();
|
||||
}
|
||||
|
||||
gGL.matrixMode(LLRender::MM_PROJECTION);
|
||||
gGL.popMatrix();
|
||||
gGL.matrixMode(LLRender::MM_MODELVIEW);
|
||||
gGL.popMatrix();
|
||||
|
||||
LLVertexBuffer::unbind();
|
||||
|
||||
if (gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI))
|
||||
{
|
||||
// Render debugging beacons.
|
||||
gObjectList.renderObjectBeacons();
|
||||
gObjectList.resetObjectBeacons();
|
||||
gSky.addSunMoonBeacons();
|
||||
}
|
||||
}
|
||||
|
||||
if (sRenderGlow)
|
||||
{
|
||||
LL_PROFILE_GPU_ZONE("glow");
|
||||
|
|
@ -9037,76 +9107,6 @@ void LLPipeline::renderDeferredLighting()
|
|||
}
|
||||
|
||||
screen_target->flush();
|
||||
|
||||
if (!gCubeSnapshot)
|
||||
{
|
||||
// gamma correct lighting
|
||||
gGL.matrixMode(LLRender::MM_PROJECTION);
|
||||
gGL.pushMatrix();
|
||||
gGL.loadIdentity();
|
||||
gGL.matrixMode(LLRender::MM_MODELVIEW);
|
||||
gGL.pushMatrix();
|
||||
gGL.loadIdentity();
|
||||
|
||||
{
|
||||
LL_PROFILE_GPU_ZONE("gamma correct");
|
||||
|
||||
LLGLDepthTest depth(GL_FALSE, GL_FALSE);
|
||||
|
||||
LLVector2 tc1(0, 0);
|
||||
LLVector2 tc2((F32)screen_target->getWidth() * 2, (F32)screen_target->getHeight() * 2);
|
||||
|
||||
screen_target->bindTarget();
|
||||
// Apply gamma correction to the frame here.
|
||||
gDeferredPostGammaCorrectProgram.bind();
|
||||
// mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX);
|
||||
S32 channel = 0;
|
||||
channel = gDeferredPostGammaCorrectProgram.enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, screen_target->getUsage());
|
||||
if (channel > -1)
|
||||
{
|
||||
screen_target->bindTexture(0, channel, LLTexUnit::TFO_POINT);
|
||||
}
|
||||
|
||||
gDeferredPostGammaCorrectProgram.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, screen_target->getWidth(), screen_target->getHeight());
|
||||
|
||||
F32 gamma = gSavedSettings.getF32("RenderDeferredDisplayGamma");
|
||||
|
||||
gDeferredPostGammaCorrectProgram.uniform1f(LLShaderMgr::DISPLAY_GAMMA, (gamma > 0.1f) ? 1.0f / gamma : (1.0f / 2.2f));
|
||||
|
||||
gGL.begin(LLRender::TRIANGLE_STRIP);
|
||||
gGL.texCoord2f(tc1.mV[0], tc1.mV[1]);
|
||||
gGL.vertex2f(-1, -1);
|
||||
|
||||
gGL.texCoord2f(tc1.mV[0], tc2.mV[1]);
|
||||
gGL.vertex2f(-1, 3);
|
||||
|
||||
gGL.texCoord2f(tc2.mV[0], tc1.mV[1]);
|
||||
gGL.vertex2f(3, -1);
|
||||
|
||||
gGL.end();
|
||||
|
||||
gGL.getTexUnit(channel)->unbind(screen_target->getUsage());
|
||||
gDeferredPostGammaCorrectProgram.unbind();
|
||||
screen_target->flush();
|
||||
}
|
||||
|
||||
gGL.matrixMode(LLRender::MM_PROJECTION);
|
||||
gGL.popMatrix();
|
||||
gGL.matrixMode(LLRender::MM_MODELVIEW);
|
||||
gGL.popMatrix();
|
||||
|
||||
LLVertexBuffer::unbind();
|
||||
|
||||
if (gPipeline.hasRenderDebugFeatureMask(LLPipeline::RENDER_DEBUG_FEATURE_UI))
|
||||
{
|
||||
// Render debugging beacons.
|
||||
gObjectList.renderObjectBeacons();
|
||||
gObjectList.resetObjectBeacons();
|
||||
gSky.addSunMoonBeacons();
|
||||
}
|
||||
}
|
||||
|
||||
screen_target->flush();
|
||||
}
|
||||
|
||||
void LLPipeline::setupSpotLight(LLGLSLShader& shader, LLDrawable* drawablep)
|
||||
|
|
|
|||
Loading…
Reference in New Issue