Modify ambient handling and forward projector lighting again to stamp out alpha fires.
master
Graham Linden 2019-05-29 15:57:24 -07:00
parent a00dd2837d
commit 2f2cf6d855
8 changed files with 41 additions and 42 deletions

View File

@ -1249,14 +1249,22 @@ LLColor4 LLSettingsSky::getTotalAmbient() const
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_a(0.9, 0.9, 1.32);
LLColor3 moonlight_b(0.66, 0.66, 2.0);
LLColor3 moonlight = lerp(moonlight_b, moonlight_a, moon_brightness);
return moonlight;
}
void LLSettingsSky::clampColor(LLColor3& color) const
{
F32 max_color = llmax(color.mV[0], color.mV[1], color.mV[2]);
if (max_color > 1.f)
{
color *= 1.f/max_color;
}
color.clamp();
}
void LLSettingsSky::calculateLightSettings() const
{
// Initialize temp variables
@ -1282,30 +1290,28 @@ void LLSettingsSky::calculateLightSettings() const
}
lighty = llmax(LIMIT, lighty);
componentMultBy(sunlight, componentExp((light_atten * -1.f) * lighty));
componentMultBy(sunlight, light_transmittance);
clampColor(sunlight);
//increase ambient when there are more clouds
LLColor3 tmpAmbient = ambient + (smear(1.f) - ambient) * cloud_shadow;
componentMultBy(tmpAmbient, light_transmittance);
clampColor(tmpAmbient);
//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, light_transmittance));
//mSunAmbient = gammaCorrect(componentMult(tmpAmbient, light_transmittance));
mSunDiffuse = componentMult(sunlight, light_transmittance);
mSunAmbient = componentMult(tmpAmbient, light_transmittance);
mSunDiffuse = gammaCorrect(sunlight);
mSunAmbient = gammaCorrect(tmpAmbient);
F32 moon_brightness = getIsMoonUp() ? getMoonBrightness() : 0.001f;
LLColor3 moonlight = getMoonlightColor();
LLColor3 moonlight_b(0.33, 0.33, 1.0); // scotopic ambient value
LLColor3 moonlight_b(0.66, 0.66, 1.2); // scotopic ambient value
componentMultBy(moonlight, componentExp((light_atten * -1.f) * lighty));
clampColor(moonlight);
//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;
mMoonDiffuse = gammaCorrect(componentMult(moonlight, light_transmittance) * moon_brightness);
mMoonAmbient = gammaCorrect(componentMult(moonlight_b, light_transmittance) * 0.0125f);
mTotalAmbient = mSunAmbient;
}

View File

@ -346,6 +346,7 @@ private:
void calculateHeavenlyBodyPositions() const;
void calculateLightSettings() const;
void clampColor(LLColor3& color) const;
mutable LLVector3 mSunDirection;
mutable LLVector3 mMoonDirection;

View File

