diff options
Diffstat (limited to 'indra/newview/app_settings/shaders/class2')
3 files changed, 129 insertions, 30 deletions
| diff --git a/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl index 9c7a4df767..0658b3ede5 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl @@ -63,6 +63,8 @@ void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, ou  float getAmbientClamp();  vec3 atmosFragLighting(vec3 l, vec3 additive, vec3 atten);  vec3 scaleSoftClipFrag(vec3 l); +vec3 fullbrightAtmosTransportFrag(vec3 light, vec3 additive, vec3 atten); +vec3 fullbrightScaleSoftClip(vec3 light);  vec3 linear_to_srgb(vec3 c);  vec3 srgb_to_linear(vec3 c); @@ -162,6 +164,8 @@ vec3 post_diffuse = color.rgb;   vec3 post_spec = color.rgb; +        color.rgb = mix(color.rgb, diffuse_srgb.rgb, diffuse_srgb.a); +          if (envIntensity > 0.0)          { //add environmentmap              vec3 env_vec = env_mat * refnormpersp; @@ -170,19 +174,15 @@ vec3 post_diffuse = color.rgb;              color = mix(color.rgb, reflected_color, envIntensity*0.75); // MAGIC NUMBER SL-12574; ALM: On, Quality >= High  #endif          } -        else -        { -            color.rgb = mix(color.rgb, diffuse_srgb.rgb, diffuse_srgb.a); -        }  vec3 post_env = color.rgb; -        if (norm.w < 1) +        if (norm.w < 0.5)          {  #if !defined(SUNLIGHT_KILL)              vec3 p = normalize(pos.xyz); -            color = atmosFragLighting(color, additive, atten); -            color = scaleSoftClipFrag(color); +            color = mix(atmosFragLighting(color, additive, atten), fullbrightAtmosTransportFrag(color, additive, atten), diffuse_srgb.a); +            color = mix(scaleSoftClipFrag(color), fullbrightScaleSoftClip(color), diffuse_srgb.a);  #endif          } diff --git a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsV.glsl b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsV.glsl index a4bd0d566b..445d7c6352 100644 --- a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsV.glsl +++ b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsV.glsl @@ -32,20 +32,124 @@ void setPositionEye(vec3 v);  vec3 getAdditiveColor(); -void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, out vec3 sunlit, out vec3 amblit, out vec3 additive, out vec3 atten, bool use_ao); +//VARYING vec4 vary_CloudUVs; +//VARYING float vary_CloudDensity; + +// Inputs +uniform vec4 morphFactor; +uniform vec3 camPosLocal; +//uniform vec4 camPosWorld; + +uniform vec4 lightnorm; +uniform vec4 sunlight_color; +uniform vec4 ambient; +uniform vec4 blue_horizon; +uniform vec4 blue_density; +uniform float haze_horizon; +uniform float haze_density; +uniform float cloud_shadow; +uniform float density_multiplier; +uniform float distance_multiplier; +uniform float max_y; +uniform vec4 glow;  void calcAtmospherics(vec3 inPositionEye) { +     +	vec3 P = inPositionEye; +	setPositionEye(P); +	 +	//(TERRAIN) limit altitude +	if (P.y > max_y) P *= (max_y / P.y); +	if (P.y < -max_y) P *= (-max_y / P.y); + +	vec3 tmpLightnorm = lightnorm.xyz; + +	vec3 Pn = normalize(P); +	float  Plen = length(P); + +	vec4 temp1 = vec4(0); +	vec3 temp2 = vec3(0); +	vec4 blue_weight; +	vec4 haze_weight; +	vec4 sunlight = sunlight_color; +	vec4 light_atten; + +	//sunlight attenuation effect (hue and brightness) due to atmosphere +	//this is used later for sunlight modulation at various altitudes +	light_atten = (blue_density + vec4(haze_density * 0.25)) * (density_multiplier * max_y); +		//I had thought blue_density and haze_density should have equal weighting, +		//but attenuation due to haze_density tends to seem too strong + +	temp1 = blue_density + vec4(haze_density); +	blue_weight = blue_density / temp1; +	haze_weight = vec4(haze_density) / temp1; + +	//(TERRAIN) compute sunlight from lightnorm only (for short rays like terrain) +	temp2.y = max(0.0, tmpLightnorm.y); +	temp2.y = 1. / temp2.y; +	sunlight *= exp( - light_atten * temp2.y); + +	// main atmospheric scattering line integral +	temp2.z = Plen * density_multiplier; + +	// Transparency (-> temp1) +	// ATI Bugfix -- can't store temp1*temp2.z*distance_multiplier in a variable because the ati +	// compiler gets confused. +	temp1 = exp(-temp1 * temp2.z * distance_multiplier); + +	//final atmosphere attenuation factor +	setAtmosAttenuation(temp1.rgb); +	//vary_AtmosAttenuation = distance_multiplier / 10000.; +	//vary_AtmosAttenuation = density_multiplier * 100.; +	//vary_AtmosAttenuation = vec4(Plen / 100000., 0., 0., 1.); + +	//compute haze glow +	//(can use temp2.x as temp because we haven't used it yet) +	temp2.x = dot(Pn, tmpLightnorm.xyz); +	temp2.x = 1. - temp2.x; +		//temp2.x is 0 at the sun and increases away from sun +	temp2.x = max(temp2.x, .03);	//was glow.y +		//set a minimum "angle" (smaller glow.y allows tighter, brighter hotspot) +	temp2.x *= glow.x; +		//higher glow.x gives dimmer glow (because next step is 1 / "angle") +	temp2.x = pow(temp2.x, glow.z); +		//glow.z should be negative, so we're doing a sort of (1 / "angle") function + +	//add "minimum anti-solar illumination" +	temp2.x += .25; + + +	//increase ambient when there are more clouds +	vec4 tmpAmbient = ambient + (vec4(1.) - ambient) * cloud_shadow * 0.5; + +	//haze color +	setAdditiveColor( +		vec3(blue_horizon * blue_weight * (sunlight*(1.-cloud_shadow) + tmpAmbient) +	  + (haze_horizon * haze_weight) * (sunlight*(1.-cloud_shadow) * temp2.x +		  + tmpAmbient))); +	 +	//brightness of surface both sunlight and ambient +	setSunlitColor(vec3(sunlight * .5)); +	setAmblitColor(vec3(tmpAmbient * .25)); +	setAdditiveColor(getAdditiveColor() * vec3(1.0 - temp1)); + +	// vary_SunlitColor = vec3(0); +	// vary_AmblitColor = vec3(0); +	// vary_AdditiveColor = vec4(Pn, 1.0); + +	/* +	const float cloudShadowScale = 100.; +	// Get cloud uvs for shadowing +	vec3 cloudPos = inPositionEye + camPosWorld - cloudShadowScale / 2.; +	vary_CloudUVs.xy = cloudPos.xz / cloudShadowScale; + +	// We can take uv1 and multiply it by (TerrainSpan / CloudSpan) +//	cloudUVs *= (((worldMaxZ - worldMinZ) * 20) /40000.); +	vary_CloudUVs *= (10000./40000.); -    vec3 P = inPositionEye; -    setPositionEye(P); -    vec3 tmpsunlit = vec3(1); -    vec3 tmpamblit = vec3(1); -    vec3 tmpaddlit = vec3(1); -    vec3 tmpattenlit = vec3(1); -    calcAtmosphericVars(inPositionEye, vec3(0), 1, tmpsunlit, tmpamblit, tmpaddlit, tmpattenlit, false); -    setSunlitColor(tmpsunlit); -    setAmblitColor(tmpamblit); -    setAdditiveColor(tmpaddlit); -    setAtmosAttenuation(tmpattenlit); +	// Offset by sun vector * (CloudAltitude / CloudSpan) +	vary_CloudUVs.x += tmpLightnorm.x / tmpLightnorm.y * (3000./40000.); +	vary_CloudUVs.y += tmpLightnorm.z / tmpLightnorm.y * (3000./40000.); +	*/  } diff --git a/indra/newview/app_settings/shaders/class2/windlight/transportF.glsl b/indra/newview/app_settings/shaders/class2/windlight/transportF.glsl index f69d36f715..b0cf9b0002 100644 --- a/indra/newview/app_settings/shaders/class2/windlight/transportF.glsl +++ b/indra/newview/app_settings/shaders/class2/windlight/transportF.glsl @@ -34,14 +34,9 @@ uniform int no_atmo;  vec3 atmosTransportFrag(vec3 light, vec3 additive, vec3 atten)  { -    if (no_atmo == 1) -    { -        return light * 2.0; -    } -    // fullbright responds minimally to atmos scatter effects  -    light *= min(15.0 * atten.r, 1.0); -    light += (0.1 * additive); -    return light * 2.0; +    light *= atten.r; +	light += additive * 2.0; +	return light;  }  vec3 atmosTransport(vec3 light) @@ -52,7 +47,7 @@ vec3 atmosTransport(vec3 light)  vec3 fullbrightAtmosTransportFrag(vec3 light, vec3 additive, vec3 atten)  {      float brightness = dot(light.rgb * 0.5, vec3(0.3333)) + 0.1; -    return atmosTransportFrag(light * 0.5, additive * brightness, atten); +    return mix(atmosTransport(light.rgb), light.rgb + additive, brightness * brightness);  }  vec3 fullbrightAtmosTransport(vec3 light) @@ -62,6 +57,6 @@ vec3 fullbrightAtmosTransport(vec3 light)  vec3 fullbrightShinyAtmosTransport(vec3 light)  { -    float brightness = dot(light.rgb * 0.5, vec3(0.33333)) + 0.1; -    return atmosTransportFrag(light * 0.5, getAdditiveColor() * (brightness * brightness), getAtmosAttenuation()); +    float brightness = dot(light.rgb, vec3(0.33333)); +    return mix(atmosTransport(light.rgb), (light.rgb + getAdditiveColor().rgb) * (2.0 - brightness), brightness * brightness);  } | 
