From fd38970f23331e3768410e4bb6b0447d5d866aea Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Sat, 7 Apr 2018 16:19:11 +0200 Subject: [PATCH] Added vision spheres using a post-processing shader (PoC) --HG-- branch : RLVa --- indra/llrender/llshadermgr.cpp | 3 + indra/llrender/llshadermgr.h | 3 + indra/newview/llviewershadermgr.cpp | 21 +++++++ indra/newview/llviewershadermgr.h | 3 + indra/newview/pipeline.cpp | 86 +++++++++++++++++++++++++++++ 5 files changed, 116 insertions(+) diff --git a/indra/llrender/llshadermgr.cpp b/indra/llrender/llshadermgr.cpp index e721ad93fa..0df7400ffd 100644 --- a/indra/llrender/llshadermgr.cpp +++ b/indra/llrender/llshadermgr.cpp @@ -1254,6 +1254,9 @@ void LLShaderMgr::initAttribsAndUniforms() mReservedUniforms.push_back("sunAngle2"); mReservedUniforms.push_back("camPosLocal"); +// [RLVa:KB] - @setsphere + mReservedUniforms.push_back("avPosLocal"); +// [/RLV:KB] mReservedUniforms.push_back("gWindDir"); mReservedUniforms.push_back("gSinWaveParams"); diff --git a/indra/llrender/llshadermgr.h b/indra/llrender/llshadermgr.h index 394b38f832..ec45ab44cd 100644 --- a/indra/llrender/llshadermgr.h +++ b/indra/llrender/llshadermgr.h @@ -203,6 +203,9 @@ public: WATER_SUN_ANGLE2, WL_CAMPOSLOCAL, +// [RLVa:KB] - @setsphere + RLV_AVPOSLOCAL, +// [/RLVa:KB] AVATAR_WIND, AVATAR_SINWAVE, diff --git a/indra/newview/llviewershadermgr.cpp b/indra/newview/llviewershadermgr.cpp index 3e0cec0f09..12119b214b 100644 --- a/indra/newview/llviewershadermgr.cpp +++ b/indra/newview/llviewershadermgr.cpp @@ -235,6 +235,9 @@ LLGLSLShader gDeferredFullbrightShinyProgram; LLGLSLShader gDeferredSkinnedFullbrightShinyProgram; LLGLSLShader gDeferredSkinnedFullbrightProgram; LLGLSLShader gNormalMapGenProgram; +// [RLVa:KB] - @setsphere +LLGLSLShader gDeferredRlvProgram; +// [/RLVa:KB] // Deferred materials shaders LLGLSLShader gDeferredMaterialProgram[LLMaterial::SHADER_COUNT*2]; @@ -340,6 +343,9 @@ LLViewerShaderMgr::LLViewerShaderMgr() : mShaderList.push_back(&gDeferredAvatarAlphaProgram); mShaderList.push_back(&gDeferredWLSkyProgram); mShaderList.push_back(&gDeferredWLCloudProgram); +// [RLVa:KB] - @setsphere + mShaderList.push_back(&gDeferredRlvProgram); +// [/RLVa:KB] } LLViewerShaderMgr::~LLViewerShaderMgr() @@ -1166,6 +1172,9 @@ BOOL LLViewerShaderMgr::loadShadersDeferred() gDeferredFullbrightShinyProgram.unload(); gDeferredSkinnedFullbrightShinyProgram.unload(); gDeferredSkinnedFullbrightProgram.unload(); +// [RLVa:KB] - @setsphere + gDeferredRlvProgram.unload(); +// [/RLVa:KB] gNormalMapGenProgram.unload(); for (U32 i = 0; i < LLMaterial::SHADER_COUNT*2; ++i) @@ -1996,6 +2005,18 @@ BOOL LLViewerShaderMgr::loadShadersDeferred() success = gNormalMapGenProgram.createShader(NULL, NULL); } +// [RLVa:KB] - @setsphere + if (success) + { + gDeferredRlvProgram.mName = "Deferred (RLVa) Post Processing Shader"; + gDeferredRlvProgram.mShaderFiles.clear(); + gDeferredRlvProgram.mShaderFiles.push_back(make_pair("deferred/rlvV.glsl", GL_VERTEX_SHADER_ARB)); + gDeferredRlvProgram.mShaderFiles.push_back(make_pair("deferred/rlvF.glsl", GL_FRAGMENT_SHADER_ARB)); + gDeferredRlvProgram.mShaderLevel = mVertexShaderLevel[SHADER_DEFERRED]; + success = gDeferredRlvProgram.createShader(NULL, NULL); + } +// [/RLV:KB] + return success; } diff --git a/indra/newview/llviewershadermgr.h b/indra/newview/llviewershadermgr.h index 923aa522ad..102bceb263 100644 --- a/indra/newview/llviewershadermgr.h +++ b/indra/newview/llviewershadermgr.h @@ -336,6 +336,9 @@ extern LLGLSLShader gDeferredFullbrightShinyProgram; extern LLGLSLShader gDeferredSkinnedFullbrightShinyProgram; extern LLGLSLShader gDeferredSkinnedFullbrightProgram; extern LLGLSLShader gNormalMapGenProgram; +// [RLVa:KB] - @setsphere +extern LLGLSLShader gDeferredRlvProgram; +// [/RLVa:KB] // Deferred materials shaders extern LLGLSLShader gDeferredMaterialProgram[LLMaterial::SHADER_COUNT*2]; diff --git a/indra/newview/pipeline.cpp b/indra/newview/pipeline.cpp index 4db9bde572..4ee5dc5caf 100644 --- a/indra/newview/pipeline.cpp +++ b/indra/newview/pipeline.cpp @@ -259,6 +259,9 @@ LLTrace::BlockTimerStatHandle FTM_STATESORT("Sort Draw State"); LLTrace::BlockTimerStatHandle FTM_PIPELINE("Pipeline"); LLTrace::BlockTimerStatHandle FTM_CLIENT_COPY("Client Copy"); LLTrace::BlockTimerStatHandle FTM_RENDER_DEFERRED("Deferred Shading"); +// [RLVa:KB] - @setsphere +LLTrace::BlockTimerStatHandle FTM_POST_DEFERRED_RLV("Post-process (Deferred RLVa)"); +// [/RLVa:KB] static LLTrace::BlockTimerStatHandle FTM_STATESORT_DRAWABLE("Sort Drawables"); @@ -9045,6 +9048,89 @@ void LLPipeline::renderDeferredLighting() mScreen.flush(); +// [RLVa:KB] - @setsphere + { + LL_RECORD_BLOCK_TIME(FTM_POST_DEFERRED_RLV); + + LLGLDepthTest depth(GL_FALSE, GL_FALSE); + + mScreen.bindTarget(); + gDeferredRlvProgram.bind(); + + S32 nDiffuseChannel = gDeferredRlvProgram.enableTexture(LLShaderMgr::DEFERRED_DIFFUSE, mScreen.getUsage()); + if (nDiffuseChannel > -1) + { + mScreen.bindTexture(0, nDiffuseChannel); + gGL.getTexUnit(nDiffuseChannel)->setTextureFilteringOption(LLTexUnit::TFO_POINT); + } + + S32 nDepthChannel = gDeferredRlvProgram.enableTexture(LLShaderMgr::DEFERRED_DEPTH, mDeferredDepth.getUsage()); + if (nDepthChannel > -1) + { + gGL.getTexUnit(nDepthChannel)->bind(&mDeferredDepth, TRUE); + } + + if (isAgentAvatarValid()) + { + LLVector4 avPos(gAgentAvatarp->getRenderPosition(), 1.0f); + glh::vec4f avPosGl(avPos.mV); + + const glh::matrix4f& mvMatrix = gGL.getModelviewMatrix(); + mvMatrix.mult_matrix_vec(avPosGl); + + gDeferredRlvProgram.uniform4fv(LLShaderMgr::RLV_AVPOSLOCAL, 1, avPosGl.v); + } + gDeferredRlvProgram.uniform2f(LLShaderMgr::DEFERRED_SCREEN_RES, mScreen.getWidth(), mScreen.getHeight()); + gDeferredRlvProgram.uniformMatrix4fv(LLShaderMgr::INVERSE_PROJECTION_MATRIX, 1, FALSE, glh_get_current_projection().inverse().m); + + gGL.matrixMode(LLRender::MM_PROJECTION); + gGL.pushMatrix(); + gGL.loadIdentity(); + gGL.matrixMode(LLRender::MM_MODELVIEW); + gGL.pushMatrix(); + gGL.loadMatrix(gGLModelView); + + int nRenderMethod = 0; + switch (nRenderMethod) + { + case 0: + { + LLVector2 tc1(0, 0); + LLVector2 tc2((F32)mScreen.getWidth() * 2, (F32)mScreen.getHeight() * 2); + + 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(); + } + break; + case 1: + mDeferredVB->setBuffer(LLVertexBuffer::MAP_VERTEX); + mDeferredVB->drawArrays(LLRender::TRIANGLES, 0, 3); + break; + } + + gGL.matrixMode(LLRender::MM_PROJECTION); + gGL.popMatrix(); + gGL.matrixMode(LLRender::MM_MODELVIEW); + gGL.popMatrix(); + + gDeferredRlvProgram.disableTexture(LLShaderMgr::DEFERRED_DIFFUSE, mScreen.getUsage()); + gDeferredRlvProgram.disableTexture(LLShaderMgr::DEFERRED_DEPTH, mScreen.getUsage()); + gDeferredRlvProgram.unbind(); + gGL.getTexUnit(0)->unbind(LLTexUnit::TT_TEXTURE); + gGL.getTexUnit(0)->activate(); + + mScreen.flush(); + } +// [/RLVa:KB] } void LLPipeline::renderDeferredLightingToRT(LLRenderTarget* target)