diff options
Diffstat (limited to 'indra/newview/app_settings/shaders')
3 files changed, 42 insertions, 125 deletions
| diff --git a/indra/newview/app_settings/shaders/class1/deferred/fullbrightShinyF.glsl b/indra/newview/app_settings/shaders/class1/deferred/fullbrightShinyF.glsl index af903eeda8..bd0ad3bce8 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/fullbrightShinyF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/fullbrightShinyF.glsl @@ -38,12 +38,20 @@ uniform sampler2D diffuseMap;  VARYING vec4 vertex_color;  VARYING vec2 vary_texcoord0;  VARYING vec3 vary_texcoord1; +VARYING vec4 vary_position;  uniform samplerCube environmentMap;  vec3 fullbrightShinyAtmosTransport(vec3 light); +vec3 fullbrightAtmosTransportFrag(vec3 light, vec3 additive, vec3 atten);  vec3 fullbrightScaleSoftClip(vec3 light); +void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, out vec3 sunlit, out vec3 amblit, out vec3 additive, out vec3 atten, bool use_ao); + +vec3 linear_to_srgb(vec3 c); +vec3 srgb_to_linear(vec3 c); + +  void main()  {  #ifdef HAS_DIFFUSE_LOOKUP @@ -52,20 +60,28 @@ void main()  	vec4 color = texture2D(diffuseMap, vary_texcoord0.xy);  #endif -	  	color.rgb *= vertex_color.rgb; +	vec3 pos = vary_position.xyz/vary_position.w; + +	vec3 sunlit; +	vec3 amblit; +	vec3 additive; +	vec3 atten; + +	calcAtmosphericVars(pos.xyz, vec3(0), 1.0, sunlit, amblit, additive, atten, false);  	vec3 envColor = textureCube(environmentMap, vary_texcoord1.xyz).rgb;	 -	color.rgb = mix(color.rgb, envColor.rgb, vertex_color.a); +	float env_intensity = vertex_color.a; +	color.rgb = mix(color.rgb, envColor.rgb, env_intensity); -	color.rgb = pow(color.rgb,vec3(2.2f,2.2f,2.2f)); +	//color.rgb = srgb_to_linear(color.rgb); -	color.rgb = fullbrightShinyAtmosTransport(color.rgb); +	color.rgb = fullbrightAtmosTransportFrag(color.rgb, additive, atten);  	color.rgb = fullbrightScaleSoftClip(color.rgb);  	color.a = 1.0; -	color.rgb = pow(color.rgb, vec3(1.0/2.2)); +	//color.rgb = linear_to_srgb(color.rgb);  	frag_color = color;  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/fullbrightShinyV.glsl b/indra/newview/app_settings/shaders/class1/deferred/fullbrightShinyV.glsl index 34bd8d445a..8f6eb79668 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/fullbrightShinyV.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/fullbrightShinyV.glsl @@ -45,7 +45,7 @@ ATTRIBUTE vec2 texcoord0;  VARYING vec4 vertex_color;  VARYING vec2 vary_texcoord0;  VARYING vec3 vary_texcoord1; - +VARYING vec4 vary_position;  void main()  { @@ -53,7 +53,7 @@ void main()  	vec4 vert = vec4(position.xyz,1.0);  	passTextureIndex();  	vec4 pos = (modelview_matrix * vert); -	gl_Position = modelview_projection_matrix*vec4(position.xyz, 1.0); +	vary_position = gl_Position = modelview_projection_matrix*vec4(position.xyz, 1.0);  	vec3 norm = normalize(normal_matrix * normal);  	vec3 ref = reflect(pos.xyz, -norm); diff --git a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsV.glsl b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsV.glsl index 445d7c6352..4c418e414f 100644 --- a/indra/newview/app_settings/shaders/class2/windlight/atmosphericsV.glsl +++ b/indra/newview/app_settings/shaders/class2/windlight/atmosphericsV.glsl @@ -24,6 +24,12 @@   */  // VARYING param funcs + + +uniform vec3 sun_dir; +uniform vec3 moon_dir; +uniform int sun_up_factor; +  void setSunlitColor(vec3 v);  void setAmblitColor(vec3 v);  void setAdditiveColor(vec3 v); @@ -32,124 +38,19 @@ void setPositionEye(vec3 v);  vec3 getAdditiveColor(); -//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 calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, out vec3 sunlit, out vec3 amblit, out vec3 additive, out vec3 atten, bool use_ao);  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.); - -	// Offset by sun vector * (CloudAltitude / CloudSpan) -	vary_CloudUVs.x += tmpLightnorm.x / tmpLightnorm.y * (3000./40000.); -	vary_CloudUVs.y += tmpLightnorm.z / tmpLightnorm.y * (3000./40000.); -	*/ +    vec3 P = inPositionEye; +    setPositionEye(P); +    vec3 tmpsunlit = vec3(1); +    vec3 tmpamblit = vec3(1); +    vec3 tmpaddlit = vec3(1); +    vec3 tmpattenlit = vec3(1); +	vec3 light_dir = (sun_up_factor == 1) ? sun_dir : moon_dir;	 +    calcAtmosphericVars(inPositionEye, light_dir, 1, tmpsunlit, tmpamblit, tmpaddlit, tmpattenlit, false); +    setSunlitColor(tmpsunlit); +    setAmblitColor(tmpamblit); +    setAdditiveColor(tmpaddlit); +    setAtmosAttenuation(tmpattenlit);  } - | 
