Fix ambient light inputs to the renderer.

Fix 3rd sky shader w/ mistaken density mod conversion.

Make ambient clamp apply to all modes.

Tune ALM ambient clamp to match non-ALM.
master
Graham Linden 2019-05-21 16:00:45 -07:00
parent 78e62fe0f1
commit e9dbee0026
16 changed files with 74 additions and 44 deletions

View File

@ -1246,6 +1246,17 @@ LLColor4 LLSettingsSky::getTotalAmbient() const
return mTotalAmbient;
}
LLColor3 LLSettingsSky::getMoonlightColor() const
{
F32 moon_brightness = getIsMoonUp() ? getMoonBrightness() : 0.001f;
LLColor3 moonlight_a(0.45, 0.45, 0.66);
LLColor3 moonlight_b(0.33, 0.33, 1.0);
LLColor3 moonlight = lerp(moonlight_b, moonlight_a, moon_brightness);
return moonlight;
}
void LLSettingsSky::calculateLightSettings() const
{
// Initialize temp variables
@ -1278,19 +1289,24 @@ void LLSettingsSky::calculateLightSettings() const
//brightness of surface both sunlight and ambient
// reduce range to 0 - 1 before gamma correct to prevent clipping
// then restore to full 0 - 3 range before storage
mSunDiffuse = gammaCorrect(componentMult(sunlight * 0.33333f, light_transmittance)) * 3.0f;
mSunAmbient = gammaCorrect(componentMult(tmpAmbient * 0.33333f, light_transmittance)) * 3.0f;
//mSunDiffuse = gammaCorrect(componentMult(sunlight, light_transmittance));
//mSunAmbient = gammaCorrect(componentMult(tmpAmbient, light_transmittance));
mSunDiffuse = componentMult(sunlight, light_transmittance);
mSunAmbient = componentMult(tmpAmbient, light_transmittance);
F32 moon_brightness = getIsMoonUp() ? getMoonBrightness() : 0.001f;
LLColor3 moonlight_a(0.45, 0.45, 0.66);
LLColor3 moonlight_b(0.33, 0.33, 1.0);
LLColor3 moonlight = getMoonlightColor();
LLColor3 moonlight_b(0.33, 0.33, 1.0); // scotopic ambient value
LLColor3 moonlight = lerp(moonlight_b, moonlight_a, moon_brightness);
componentMultBy(moonlight, componentExp((light_atten * -1.f) * lighty));
mMoonDiffuse = gammaCorrect(componentMult(moonlight, light_transmittance) * moon_brightness);
mMoonAmbient = gammaCorrect(componentMult(moonlight_b, light_transmittance) * 0.0125f);
//mMoonDiffuse = gammaCorrect(componentMult(moonlight, light_transmittance) * moon_brightness);
//mMoonAmbient = gammaCorrect(componentMult(moonlight_b, light_transmittance) * 0.0125f);
mMoonDiffuse = componentMult(moonlight, light_transmittance) * moon_brightness;
mMoonAmbient = componentMult(moonlight_b, light_transmittance) * 0.0125f;
mTotalAmbient = mSunAmbient;
}

View File

@ -282,6 +282,9 @@ public:
LLVector3 getSunDirection() const;
LLVector3 getMoonDirection() const;
// color based on brightness
LLColor3 getMoonlightColor() const;
LLColor4 getMoonAmbient() const;
LLColor3 getMoonDiffuse() const;
LLColor4 getSunAmbient() const;

View File

@ -1228,6 +1228,7 @@ void LLRender::syncLightState()
shader->uniform3fv(LLShaderMgr::LIGHT_DIFFUSE, 8, diffuse[0].mV);
shader->uniform4fv(LLShaderMgr::LIGHT_AMBIENT, 1, mAmbientLightColor.mV);
shader->uniform1i(LLShaderMgr::SUN_UP_FACTOR, sun_primary[0] ? 1 : 0);
shader->uniform4fv(LLShaderMgr::AMBIENT, 1, mAmbientLightColor.mV);
shader->uniform4fv(LLShaderMgr::SUNLIGHT_COLOR, 1, diffuse[0].mV);
shader->uniform4fv(LLShaderMgr::MOONLIGHT_COLOR, 1, diffuse_b[0].mV);
}

View File

@ -223,7 +223,9 @@ void main()
float ambient = da;
ambient *= 0.5;
ambient *= ambient;
ambient = min(getAmbientClamp(), 1.0 - ambient);
float ambient_clamp = getAmbientClamp() + 0.2;
ambient = (1.0 - ambient) * ambient_clamp;
vec3 sun_contrib = min(final_da, shadow) * sunlit;

View File

@ -320,7 +320,9 @@ void main()
float ambient = da;
ambient *= 0.5;
ambient *= ambient;
ambient = min(getAmbientClamp(), 1.0 - ambient);
float ambient_clamp = getAmbientClamp() + 0.2;
ambient = (1.0 - ambient) * ambient_clamp;
vec3 sun_contrib = min(final_da, shadow) * sunlit;

View File

