diff options
author | Graham Linden <graham@lindenlab.com> | 2018-06-30 00:22:10 +0100 |
---|---|---|
committer | Graham Linden <graham@lindenlab.com> | 2018-06-30 00:22:10 +0100 |
commit | ec496d5e1abf9681895062f297fd8a62f057986e (patch) | |
tree | 7289f5d00d0ca1773cd0662f0e4c973141e54fe8 | |
parent | aa7d75cb7be7e752f6ff408e03c489fb62f68630 (diff) |
MAINT-4019 fix ALM star rendering (make post-deferred and actually blend)
-rw-r--r-- | indra/newview/app_settings/shaders/class1/deferred/starsF.glsl | 8 | ||||
-rw-r--r-- | indra/newview/lldrawpoolwlsky.cpp | 53 | ||||
-rw-r--r-- | indra/newview/lldrawpoolwlsky.h | 8 |
3 files changed, 52 insertions, 17 deletions
diff --git a/indra/newview/app_settings/shaders/class1/deferred/starsF.glsl b/indra/newview/app_settings/shaders/class1/deferred/starsF.glsl index 029a98e16a..f397a4a151 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/starsF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/starsF.glsl @@ -28,19 +28,19 @@ #ifdef DEFINE_GL_FRAGCOLOR out vec4 frag_data[3]; #else -#define frag_data gl_FragData +#define frag_color gl_FragColor #endif VARYING vec4 vertex_color; VARYING vec2 vary_texcoord0; uniform sampler2D diffuseMap; +uniform float custom_alpha; void main() { vec4 col = vertex_color * texture2D(diffuseMap, vary_texcoord0.xy); + col.a *= custom_alpha; - frag_data[0] = col; - frag_data[1] = vec4(0,0,0,0); - frag_data[2] = vec4(0,0,1,0); + frag_color = col; } diff --git a/indra/newview/lldrawpoolwlsky.cpp b/indra/newview/lldrawpoolwlsky.cpp index 69a7b13537..cf4d63149c 100644 --- a/indra/newview/lldrawpoolwlsky.cpp +++ b/indra/newview/lldrawpoolwlsky.cpp @@ -45,6 +45,7 @@ #include "llatmosphere.h" static LLStaticHashedString sCamPosLocal("camPosLocal"); +static LLStaticHashedString sCustomAlpha("custom_alpha"); static LLGLSLShader* cloud_shader = NULL; static LLGLSLShader* sky_shader = NULL; @@ -226,7 +227,6 @@ void LLDrawPoolWLSky::renderStars(void) const if (LLGLSLShader::sNoFixedFunction) { gCustomAlphaProgram.bind(); - static LLStaticHashedString sCustomAlpha("custom_alpha"); gCustomAlphaProgram.uniform1f(sCustomAlpha, star_alpha.mV[3]); } else @@ -251,6 +251,28 @@ void LLDrawPoolWLSky::renderStars(void) const } } +void LLDrawPoolWLSky::renderStarsDeferred(void) const +{ + LLGLSPipelineSkyBox gls_sky; + LLGLEnable blend(GL_BLEND); + gGL.setSceneBlendType(LLRender::BT_ALPHA); + + // *LAPRAS + F32 star_alpha = LLEnvironment::instance().getCurrentSky()->getStarBrightness() / (2.f + ((rand() >> 16)/65535.0f)); // twinkle twinkle + + // If start_brightness is not set, exit + if(star_alpha < 0.001f) + { + LL_DEBUGS("SKY") << "star_brightness below threshold." << LL_ENDL; + return; + } + + gDeferredStarProgram.bind(); + gDeferredStarProgram.uniform1f(sCustomAlpha, star_alpha); + gSky.mVOWLSkyp->drawStars(); + gDeferredStarProgram.unbind(); +} + void LLDrawPoolWLSky::renderSkyClouds(const LLVector3& camPosLocal, F32 camHeightLocal) const { if (gPipeline.canUseWindLightShaders() && gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_CLOUDS) && gSky.mVOSkyp->getCloudNoiseTex()) @@ -358,32 +380,37 @@ void LLDrawPoolWLSky::renderDeferred(S32 pass) { renderSkyHaze(origin, camHeightLocal); - LLVector3 const & origin = LLViewerCamera::getInstance()->getOrigin(); gGL.pushMatrix(); - gGL.translatef(origin.mV[0], origin.mV[1], origin.mV[2]); - gDeferredStarProgram.bind(); // *NOTE: have to bind moon textures here since register combiners blending in // renderStars() requires something to be bound and we might as well only // bind the moon textures once. gGL.getTexUnit(0)->bind(gSky.mVOSkyp->mFace[LLVOSky::FACE_MOON]->getTexture(LLRender::DIFFUSE_MAP)); gGL.getTexUnit(1)->bind(gSky.mVOSkyp->mFace[LLVOSky::FACE_MOON]->getTexture(LLRender::ALTERNATE_DIFFUSE_MAP)); - renderHeavenlyBodies(); - - renderStars(); - - gDeferredStarProgram.unbind(); - - gGL.popMatrix(); - - renderSkyClouds(origin, camHeightLocal); + renderHeavenlyBodies(); } } gGL.setColorMask(true, true); } +void LLDrawPoolWLSky::renderPostDeferred(S32 pass) +{ + const F32 camHeightLocal = LLEnvironment::instance().getCamHeight(); + + LLVector3 const & origin = LLViewerCamera::getInstance()->getOrigin(); + gGL.pushMatrix(); + + gGL.translatef(origin.mV[0], origin.mV[1], origin.mV[2]); + + renderStarsDeferred(); + + gGL.popMatrix(); + + renderSkyClouds(origin, camHeightLocal); +} + void LLDrawPoolWLSky::render(S32 pass) { if (!gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_SKY)) diff --git a/indra/newview/lldrawpoolwlsky.h b/indra/newview/lldrawpoolwlsky.h index db08d9b99a..309efdbc5b 100644 --- a/indra/newview/lldrawpoolwlsky.h +++ b/indra/newview/lldrawpoolwlsky.h @@ -52,6 +52,12 @@ public: /*virtual*/ void endDeferredPass(S32 pass); /*virtual*/ void renderDeferred(S32 pass); + + /*virtual*/ S32 getNumPostDeferredPasses() { return 1; } + /*virtual*/ void beginPostDeferredPass(S32 pass) {} + /*virtual*/ void endPostDeferredPass(S32 pass) {} + /*virtual*/ void renderPostDeferred(S32 pass); + /*virtual*/ LLViewerTexture *getDebugTexture(); /*virtual*/ void beginRenderPass( S32 pass ); /*virtual*/ void endRenderPass( S32 pass ); @@ -76,7 +82,9 @@ private: void renderFsSky(const LLVector3& camPosLocal, F32 camHeightLocal, LLGLSLShader * shader) const; void renderDome(const LLVector3& camPosLocal, F32 camHeightLocal, LLGLSLShader * shader) const; void renderSkyHaze(const LLVector3& camPosLocal, F32 camHeightLocal) const; + void renderSkyHazeDeferred(const LLVector3& camPosLocal, F32 camHeightLocal) const; + void renderStarsDeferred(void) const; void renderStars(void) const; void renderSkyClouds(const LLVector3& camPosLocal, F32 camHeightLocal) const; |