summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave Parks <davep@lindenlab.com>2023-03-30 13:14:23 -0500
committerDave Parks <davep@lindenlab.com>2023-03-30 13:14:23 -0500
commitb5917fbd16022e4c4d2cf7ef41b21fdea4828c9e (patch)
tree18a73b2df4cd38e051e8455e782b4b45ce9880e1
parent9a03c819d430ca8b45f661204f6d666e609e9b51 (diff)
DRTVWR-559 Reduce probe flashing and exposure flickering.
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/exposureF.glsl8
-rw-r--r--indra/newview/llreflectionmapmanager.cpp17
2 files changed, 18 insertions, 7 deletions
diff --git a/indra/newview/app_settings/shaders/class1/deferred/exposureF.glsl b/indra/newview/app_settings/shaders/class1/deferred/exposureF.glsl
index b325f55576..1c1984e8ee 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/exposureF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/exposureF.glsl
@@ -55,13 +55,13 @@ void main()
vec3 col;
- vec2 nz = noiseVec * step * 0.5;
+ //vec2 nz = noiseVec * step * 0.5;
for (float x = start; x <= end; x += step)
{
for (float y = start; y <= end; y += step)
{
- vec2 tc = vec2(x,y) + nz;
+ vec2 tc = vec2(x,y); // + nz;
vec3 c = texture(diffuseRect, tc).rgb + texture(emissiveRect, tc).rgb;
float L = max(lum(c), 0.25);
@@ -84,9 +84,11 @@ void main()
float s = clamp(0.1/L, 0.5, 2.5);
+
float prev = texture(exposureMap, vec2(0.5,0.5)).r;
- s = mix(prev, s, min(dt*2.0, 0.04));
+ s = mix(prev, s, min(dt*2.0*abs(prev-s), 0.04));
+
frag_color = vec4(s, s, s, dt);
}
diff --git a/indra/newview/llreflectionmapmanager.cpp b/indra/newview/llreflectionmapmanager.cpp
index 6828078f4f..e9df67c724 100644
--- a/indra/newview/llreflectionmapmanager.cpp
+++ b/indra/newview/llreflectionmapmanager.cpp
@@ -181,7 +181,11 @@ void LLReflectionMapManager::update()
LLVector4a d;
- if (probe->mOccluded)
+ if (probe->mComplete)
+ {
+ probe->mFadeIn = llmin((F32) (probe->mFadeIn + gFrameIntervalSeconds), 1.f);
+ }
+ if (probe->mOccluded && probe->mComplete)
{
if (oldestOccluded == nullptr)
{
@@ -300,7 +304,7 @@ void LLReflectionMapManager::getReflectionMaps(std::vector<LLReflectionMap*>& ma
mProbes[i]->mLastBindTime = gFrameTimeSeconds; // something wants to use this probe, indicate it's been requested
if (mProbes[i]->mCubeIndex != -1)
{
- if (!mProbes[i]->mOccluded)
+ if (!mProbes[i]->mOccluded && mProbes[i]->mComplete)
{
mProbes[i]->mProbeIndex = count;
maps[count++] = mProbes[i];
@@ -385,6 +389,7 @@ S32 LLReflectionMapManager::allocateCubeIndex()
S32 ret = mProbes[i]->mCubeIndex;
mProbes[i]->mCubeIndex = -1;
mProbes[i]->mCubeArray = nullptr;
+ mProbes[i]->mComplete = false;
return ret;
}
}
@@ -435,6 +440,7 @@ void LLReflectionMapManager::doProbeUpdate()
mUpdatingFace = 0;
if (isRadiancePass())
{
+ mUpdatingProbe->mComplete = true;
mUpdatingProbe = nullptr;
mRadiancePass = false;
}
@@ -768,7 +774,10 @@ void LLReflectionMapManager::updateUniforms()
// for sphere probes, origin (xyz) and radius (w) of refmaps in clip space
LLVector4 refSphere[LL_MAX_REFLECTION_PROBE_COUNT];
- // extra parameters (currently only ambiance in .x)
+ // extra parameters
+ // x - irradiance scale
+ // y - radiance scale
+ // z - fade in
LLVector4 refParams[LL_MAX_REFLECTION_PROBE_COUNT];
// indices used by probe:
@@ -843,7 +852,7 @@ void LLReflectionMapManager::updateUniforms()
rpd.refIndex[count][3] = -rpd.refIndex[count][3];
}
- rpd.refParams[count].set(llmax(minimum_ambiance, refmap->getAmbiance())*ambscale, radscale, 0.f, 0.f);
+ rpd.refParams[count].set(llmax(minimum_ambiance, refmap->getAmbiance())*ambscale, radscale, refmap->mFadeIn, 0.f);
S32 ni = nc; // neighbor ("index") - index into refNeighbor to write indices for current reflection probe's neighbors
{