@ -106,7 +106,10 @@ void main()
float ambient = da;
ambient *= 0.5;
ambient *= ambient;
ambient = min(getAmbientClamp(), 1.0 - ambient);
ambient = (1.0 - ambient);
float ambient_clamp = getAmbientClamp() + 0.1;
ambient *= ambient_clamp;
vec3 sun_contrib = final_da * sunlit;
@ -179,11 +182,10 @@ vec3 post_atmo = color.rgb;
bloom = fogged.a;
#endif
// srgb colorspace debuggables
//color.rgb = amblit;
//color.rgb = vec3(ambient);
//color.rgb = sunlit;
//color.rgb = post_ambient;
//color.rgb = vec3(final_da);
//color.rgb = sun_contrib;
//color.rgb = post_sunlight;
//color.rgb = diffuse_srgb.rgb;
@ -197,6 +199,11 @@ vec3 post_atmo = color.rgb;
color.rgb = srgb_to_linear(color.rgb);
}
// linear debuggables
//color.rgb = vec3(final_da);
//color.rgb = vec3(ambient);
//color.rgb = vec3(scol);
frag_color.rgb = color.rgb;
frag_color.a = bloom;
}

View File

@ -28,11 +28,12 @@
// All lights, no specular highlights
vec3 atmosAmbient();
vec4 sumLights(vec3 pos, vec3 norm, vec4 color);
float getAmbientClamp();
vec4 calcLighting(vec3 pos, vec3 norm, vec4 color)
{
vec4 c = sumLights(pos, norm, color);
c.rgb += atmosAmbient() * color.rgb * 0.5;
c.rgb += atmosAmbient() * color.rgb * 0.5 * getAmbientClamp();
return c;
}

View File

@ -44,7 +44,7 @@ uniform float sun_moon_glow_factor;
float getAmbientClamp()
{
return 0.45f;
return 0.9;
}
void calcAtmosphericVars(vec3 inPositionEye, float ambFactor, out vec3 sunlit, out vec3 amblit, out vec3 additive, out vec3 atten) {

View File

@ -88,6 +88,7 @@ vec3 halo22(float d)
/// Soft clips the light with a gamma correction
vec3 scaleSoftClip(vec3 light);
vec3 srgb_to_linear(vec3 c);
void main()
{
@ -194,10 +195,12 @@ void main()
color.rgb += halo_22;
color *= 2.;
color.rgb *= 2.;
color.rgb = scaleSoftClip(color.rgb);
color.rgb = srgb_to_linear(color.rgb);
/// Gamma correct for WL (soft clip effect).
frag_data[0] = vec4(scaleSoftClip(color.rgb), 1.0);
frag_data[0] = vec4(color.rgb, 1.0);
frag_data[1] = vec4(0.0,0.0,0.0,0.0);
frag_data[2] = vec4(0.5,0.5,0.0,1.0); //1.0 in norm.w masks off fog
}

View File

@ -24,6 +24,7 @@
*/
#extension GL_ARB_texture_rectangle : enable
#extension GL_ARB_shader_texture_lod : enable
/*[EXTRA_CODE_HERE]*/
@ -87,14 +88,11 @@ void main()
float da = dot(normalize(norm.xyz), light_dir.xyz);
da = clamp(da, -1.0, 1.0);
float final_da = da;
final_da = clamp(final_da, 0.0, 1.0);
vec4 diffuse_srgb = texture2DRect(diffuseRect, tc);
vec4 diffuse_linear = vec4(srgb_to_linear(diffuse_srgb.rgb), diffuse_srgb.a);
vec4 diffuse_linear = texture2DRect(diffuseRect, tc);
vec4 diffuse_srgb = vec4(linear_to_srgb(diffuse_linear.rgb), diffuse_linear.a);
// clamping to alpha value kills underwater shadows...
//scol = max(scol_ambocc.r, diffuse_linear.a);
@ -116,7 +114,10 @@ void main()
float ambient = da;
ambient *= 0.5;
ambient *= ambient;
ambient = min(getAmbientClamp(), 1.0 - ambient);
float ambient_clamp = getAmbientClamp() + 0.1;
ambient = (1.0 - ambient);
ambient *= ambient_clamp;
vec3 sun_contrib = min(scol, final_da) * sunlit;
@ -129,7 +130,7 @@ vec3 post_ambient = color.rgb;
vec3 post_sunlight = color.rgb;
color.rgb *= diffuse_srgb.rgb;
color.rgb *= diffuse_linear.rgb;
vec3 post_diffuse = color.rgb;
@ -155,7 +156,7 @@ vec3 post_diffuse = color.rgb;
float scontrib = fres*texture2D(lightFunc, vec2(nh, spec.a)).r*gt/(nh*da);
vec3 sp = sun_contrib*scontrib / 16.0;
sp = clamp(sp, vec3(0), vec3(1));
bloom += dot (sp, sp) / 6.0;
bloom += dot(sp, sp) / 6.0;
color += sp * spec.rgb;
}
}
@ -163,7 +164,7 @@ vec3 post_diffuse = color.rgb;
vec3 post_spec = color.rgb;
#ifndef WATER_FOG
color.rgb += diffuse_srgb.a * diffuse_srgb.rgb;
color.rgb = mix(color.rgb, diffuse_srgb.rgb, diffuse_srgb.a);
#endif
if (envIntensity > 0.0)