@ -102,8 +102,6 @@ vec3 calcPointLightOrSpotLight(vec3 light_col, vec3 diffuse, vec3 v, vec3 n, vec
return col;
}
dist /= la;
/* clip to projector bounds
vec4 proj_tc = proj_mat * lp;
@ -117,16 +115,17 @@ vec3 calcPointLightOrSpotLight(vec3 light_col, vec3 diffuse, vec3 v, vec3 n, vec
return col;
}*/
fa += 1.0;
if (dist > 0.0 && la > 0.0 && fa > 0.0)
if (dist > 0.0 && la > 0.0)
{
dist /= la;
//normalize light vector
lv = normalize(lv);
//distance attenuation
float dist_atten = clamp(1.0-(dist-1.0*(1.0-fa))/fa, 0.0, 1.0);
dist_atten *= dist_atten;
dist_atten *= 2.0f;
//dist_atten *= 2.0f;
if (dist_atten <= 0.0)
{
@ -177,14 +176,14 @@ void main()
#ifdef USE_DIFFUSE_TEX
vec4 diffuse_srgb = texture2D(diffuseMap,vary_texcoord0.xy);
vec4 diffuse_linear = vec4(srgb_to_linear(diffuse_srgb.rgb), diffuse_srgb.a);
#endif
#ifdef USE_INDEXED_TEX
vec4 diffuse_linear = diffuseLookup(vary_texcoord0.xy);
vec4 diffuse_srgb = vec4(linear_to_srgb(diffuse_linear.rgb), diffuse_linear.a);
vec4 diffuse_srgb = diffuseLookup(vary_texcoord0.xy);
#endif
vec4 diffuse_linear = vec4(srgb_to_linear(diffuse_srgb.rgb), diffuse_srgb.a);
#ifdef FOR_IMPOSTOR
vec4 color;
color.rgb = diffuse_srgb.rgb;
@ -236,9 +235,7 @@ void main()
float ambient = da;
ambient *= 0.5;
ambient *= ambient;
float ambient_clamp = getAmbientClamp() + 0.1;
ambient = (1.0 - ambient) * ambient_clamp;
ambient = (1.0 - ambient);
vec3 sun_contrib = min(final_da, shadow) * sunlit;
@ -268,7 +265,7 @@ vec3 post_atmo = color.rgb;
// to linear!
color.rgb = srgb_to_linear(color.rgb);
#define LIGHT_LOOP(i) light.rgb += calcPointLightOrSpotLight(light_diffuse[i].rgb, diffuse_srgb.rgb, pos.xyz, norm, light_position[i], light_direction[i].xyz, light_attenuation[i].x, light_attenuation[i].y, light_attenuation[i].z, light_attenuation[i].w);
#define LIGHT_LOOP(i) light.rgb += calcPointLightOrSpotLight(light_diffuse[i].rgb, diffuse_linear.rgb, pos.xyz, norm, light_position[i], light_direction[i].xyz, light_attenuation[i].x, light_attenuation[i].y, light_attenuation[i].z, light_attenuation[i].w);
LIGHT_LOOP(1)
LIGHT_LOOP(2)

View File

@ -112,8 +112,7 @@ vec3 calcPointLightOrSpotLight(vec3 light_col, vec3 npos, vec3 diffuse, vec4 spe
return col;
}*/
fa += 1.0;
if (dist > 0.0 && la > 0.0 && fa > 0.0)
if (dist > 0.0 && la > 0.0)
{
//normalize light vector
lv = normalize(lv);
@ -121,7 +120,7 @@ vec3 calcPointLightOrSpotLight(vec3 light_col, vec3 npos, vec3 diffuse, vec4 spe
//distance attenuation
float dist_atten = clamp(1.0-(dist-1.0*(1.0-fa))/fa, 0.0, 1.0);
dist_atten *= dist_atten;
dist_atten *= 2.0f;
//dist_atten *= 2.0f;
if (dist_atten <= 0.0)
{
@ -328,9 +327,7 @@ void main()
float ambient = da;
ambient *= 0.5;
ambient *= ambient;
float ambient_clamp = getAmbientClamp() + 0.1;
ambient = (1.0 - ambient) * ambient_clamp;
ambient = (1.0 - ambient);
vec3 sun_contrib = min(final_da, shadow) * sunlit;

View File

@ -106,10 +106,7 @@ void main()
float ambient = da;
ambient *= 0.5;
ambient *= ambient;
ambient = (1.0 - ambient);
float ambient_clamp = getAmbientClamp() + 0.1;
ambient *= ambient_clamp;
vec3 sun_contrib = final_da * sunlit;

View File

@ -138,6 +138,6 @@ void calcAtmosphericVars(vec3 inPositionEye, float ambFactor, out vec3 sunlit, o
//brightness of surface both sunlight and ambient
sunlit = sunlight.rgb * 0.5;
amblit = tmpAmbient.rgb * .25;
amblit = tmpAmbient.rgb * .5;
additive *= vec3(1.0 - temp1);
}

View File

@ -114,10 +114,7 @@ void main()
float ambient = da;
ambient *= 0.5;
ambient *= ambient;
float ambient_clamp = getAmbientClamp() + 0.1;
ambient = (1.0 - ambient);
ambient *= ambient_clamp;
vec3 sun_contrib = min(scol, final_da) * sunlit;
@ -161,7 +158,9 @@ vec3 post_diffuse = color.rgb;
vec3 sp = sun_contrib*scontrib / 16.0;
sp = clamp(sp, vec3(0), vec3(1));
bloom += dot(sp, sp) / 6.0;
#if !defined(SUNLIGHT_KILL)
color += sp * spec.rgb;
#endif
}
}
@ -175,7 +174,9 @@ vec3 post_diffuse = color.rgb;
{ //add environmentmap
vec3 env_vec = env_mat * refnormpersp;
vec3 reflected_color = textureCube(environmentMap, env_vec).rgb;
#if !defined(SUNLIGHT_KILL)
color = mix(color.rgb, reflected_color, envIntensity);
#endif
}
vec3 post_env = color.rgb;

View File

@ -35,7 +35,7 @@ vec4 calcLighting(vec3 pos, vec3 norm, vec4 color)
vec4 c = sumLights(pos, norm, color);
#if !defined(AMBIENT_KILL)
c.rgb += atmosAmbient() * color.rgb * getAmbientClamp();
c.rgb += atmosAmbient() * color.rgb * 0.5 * getAmbientClamp();
#endif
return c;