View File

@ -88,7 +88,7 @@ void main()
vec4 sunlight = (sun_up_factor == 1) ? sunlight_color : moonlight_color;
vec4 light_atten;
float dens_mul = density_multiplier * 0.45;
float dens_mul = density_multiplier;
// Sunlight attenuation effect (hue and brightness) due to atmosphere
// this is used later for sunlight modulation at various altitudes

View File

@ -28,11 +28,12 @@
// All lights, no specular highlights
vec3 atmosAmbient();
vec4 sumLights(vec3 pos, vec3 norm, vec4 color);
float getAmbientClamp();
vec4 calcLighting(vec3 pos, vec3 norm, vec4 color)
{
vec4 c = sumLights(pos, norm, color);
c.rgb += atmosAmbient() * color.rgb;
c.rgb += atmosAmbient() * color.rgb * getAmbientClamp();
return c;
}

View File

@ -263,6 +263,7 @@ S32 LLMachineID::getUniqueID(unsigned char *unique_id, size_t len)
if (has_static_unique_id)
{
memcpy ( unique_id, &static_unique_id, len);
#if LL_LOG_MACHINE_ID
LL_INFOS_ONCE("AppInit") << "UniqueID: 0x";
// Code between here and LL_ENDL is not executed unless the LL_DEBUGS
// actually produces output
@ -276,6 +277,7 @@ S32 LLMachineID::getUniqueID(unsigned char *unique_id, size_t len)
}
// Reset default output formatting to avoid nasty surprises!
LL_CONT << std::dec << std::setw(0) << std::setfill(' ') << LL_ENDL;
#endif
return 1;
}
return 0;

View File

@ -682,8 +682,8 @@ void LLSettingsVOSky::applySpecial(void *ptarget)
LLSettingsSky::ptr_t psky = LLEnvironment::instance().getCurrentSky();
LLColor4 sunDiffuse = psky->getSunDiffuse();
LLColor4 moonDiffuse = psky->getMoonDiffuse();
LLColor4 sunDiffuse = psky->getSunlightColor();
LLColor4 moonDiffuse = psky->getMoonlightColor();
F32 max_color = llmax(sunDiffuse.mV[0], sunDiffuse.mV[1], sunDiffuse.mV[2]);
if (max_color > 1.f)

View File

@ -3910,6 +3910,7 @@ BOOL LLViewerShaderMgr::loadShadersWindLight()
gWLCloudProgram.mFeatures.calculatesAtmospherics = true;
gWLCloudProgram.mFeatures.hasTransport = true;
gWLCloudProgram.mFeatures.hasGamma = true;
gWLCloudProgram.mFeatures.hasSrgb = true;
gWLCloudProgram.mShaderFiles.push_back(make_pair("windlight/cloudsV.glsl", GL_VERTEX_SHADER_ARB));
gWLCloudProgram.mShaderFiles.push_back(make_pair("windlight/cloudsF.glsl", GL_FRAGMENT_SHADER_ARB));
gWLCloudProgram.mShaderLevel = mShaderLevel[SHADER_WINDLIGHT];

View File

@ -6219,18 +6219,8 @@ void LLPipeline::setupHWLights(LLDrawPool* pool)
mSunDir.setVec(sun_dir);
mMoonDir.setVec(moon_dir);
// calculates diffuse sunlight per-pixel downstream, just provide setting sunlight_color
if (canUseWindLightShaders())
{
mSunDiffuse.setVec(psky->getSunlightColor());
}
else
{
// not using atmo shaders, use CPU-generated attenuated sunlight diffuse...
mSunDiffuse.setVec(psky->getSunDiffuse());
}
mMoonDiffuse.setVec(psky->getMoonDiffuse());
mSunDiffuse.setVec(psky->getSunlightColor());
mMoonDiffuse.setVec(psky->getMoonlightColor());
F32 max_color = llmax(mSunDiffuse.mV[0], mSunDiffuse.mV[1], mSunDiffuse.mV[2]);
if (max_color > 1.f)
@ -6257,15 +6247,15 @@ void LLPipeline::setupHWLights(LLDrawPool* pool)
LLVector4 light_dir = sun_up ? mSunDir : mMoonDir;
mHWLightColors[0] = mSunDiffuse;
mHWLightColors[0] = sun_up ? mSunDiffuse : mMoonDiffuse;
LLLightState* light = gGL.getLight(0);
light->setPosition(light_dir);
light->setSunPrimary(sun_up);
light->setDiffuse(mSunDiffuse);
light->setDiffuse(mHWLightColors[0]);
light->setDiffuseB(mMoonDiffuse);
light->setAmbient(LLColor4::black);
light->setAmbient(psky->getTotalAmbient());
light->setSpecular(LLColor4::black);
light->setConstantAttenuation(1.f);
light->setLinearAttenuation(0.f);