diff options
| author | Graham Linden <graham@lindenlab.com> | 2018-09-10 23:21:34 +0100 | 
|---|---|---|
| committer | Graham Linden <graham@lindenlab.com> | 2018-09-10 23:21:34 +0100 | 
| commit | 555dfdc6ef0dab37bc4eaf6ae0b00a857f0609da (patch) | |
| tree | 30566238585b1a62a4ffec505f6dc48f87053215 | |
| parent | ef2c61275eafa7d1fd3afa3f0eb76397632f12c9 (diff) | |
Add copies of existing lighting shaders for advanced atmo path.
Enable advanced atmo by default.
Disable nSight in settings.xml
Remove MSVC debug pragmas.
11 files changed, 1465 insertions, 10 deletions
| diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 8f4faf51da..5b790fe9cf 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -8664,7 +8664,7 @@      <key>Type</key>      <string>Boolean</string>      <key>Value</key> -    <integer>1</integer> +    <integer>0</integer>    </map>    <key>RenderLocalLights</key>    <map> @@ -10165,7 +10165,7 @@      <key>Type</key>      <string>Boolean</string>      <key>Value</key> -    <integer>0</integer> +    <integer>1</integer>    </map>    <key>RenderUseTriStrips</key>    <map> diff --git a/indra/newview/app_settings/shaders/class3/deferred/multiSpotLightF.glsl b/indra/newview/app_settings/shaders/class3/deferred/multiSpotLightF.glsl new file mode 100644 index 0000000000..864ba4859d --- /dev/null +++ b/indra/newview/app_settings/shaders/class3/deferred/multiSpotLightF.glsl @@ -0,0 +1,314 @@ +/**  + * @file multiSpotLightF.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, Linden Research, Inc. + *  + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + *  + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + *  + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + *  + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */ +  +#extension GL_ARB_texture_rectangle : enable +#extension GL_ARB_shader_texture_lod : enable + +/*[EXTRA_CODE_HERE]*/ + +#ifdef DEFINE_GL_FRAGCOLOR +out vec4 frag_color; +#else +#define frag_color gl_FragColor +#endif + +uniform sampler2DRect diffuseRect; +uniform sampler2DRect specularRect; +uniform sampler2DRect depthMap; +uniform sampler2DRect normalMap; +uniform samplerCube environmentMap; +uniform sampler2DRect lightMap; +uniform sampler2D noiseMap; +uniform sampler2D projectionMap; +uniform sampler2D lightFunc; + +uniform mat4 proj_mat; //screen space to light space +uniform float proj_near; //near clip for projection +uniform vec3 proj_p; //plane projection is emitting from (in screen space) +uniform vec3 proj_n; +uniform float proj_focus; //distance from plane to begin blurring +uniform float proj_lod;  //(number of mips in proj map) +uniform float proj_range; //range between near clip and far clip plane of projection +uniform float proj_ambient_lod; +uniform float proj_ambiance; +uniform float near_clip; +uniform float far_clip; + +uniform vec3 proj_origin; //origin of projection to be used for angular attenuation +uniform float sun_wash; +uniform int proj_shadow_idx; +uniform float shadow_fade; + +uniform vec3 center; +uniform float size; +uniform vec3 color; +uniform float falloff; + +VARYING vec4 vary_fragcoord; +uniform vec2 screen_res; + +uniform mat4 inv_proj; + +vec3 srgb_to_linear(vec3 cs); +vec3 linear_to_srgb(vec3 cl); +vec3 decode_normal (vec2 enc); + +vec4 correctWithGamma(vec4 col) +{ +	return vec4(srgb_to_linear(col.rgb), col.a); +} + +vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod) +{ +	vec4 ret = texture2DLod(projectionMap, tc, lod); +	ret.rgb = srgb_to_linear(ret.rgb); +	 +	vec2 dist = vec2(0.5) - abs(tc-vec2(0.5)); +	 +	float det = min(lod/(proj_lod*0.5), 1.0); +	 +	float d = min(dist.x, dist.y); +     +    d *= min(1, d * (proj_lod - lod)); +	 +	float edge = 0.25*det; +     +	ret *= clamp(d/edge, 0.0, 1.0); +	 +	return ret; +} + +vec4 texture2DLodDiffuse(sampler2D projectionMap, vec2 tc, float lod) +{ +	vec4 ret = texture2DLod(projectionMap, tc, lod); +	ret = correctWithGamma(ret); + +	vec2 dist = vec2(0.5) - abs(tc-vec2(0.5)); +	 +	float det = min(lod/(proj_lod*0.5), 1.0); +	 +	float d = min(dist.x, dist.y); +	 +	float edge = 0.25*det; +		 +	ret *= clamp(d/edge, 0.0, 1.0); +	 +	return ret; +} + +vec4 texture2DLodAmbient(sampler2D projectionMap, vec2 tc, float lod) +{ +	vec4 ret = texture2DLod(projectionMap, tc, lod); +	ret = correctWithGamma(ret); + +	vec2 dist = tc-vec2(0.5); +	 +	float d = dot(dist,dist); +		 +	ret *= min(clamp((0.25-d)/0.25, 0.0, 1.0), 1.0); +	 +	return ret; +} + + +vec4 getPosition(vec2 pos_screen) +{ +	float depth = texture2DRect(depthMap, pos_screen.xy).r; +	vec2 sc = pos_screen.xy*2.0; +	sc /= screen_res; +	sc -= vec2(1.0,1.0); +	vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0); +	vec4 pos = inv_proj * ndc; +	pos /= pos.w; +	pos.w = 1.0; +	return pos; +} + +void main()  +{ +	vec4 frag = vary_fragcoord; +	frag.xyz /= frag.w; +	frag.xyz = frag.xyz*0.5+0.5; +	frag.xy *= screen_res; +	 +	vec3 pos = getPosition(frag.xy).xyz; +	vec3 lv = center.xyz-pos.xyz; +	float dist = length(lv); +	dist /= size; +	if (dist > 1.0) +	{ +		discard; +	} +	 +	float shadow = 1.0; +	 +	if (proj_shadow_idx >= 0) +	{ +		vec4 shd = texture2DRect(lightMap, frag.xy); +		float sh[2]; +		sh[0] = shd.b; +		sh[1] = shd.a; +		shadow = min(sh[proj_shadow_idx]+shadow_fade, 1.0); +	} +	 +	vec3 norm = texture2DRect(normalMap, frag.xy).xyz; +	 +	float envIntensity = norm.z; + +	norm = decode_normal(norm.xy); +	 +	norm = normalize(norm); +	float l_dist = -dot(lv, proj_n); +	 +	vec4 proj_tc = (proj_mat * vec4(pos.xyz, 1.0)); +	if (proj_tc.z < 0.0) +	{ +		discard; +	} +	 +	proj_tc.xyz /= proj_tc.w; +	 +	float fa = falloff+1.0; +	float dist_atten = min(1.0-(dist-1.0*(1.0-fa))/fa, 1.0); +	dist_atten *= dist_atten; +	dist_atten *= 2.0; +	if (dist_atten <= 0.0) +	{ +		discard; +	} +	 +	lv = proj_origin-pos.xyz; +	lv = normalize(lv); +	float da = dot(norm, lv); + +	vec3 col = vec3(0,0,0); +		 +	vec3 diff_tex = texture2DRect(diffuseRect, frag.xy).rgb; +	 +	vec4 spec = texture2DRect(specularRect, frag.xy); + +	vec3 dlit = vec3(0, 0, 0); + +	float noise = texture2D(noiseMap, frag.xy/128.0).b; +	if (proj_tc.z > 0.0 && +		proj_tc.x < 1.0 && +		proj_tc.y < 1.0 && +		proj_tc.x > 0.0 && +		proj_tc.y > 0.0) +	{ +		float amb_da = proj_ambiance; +		float lit = 0.0; + +		if (da > 0.0) +		{ +			lit = da * dist_atten * noise; + +			float diff = clamp((l_dist-proj_focus)/proj_range, 0.0, 1.0); +			float lod = diff * proj_lod; +			 +			vec4 plcol = texture2DLodDiffuse(projectionMap, proj_tc.xy, lod); +		 +			dlit = color.rgb * plcol.rgb * plcol.a; +			 +			col = dlit*lit*diff_tex*shadow; +			amb_da += (da*0.5)*(1.0-shadow)*proj_ambiance; +		} +		 +		//float diff = clamp((proj_range-proj_focus)/proj_range, 0.0, 1.0); +		vec4 amb_plcol = texture2DLodAmbient(projectionMap, proj_tc.xy, proj_lod); +							 +		amb_da += (da*da*0.5+0.5)*proj_ambiance; +				 +		amb_da *= dist_atten * noise; +			 +		amb_da = min(amb_da, 1.0-lit); +			 +		col += amb_da*color.rgb*diff_tex.rgb*amb_plcol.rgb*amb_plcol.a; +	} +	 + +	if (spec.a > 0.0) +	{ +		vec3 npos = -normalize(pos); +		dlit *= min(da*6.0, 1.0) * dist_atten; + +		//vec3 ref = dot(pos+lv, norm); +		vec3 h = normalize(lv+npos); +		float nh = dot(norm, h); +		float nv = dot(norm, npos); +		float vh = dot(npos, h); +		float sa = nh; +		float fres = pow(1 - dot(h, npos), 5)*0.4+0.5; + +		float gtdenom = 2 * nh; +		float gt = max(0, min(gtdenom * nv / vh, gtdenom * da / vh)); +								 +		if (nh > 0.0) +		{ +			float scol = fres*texture2D(lightFunc, vec2(nh, spec.a)).r*gt/(nh*da); +			col += dlit*scol*spec.rgb*shadow; +			//col += spec.rgb; +		} +	}	 +	 +	 +	 +	 + +	if (envIntensity > 0.0) +	{ +		vec3 ref = reflect(normalize(pos), norm); +		 +		//project from point pos in direction ref to plane proj_p, proj_n +		vec3 pdelta = proj_p-pos; +		float ds = dot(ref, proj_n); +		 +		if (ds < 0.0) +		{ +			vec3 pfinal = pos + ref * dot(pdelta, proj_n)/ds; +			 +			vec4 stc = (proj_mat * vec4(pfinal.xyz, 1.0)); + +			if (stc.z > 0.0) +			{ +                stc /= stc.w; +								 +				if (stc.x < 1.0 && +					stc.y < 1.0 && +					stc.x > 0.0 && +					stc.y > 0.0) +				{ +					col += color.rgb * texture2DLodSpecular(projectionMap, stc.xy, (1 - spec.a) * (proj_lod * 0.6)).rgb * shadow * envIntensity; +				} +			} +		} +	} + +	//not sure why, but this line prevents MATBUG-194 +	col = max(col, vec3(0.0)); + +	frag_color.rgb = col;	 +	frag_color.a = 0.0; +} diff --git a/indra/newview/app_settings/shaders/class3/deferred/skyF.glsl b/indra/newview/app_settings/shaders/class3/deferred/skyF.glsl index cd0efe8cbb..7bfc114383 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/skyF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/skyF.glsl @@ -55,7 +55,7 @@ void main()      vec3 view_ray = (inv_modelview * vec4(view_pos.xyz, 0.0f)).xyz;      vec3 view_direction = normalize(view_ray); -    vec3 sun_direction = normalize(sun_dir); +    vec3 sun_direction  = normalize(sun_dir);      vec3 camPos = (camPosLocal / 1000.0f) + vec3(0, 0, 6360.0f);      vec3 transmittance; @@ -63,15 +63,20 @@ void main()      vec3 solar_luminance = transmittance * GetSolarLuminance();      // If the view ray intersects the Sun, add the Sun radiance. -    if (dot(view_direction, sun_direction) >= sun_size) +    float s = dot(view_direction, sun_direction); + +    // cheesy solar disc... +    if (s >= (sun_size * 0.999))      { -        radiance_sun += solar_luminance; +        radiance_sun += pow(smoothstep(0.0, 1.3, (s - (sun_size * 0.9))), 2.0) * solar_luminance;      } +    s = smoothstep(0.9, 1.0, s) * 16.0f;      vec3 color = vec3(1.0) - exp(-radiance_sun * 0.0001); +      color = pow(color, vec3(1.0 / 2.2)); -    frag_data[0] = vec4(color, 1.0); +    frag_data[0] = vec4(color, 1.0 + s);      frag_data[1] = vec4(0.0);      frag_data[2] = vec4(0.0, 1.0, 0.0, 1.0);  } diff --git a/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl new file mode 100644 index 0000000000..bda33c3213 --- /dev/null +++ b/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl @@ -0,0 +1,189 @@ +/**  + * @file softenLightF.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, Linden Research, Inc. + *  + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + *  + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + *  + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + *  + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */ +  +#extension GL_ARB_texture_rectangle : enable + +/*[EXTRA_CODE_HERE]*/ + +#ifdef DEFINE_GL_FRAGCOLOR +out vec4 frag_color; +#else +#define frag_color gl_FragColor +#endif + +uniform sampler2DRect diffuseRect; +uniform sampler2DRect specularRect; +uniform sampler2DRect normalMap; +uniform sampler2DRect lightMap; +uniform sampler2DRect depthMap; +uniform samplerCube environmentMap; +uniform sampler2D	  lightFunc; + +uniform float blur_size; +uniform float blur_fidelity; + +// Inputs +uniform vec4 morphFactor; +uniform vec3 camPosLocal; +//uniform vec4 camPosWorld; +uniform vec4 gamma; +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; +uniform float global_gamma; +uniform float scene_light_strength; +uniform mat3 env_mat; +uniform vec4 shadow_clip; +uniform mat3 ssao_effect_mat; + +uniform vec3 sun_dir; +VARYING vec2 vary_fragcoord; + +uniform mat4 inv_proj; +uniform mat4 inv_modelview; + +uniform vec2 screen_res; + +vec3 srgb_to_linear(vec3 cs); +vec3 linear_to_srgb(vec3 cl); +vec3 decode_normal (vec2 enc); + +vec4 getPosition_d(vec2 pos_screen, float depth) +{ +	vec2 sc = pos_screen.xy*2.0; +	sc /= screen_res; +	sc -= vec2(1.0,1.0); +	vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0); +	vec4 pos = inv_proj * ndc; +	pos /= pos.w; +	pos.w = 1.0; +	return pos; +} + +vec4 getPosition(vec2 pos_screen) +{ //get position in screen space (world units) given window coordinate and depth map +	float depth = texture2DRect(depthMap, pos_screen.xy).r; +	return getPosition_d(pos_screen, depth); +} + + +#ifdef WATER_FOG +vec4 applyWaterFogView(vec3 pos, vec4 color); +#endif + +void main()  +{ +	vec2 tc = vary_fragcoord.xy; +	float depth = texture2DRect(depthMap, tc.xy).r; +	vec3 pos = getPosition_d(tc, depth).xyz; +	vec4 norm = texture2DRect(normalMap, tc); +	float envIntensity = norm.z; +	norm.xyz = decode_normal(norm.xy); // unpack norm +		 +	float da = max(dot(norm.xyz, sun_dir.xyz), 0.0); + +	float light_gamma = 1.0/1.3; +	da = pow(da, light_gamma); + + +	vec4 diffuse = texture2DRect(diffuseRect, tc); + +	//convert to gamma space +	diffuse.rgb = linear_to_srgb(diffuse.rgb); +	 +	vec3 col; +	float bloom = 0.0; +	{ +		vec4 spec = texture2DRect(specularRect, vary_fragcoord.xy); +		 +		vec2 scol_ambocc = texture2DRect(lightMap, vary_fragcoord.xy).rg; +		scol_ambocc = pow(scol_ambocc, vec2(light_gamma)); + +		float scol = max(scol_ambocc.r, diffuse.a);  + +		float ambocc = scol_ambocc.g; + +                vec3 sunlit; +                vec3 amblit; +                vec3 additive; +                vec3 atten; +	 +		//calcFragAtmospherics(pos.xyz, ambocc, sunlit, amblit, additive, atten); +		//col += atmosFragAffectDirectionalLight(max(min(da, scol), 0.0), sunlit); +	 +		col *= diffuse.rgb; +	 +		vec3 refnormpersp = normalize(reflect(pos.xyz, norm.xyz)); + +		if (spec.a > 0.0) // specular reflection +		{ +			// the old infinite-sky shiny reflection +			// +			 +			float sa = dot(refnormpersp, sun_dir.xyz); +			vec3 dumbshiny = sunlit*(texture2D(lightFunc, vec2(sa, spec.a)).r); +			 +			// add the two types of shiny together +			vec3 spec_contrib = dumbshiny * spec.rgb; +			bloom = dot(spec_contrib, spec_contrib) / 6; +			col += spec_contrib; +		} +	 +		 +		col = mix(col, diffuse.rgb, diffuse.a); + +		if (envIntensity > 0.0) +		{ //add environmentmap +			vec3 env_vec = env_mat * refnormpersp; +			vec3 refcol = textureCube(environmentMap, env_vec).rgb; +			col = mix(col.rgb, refcol, envintensity); +		} +						 +		if (norm.w < 0.5) +		{ +			//col = mix(atmosFragLighting(col, additive, atten), fullbrightFragAtmosTransport(col, atten, additive), diffuse.a); +			//col = mix(scaleFragSoftClip(col), fullbrightScaleSoftClipFrag(col, atten), diffuse.a); +		} + +		#ifdef WATER_FOG +			vec4 fogged = applyWaterFogView(pos,vec4(col, bloom)); +			col = fogged.rgb; +			bloom = fogged.a; +		#endif + +		col = srgb_to_linear(col); +	} +	 +	frag_color.rgb = col; +	frag_color.a = bloom; +} diff --git a/indra/newview/app_settings/shaders/class3/deferred/softenLightV.glsl b/indra/newview/app_settings/shaders/class3/deferred/softenLightV.glsl new file mode 100644 index 0000000000..c840d72784 --- /dev/null +++ b/indra/newview/app_settings/shaders/class3/deferred/softenLightV.glsl @@ -0,0 +1,42 @@ +/**  + * @file softenLightF.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, Linden Research, Inc. + *  + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + *  + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + *  + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + *  + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */ + +uniform mat4 modelview_projection_matrix; + +ATTRIBUTE vec3 position; + +uniform vec2 screen_res; + +VARYING vec2 vary_fragcoord; + +void main() +{ +	//transform vertex +	vec4 pos = modelview_projection_matrix * vec4(position.xyz, 1.0); +	gl_Position = pos;  +	 +	 +	vary_fragcoord = (pos.xy*0.5+0.5)*screen_res; +} diff --git a/indra/newview/app_settings/shaders/class3/deferred/spotLightF.glsl b/indra/newview/app_settings/shaders/class3/deferred/spotLightF.glsl new file mode 100644 index 0000000000..a7da140b31 --- /dev/null +++ b/indra/newview/app_settings/shaders/class3/deferred/spotLightF.glsl @@ -0,0 +1,313 @@ +/**  + * @file spotLightF.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, Linden Research, Inc. + *  + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + *  + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + *  + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + *  + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */ +  +#extension GL_ARB_texture_rectangle : enable +#extension GL_ARB_shader_texture_lod : enable + +/*[EXTRA_CODE_HERE]*/ + +#ifdef DEFINE_GL_FRAGCOLOR +out vec4 frag_color; +#else +#define frag_color gl_FragColor +#endif + +uniform sampler2DRect diffuseRect; +uniform sampler2DRect specularRect; +uniform sampler2DRect depthMap; +uniform sampler2DRect normalMap; +uniform samplerCube environmentMap; +uniform sampler2DRect lightMap; +uniform sampler2D noiseMap; +uniform sampler2D projectionMap; +uniform sampler2D lightFunc; + +uniform mat4 proj_mat; //screen space to light space +uniform float proj_near; //near clip for projection +uniform vec3 proj_p; //plane projection is emitting from (in screen space) +uniform vec3 proj_n; +uniform float proj_focus; //distance from plane to begin blurring +uniform float proj_lod;  //(number of mips in proj map) +uniform float proj_range; //range between near clip and far clip plane of projection +uniform float proj_ambient_lod; +uniform float proj_ambiance; +uniform float near_clip; +uniform float far_clip; + +uniform vec3 proj_origin; //origin of projection to be used for angular attenuation +uniform float sun_wash; +uniform int proj_shadow_idx; +uniform float shadow_fade; + +uniform float size; +uniform vec3 color; +uniform float falloff; + +VARYING vec3 trans_center; +VARYING vec4 vary_fragcoord; +uniform vec2 screen_res; + +uniform mat4 inv_proj; + +vec3 decode_normal (vec2 enc); +vec3 srgb_to_linear(vec3 cs); +vec3 linear_to_srgb(vec3 cl); + +vec4 correctWithGamma(vec4 col) +{ +	return vec4(srgb_to_linear(col.rgb), col.a); +} + +vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod) +{ +	vec4 ret = texture2DLod(projectionMap, tc, lod); +	ret.rgb = srgb_to_linear(ret.rgb); +	 +	vec2 dist = vec2(0.5) - abs(tc-vec2(0.5)); +	 +	float det = min(lod/(proj_lod*0.5), 1.0); +	 +	float d = min(dist.x, dist.y); +     +    d *= min(1, d * (proj_lod - lod)); +	 +	float edge = 0.25*det; +     +	ret *= clamp(d/edge, 0.0, 1.0); +	 +	return ret; +} + +vec4 texture2DLodDiffuse(sampler2D projectionMap, vec2 tc, float lod) +{ +	vec4 ret = texture2DLod(projectionMap, tc, lod); +	ret = correctWithGamma(ret); +	 +	vec2 dist = vec2(0.5) - abs(tc-vec2(0.5)); +	 +	float det = min(lod/(proj_lod*0.5), 1.0); +	 +	float d = min(dist.x, dist.y); +	 +	float edge = 0.25*det; +		 +	ret *= clamp(d/edge, 0.0, 1.0); +	 +	return ret; +} + +vec4 texture2DLodAmbient(sampler2D projectionMap, vec2 tc, float lod) +{ +	vec4 ret = texture2DLod(projectionMap, tc, lod); +	ret = correctWithGamma(ret); +	 +	vec2 dist = tc-vec2(0.5); +	 +	float d = dot(dist,dist); +		 +	ret *= min(clamp((0.25-d)/0.25, 0.0, 1.0), 1.0); +	 +	return ret; +} + + +vec4 getPosition(vec2 pos_screen) +{ +	float depth = texture2DRect(depthMap, pos_screen.xy).r; +	vec2 sc = pos_screen.xy*2.0; +	sc /= screen_res; +	sc -= vec2(1.0,1.0); +	vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0); +	vec4 pos = inv_proj * ndc; +	pos /= pos.w; +	pos.w = 1.0; +	return pos; +} + +void main()  +{ +	vec4 frag = vary_fragcoord; +	frag.xyz /= frag.w; +	frag.xyz = frag.xyz*0.5+0.5; +	frag.xy *= screen_res; +	 +	vec3 pos = getPosition(frag.xy).xyz; +	vec3 lv = trans_center.xyz-pos.xyz; +	float dist = length(lv); +	dist /= size; +	if (dist > 1.0) +	{ +		discard; +	} +	 +	float shadow = 1.0; +	 +	if (proj_shadow_idx >= 0) +	{ +		vec4 shd = texture2DRect(lightMap, frag.xy); +		float sh[2]; +		sh[0] = shd.b; +		sh[1] = shd.a; +		shadow = min(sh[proj_shadow_idx]+shadow_fade, 1.0); +	} +	 +	vec3 norm = texture2DRect(normalMap, frag.xy).xyz; +	float envIntensity = norm.z; +	norm = decode_normal(norm.xy); +	 +	norm = normalize(norm); +	float l_dist = -dot(lv, proj_n); +	 +	vec4 proj_tc = (proj_mat * vec4(pos.xyz, 1.0)); +	if (proj_tc.z < 0.0) +	{ +		discard; +	} +	 +	proj_tc.xyz /= proj_tc.w; +	 +	float fa = falloff + 1.0; +	float dist_atten = min(1.0 - (dist - 1.0 * (1.0 - fa)) / fa, 1.0); +	dist_atten *= dist_atten; +	dist_atten *= 2.0; + +	if (dist_atten <= 0.0) +	{ +		discard; +	} +	 +	lv = proj_origin-pos.xyz; +	lv = normalize(lv); +	float da = dot(norm, lv); +		 +	vec3 col = vec3(0,0,0); +		 +	vec3 diff_tex = texture2DRect(diffuseRect, frag.xy).rgb; +		 +	vec4 spec = texture2DRect(specularRect, frag.xy); + +	vec3 dlit = vec3(0, 0, 0); + +	float noise = texture2D(noiseMap, frag.xy/128.0).b; +	if (proj_tc.z > 0.0 && +		proj_tc.x < 1.0 && +		proj_tc.y < 1.0 && +		proj_tc.x > 0.0 && +		proj_tc.y > 0.0) +	{ +		float amb_da = proj_ambiance; +		float lit = 0.0; +		 +		if (da > 0.0) +		{ +			lit = da * dist_atten * noise; + +			float diff = clamp((l_dist-proj_focus)/proj_range, 0.0, 1.0); +			float lod = diff * proj_lod; +			 +			vec4 plcol = texture2DLodDiffuse(projectionMap, proj_tc.xy, lod); +		 +			dlit = color.rgb * plcol.rgb * plcol.a; +			 +			col = dlit*lit*diff_tex*shadow; +			amb_da += (da*0.5)*(1.0-shadow)*proj_ambiance; +		} +		 +		//float diff = clamp((proj_range-proj_focus)/proj_range, 0.0, 1.0); +		vec4 amb_plcol = texture2DLodAmbient(projectionMap, proj_tc.xy, proj_lod); +							 +		amb_da += (da*da*0.5+0.5)*proj_ambiance; +				 +		amb_da *= dist_atten * noise; +			 +		amb_da = min(amb_da, 1.0-lit); +			 +		col += amb_da*color.rgb*diff_tex.rgb*amb_plcol.rgb*amb_plcol.a; +	} +	 + +	if (spec.a > 0.0) +	{ +		dlit *= min(da*6.0, 1.0) * dist_atten; +		vec3 npos = -normalize(pos); + +		//vec3 ref = dot(pos+lv, norm); +		vec3 h = normalize(lv+npos); +		float nh = dot(norm, h); +		float nv = dot(norm, npos); +		float vh = dot(npos, h); +		float sa = nh; +		float fres = pow(1 - dot(h, npos), 5)*0.4+0.5; + +		float gtdenom = 2 * nh; +		float gt = max(0, min(gtdenom * nv / vh, gtdenom * da / vh)); +								 +		if (nh > 0.0) +		{ +			float scol = fres*texture2D(lightFunc, vec2(nh, spec.a)).r*gt/(nh*da); +			col += dlit*scol*spec.rgb*shadow; +			//col += spec.rgb; +		} +	}	 +	 +	 +	 +	 + +	if (envIntensity > 0.0) +	{ +		vec3 ref = reflect(normalize(pos), norm); +		 +		//project from point pos in direction ref to plane proj_p, proj_n +		vec3 pdelta = proj_p-pos; +		float ds = dot(ref, proj_n); +		 +		if (ds < 0.0) +		{ +			vec3 pfinal = pos + ref * dot(pdelta, proj_n)/ds; +			 +			vec4 stc = (proj_mat * vec4(pfinal.xyz, 1.0)); + +			if (stc.z > 0.0) +			{ +				stc /= stc.w; +								 +				if (stc.x < 1.0 && +					stc.y < 1.0 && +					stc.x > 0.0 && +					stc.y > 0.0) +				{ +					col += color.rgb * texture2DLodSpecular(projectionMap, stc.xy, (1 - spec.a) * (proj_lod * 0.6)).rgb * shadow * envIntensity; +				} +			} +		} +	} +	 +	//not sure why, but this line prevents MATBUG-194 +	col = max(col, vec3(0.0)); + +	frag_color.rgb = col;	 +	frag_color.a = 0.0; +} diff --git a/indra/newview/app_settings/shaders/class3/deferred/sunLightF.glsl b/indra/newview/app_settings/shaders/class3/deferred/sunLightF.glsl new file mode 100644 index 0000000000..aa5e99a2f7 --- /dev/null +++ b/indra/newview/app_settings/shaders/class3/deferred/sunLightF.glsl @@ -0,0 +1,247 @@ +/**  + * @file sunLightF.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, Linden Research, Inc. + *  + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + *  + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + *  + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + *  + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */ + +#extension GL_ARB_texture_rectangle : enable + +/*[EXTRA_CODE_HERE]*/ + +#ifdef DEFINE_GL_FRAGCOLOR +out vec4 frag_color; +#else +#define frag_color gl_FragColor +#endif + +//class 2, shadows, no SSAO + +uniform sampler2DRect depthMap; +uniform sampler2DRect normalMap; +uniform sampler2DShadow shadowMap0; +uniform sampler2DShadow shadowMap1; +uniform sampler2DShadow shadowMap2; +uniform sampler2DShadow shadowMap3; +uniform sampler2DShadow shadowMap4; +uniform sampler2DShadow shadowMap5; + + +// Inputs +uniform mat4 shadow_matrix[6]; +uniform vec4 shadow_clip; +uniform float ssao_radius; +uniform float ssao_max_radius; +uniform float ssao_factor; +uniform float ssao_factor_inv; + +VARYING vec2 vary_fragcoord; + +uniform mat4 inv_proj; +uniform vec2 screen_res; +uniform vec2 proj_shadow_res; +uniform vec3 sun_dir; + +uniform vec2 shadow_res; +uniform float shadow_bias; +uniform float shadow_offset; + +uniform float spot_shadow_bias; +uniform float spot_shadow_offset; + +vec3 decode_normal (vec2 enc); + +vec4 getPosition(vec2 pos_screen) +{ +	float depth = texture2DRect(depthMap, pos_screen.xy).r; +	vec2 sc = pos_screen.xy*2.0; +	sc /= screen_res; +	sc -= vec2(1.0,1.0); +	vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0); +	vec4 pos = inv_proj * ndc; +	pos /= pos.w; +	pos.w = 1.0; +	return pos; +} + +float pcfShadow(sampler2DShadow shadowMap, vec4 stc, float scl, vec2 pos_screen) +{ +	stc.xyz /= stc.w; +	stc.z += shadow_bias; + +	stc.x = floor(stc.x*shadow_res.x + fract(pos_screen.y*0.666666666))/shadow_res.x; // add some jitter to X sample pos according to Y to disguise the snapping going on here +	float cs = shadow2D(shadowMap, stc.xyz).x; + +	float shadow = cs; + +	shadow += shadow2D(shadowMap, stc.xyz+vec3(2.0/shadow_res.x, 1.5/shadow_res.y, 0.0)).x; +	shadow += shadow2D(shadowMap, stc.xyz+vec3(1.0/shadow_res.x, -1.5/shadow_res.y, 0.0)).x; +	shadow += shadow2D(shadowMap, stc.xyz+vec3(-2.0/shadow_res.x, 1.5/shadow_res.y, 0.0)).x; +	shadow += shadow2D(shadowMap, stc.xyz+vec3(-1.0/shadow_res.x, -1.5/shadow_res.y, 0.0)).x; + +			 +    return shadow*0.2; +} + +float pcfSpotShadow(sampler2DShadow shadowMap, vec4 stc, float scl, vec2 pos_screen) +{ +	stc.xyz /= stc.w; +	stc.z += spot_shadow_bias*scl; +	stc.x = floor(proj_shadow_res.x * stc.x + fract(pos_screen.y*0.666666666)) / proj_shadow_res.x; // snap + +	float cs = shadow2D(shadowMap, stc.xyz).x; +	float shadow = cs; + +	vec2 off = 1.0/proj_shadow_res; +	off.y *= 1.5; +	 +	shadow += shadow2D(shadowMap, stc.xyz+vec3(off.x*2.0, off.y, 0.0)).x; +	shadow += shadow2D(shadowMap, stc.xyz+vec3(off.x, -off.y, 0.0)).x; +	shadow += shadow2D(shadowMap, stc.xyz+vec3(-off.x, off.y, 0.0)).x; +	shadow += shadow2D(shadowMap, stc.xyz+vec3(-off.x*2.0, -off.y, 0.0)).x; + +        return shadow*0.2; +} + +void main()  +{ +	vec2 pos_screen = vary_fragcoord.xy; +	 +	//try doing an unproject here +	 +	vec4 pos = getPosition(pos_screen); +	 +	vec3 norm = texture2DRect(normalMap, pos_screen).xyz; +	norm = decode_normal(norm.xy); // unpack norm +		 +	/*if (pos.z == 0.0) // do nothing for sky *FIX: REMOVE THIS IF/WHEN THE POSITION MAP IS BEING USED AS A STENCIL +	{ +		frag_color = vec4(0.0); // doesn't matter +		return; +	}*/ +	 +	float shadow = 0.0; +	float dp_directional_light = max(0.0, dot(norm, sun_dir.xyz)); +	 +	vec3 shadow_pos = pos.xyz; +	vec3 offset = sun_dir.xyz * (1.0-dp_directional_light); +	 +	vec4 spos = vec4(shadow_pos+offset*shadow_offset, 1.0); +	 +	if (spos.z > -shadow_clip.w) +	{	 +		if (dp_directional_light == 0.0) +		{ +			// if we know this point is facing away from the sun then we know it's in shadow without having to do a squirrelly shadow-map lookup +			shadow = 0.0; +		} +		else +		{ +			vec4 lpos; +			 +			vec4 near_split = shadow_clip*-0.75; +			vec4 far_split = shadow_clip*-1.25; +			vec4 transition_domain = near_split-far_split; +			float weight = 0.0; + +			if (spos.z < near_split.z) +			{ +				lpos = shadow_matrix[3]*spos; +				 +				float w = 1.0; +				w -= max(spos.z-far_split.z, 0.0)/transition_domain.z; +				shadow += pcfShadow(shadowMap3, lpos, 0.25, pos_screen)*w; +				weight += w; +				shadow += max((pos.z+shadow_clip.z)/(shadow_clip.z-shadow_clip.w)*2.0-1.0, 0.0); +			} + +			if (spos.z < near_split.y && spos.z > far_split.z) +			{ +				lpos = shadow_matrix[2]*spos; +				 +				float w = 1.0; +				w -= max(spos.z-far_split.y, 0.0)/transition_domain.y; +				w -= max(near_split.z-spos.z, 0.0)/transition_domain.z; +				shadow += pcfShadow(shadowMap2, lpos, 0.5, pos_screen)*w; +				weight += w; +			} + +			if (spos.z < near_split.x && spos.z > far_split.y) +			{ +				lpos = shadow_matrix[1]*spos; + +				float w = 1.0; +				w -= max(spos.z-far_split.x, 0.0)/transition_domain.x; +				w -= max(near_split.y-spos.z, 0.0)/transition_domain.y; +				shadow += pcfShadow(shadowMap1, lpos, 0.75, pos_screen)*w; +				weight += w; +			} + +			if (spos.z > far_split.x) +			{ +				lpos = shadow_matrix[0]*spos; +				 +				float w = 1.0; +				w -= max(near_split.x-spos.z, 0.0)/transition_domain.x; +				 +				shadow += pcfShadow(shadowMap0, lpos, 1.0, pos_screen)*w; +				weight += w; +			} +		 + +			shadow /= weight; + +			// take the most-shadowed value out of these two: +			//  * the blurred sun shadow in the light (shadow) map +			//  * an unblurred dot product between the sun and this norm +			// the goal is to err on the side of most-shadow to fill-in shadow holes and reduce artifacting +			shadow = min(shadow, dp_directional_light); +			 +			//lpos.xy /= lpos.w*32.0; +			//if (fract(lpos.x) < 0.1 || fract(lpos.y) < 0.1) +			//{ +			//	shadow = 0.0; +			//} +			 +		} +	} +	else +	{ +		// more distant than the shadow map covers +		shadow = 1.0; +	} +	 +	frag_color[0] = shadow; +	frag_color[1] = 1.0; +	 +	spos = vec4(shadow_pos+norm*spot_shadow_offset, 1.0); +	 +	//spotlight shadow 1 +	vec4 lpos = shadow_matrix[4]*spos; +	frag_color[2] = pcfSpotShadow(shadowMap4, lpos, 0.8, pos_screen);  +	 +	//spotlight shadow 2 +	lpos = shadow_matrix[5]*spos; +	frag_color[3] = pcfSpotShadow(shadowMap5, lpos, 0.8, pos_screen);  + +	//frag_color.rgb = pos.xyz; +	//frag_color.b = shadow; +} diff --git a/indra/newview/app_settings/shaders/class3/deferred/sunLightSSAOF.glsl b/indra/newview/app_settings/shaders/class3/deferred/sunLightSSAOF.glsl new file mode 100644 index 0000000000..58f3f2f91e --- /dev/null +++ b/indra/newview/app_settings/shaders/class3/deferred/sunLightSSAOF.glsl @@ -0,0 +1,308 @@ +/**  + * @file sunLightSSAOF.glsl + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, Linden Research, Inc. + *  + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + *  + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + *  + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + *  + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */ +  +#extension GL_ARB_texture_rectangle : enable + +/*[EXTRA_CODE_HERE]*/ + +#ifdef DEFINE_GL_FRAGCOLOR +out vec4 frag_color; +#else +#define frag_color gl_FragColor +#endif + +//class 2 -- shadows and SSAO + +uniform sampler2DRect depthMap; +uniform sampler2DRect normalMap; +uniform sampler2DShadow shadowMap0; +uniform sampler2DShadow shadowMap1; +uniform sampler2DShadow shadowMap2; +uniform sampler2DShadow shadowMap3; +uniform sampler2DShadow shadowMap4; +uniform sampler2DShadow shadowMap5; +uniform sampler2D noiseMap; + + +// Inputs +uniform mat4 shadow_matrix[6]; +uniform vec4 shadow_clip; +uniform float ssao_radius; +uniform float ssao_max_radius; +uniform float ssao_factor; +uniform float ssao_factor_inv; + +VARYING vec2 vary_fragcoord; + +uniform mat4 inv_proj; +uniform vec2 screen_res; +uniform vec2 proj_shadow_res; +uniform vec3 sun_dir; + +uniform vec2 shadow_res; + +uniform float shadow_bias; +uniform float shadow_offset; + +uniform float spot_shadow_bias; +uniform float spot_shadow_offset; + +vec3 decode_normal (vec2 enc); + +vec4 getPosition(vec2 pos_screen) +{ +	float depth = texture2DRect(depthMap, pos_screen.xy).r; +	vec2 sc = pos_screen.xy*2.0; +	sc /= screen_res; +	sc -= vec2(1.0,1.0); +	vec4 ndc = vec4(sc.x, sc.y, 2.0*depth-1.0, 1.0); +	vec4 pos = inv_proj * ndc; +	pos /= pos.w; +	pos.w = 1.0; +	return pos; +} + +vec2 getKern(int i) +{ +	vec2 kern[8]; +	// exponentially (^2) distant occlusion samples spread around origin +	kern[0] = vec2(-1.0, 0.0) * 0.125*0.125; +	kern[1] = vec2(1.0, 0.0) * 0.250*0.250; +	kern[2] = vec2(0.0, 1.0) * 0.375*0.375; +	kern[3] = vec2(0.0, -1.0) * 0.500*0.500; +	kern[4] = vec2(0.7071, 0.7071) * 0.625*0.625; +	kern[5] = vec2(-0.7071, -0.7071) * 0.750*0.750; +	kern[6] = vec2(-0.7071, 0.7071) * 0.875*0.875; +	kern[7] = vec2(0.7071, -0.7071) * 1.000*1.000; +        +	return kern[i]; +} + +//calculate decreases in ambient lighting when crowded out (SSAO) +float calcAmbientOcclusion(vec4 pos, vec3 norm) +{ +	float ret = 1.0; + +	vec2 pos_screen = vary_fragcoord.xy; +	vec3 pos_world = pos.xyz; +	vec2 noise_reflect = texture2D(noiseMap, vary_fragcoord.xy/128.0).xy; +		 +	float angle_hidden = 0.0; +	float points = 0; +		 +	float scale = min(ssao_radius / -pos_world.z, ssao_max_radius); +	 +	// it was found that keeping # of samples a constant was the fastest, probably due to compiler optimizations (unrolling?) +	for (int i = 0; i < 8; i++) +	{ +		vec2 samppos_screen = pos_screen + scale * reflect(getKern(i), noise_reflect); +		vec3 samppos_world = getPosition(samppos_screen).xyz;  +		 +		vec3 diff = pos_world - samppos_world; +		float dist2 = dot(diff, diff); +			 +		// assume each sample corresponds to an occluding sphere with constant radius, constant x-sectional area +		// --> solid angle shrinking by the square of distance +		//radius is somewhat arbitrary, can approx with just some constant k * 1 / dist^2 +		//(k should vary inversely with # of samples, but this is taken care of later) +		 +		float funky_val = (dot((samppos_world - 0.05*norm - pos_world), norm) > 0.0) ? 1.0 : 0.0; +		angle_hidden = angle_hidden + funky_val * min(1.0/dist2, ssao_factor_inv); +			 +		// 'blocked' samples (significantly closer to camera relative to pos_world) are "no data", not "no occlusion"  +		float diffz_val = (diff.z > -1.0) ? 1.0 : 0.0; +		points = points + diffz_val; +	} +		 +	angle_hidden = min(ssao_factor*angle_hidden/points, 1.0); +	 +	float points_val = (points > 0.0) ? 1.0 : 0.0; +	ret = (1.0 - (points_val * angle_hidden)); + +	ret = max(ret, 0.0); +	return min(ret, 1.0); +} + +float pcfShadow(sampler2DShadow shadowMap, vec4 stc, float scl, vec2 pos_screen) +{ +	stc.xyz /= stc.w; +	stc.z += shadow_bias; + +	stc.x = floor(stc.x*shadow_res.x + fract(pos_screen.y*0.666666666))/shadow_res.x; +	float cs = shadow2D(shadowMap, stc.xyz).x; +	 +	float shadow = cs; +	 +	shadow += shadow2D(shadowMap, stc.xyz+vec3(2.0/shadow_res.x, 1.5/shadow_res.y, 0.0)).x; +    shadow += shadow2D(shadowMap, stc.xyz+vec3(1.0/shadow_res.x, -1.5/shadow_res.y, 0.0)).x; +    shadow += shadow2D(shadowMap, stc.xyz+vec3(-1.0/shadow_res.x, 1.5/shadow_res.y, 0.0)).x; +    shadow += shadow2D(shadowMap, stc.xyz+vec3(-2.0/shadow_res.x, -1.5/shadow_res.y, 0.0)).x; +	          +        return shadow*0.2; +} + +float pcfSpotShadow(sampler2DShadow shadowMap, vec4 stc, float scl, vec2 pos_screen) +{ +	stc.xyz /= stc.w; +	stc.z += spot_shadow_bias*scl; +	stc.x = floor(proj_shadow_res.x * stc.x + fract(pos_screen.y*0.666666666)) / proj_shadow_res.x; // snap +		 +	float cs = shadow2D(shadowMap, stc.xyz).x; +	float shadow = cs; + +	vec2 off = 1.0/proj_shadow_res; +	off.y *= 1.5; +	 +	shadow += shadow2D(shadowMap, stc.xyz+vec3(off.x*2.0, off.y, 0.0)).x; +	shadow += shadow2D(shadowMap, stc.xyz+vec3(off.x, -off.y, 0.0)).x; +	shadow += shadow2D(shadowMap, stc.xyz+vec3(-off.x, off.y, 0.0)).x; +	shadow += shadow2D(shadowMap, stc.xyz+vec3(-off.x*2.0, -off.y, 0.0)).x; + +        return shadow*0.2; +} + +void main()  +{ +	vec2 pos_screen = vary_fragcoord.xy; +	 +	//try doing an unproject here +	 +	vec4 pos = getPosition(pos_screen); +	 +	vec3 norm = texture2DRect(normalMap, pos_screen).xyz; +	norm = decode_normal(norm.xy); // unpack norm +		 +	/*if (pos.z == 0.0) // do nothing for sky *FIX: REMOVE THIS IF/WHEN THE POSITION MAP IS BEING USED AS A STENCIL +	{ +		frag_color = vec4(0.0); // doesn't matter +		return; +	}*/ +	 +	float shadow = 0.0; +	float dp_directional_light = max(0.0, dot(norm, sun_dir.xyz)); +	 +	vec3 shadow_pos = pos.xyz; +	vec3 offset = sun_dir.xyz * (1.0-dp_directional_light); +	 +	vec4 spos = vec4(shadow_pos+offset*shadow_offset, 1.0); +	 +	if (spos.z > -shadow_clip.w) +	{	 +		if (dp_directional_light == 0.0) +		{ +			// if we know this point is facing away from the sun then we know it's in shadow without having to do a squirrelly shadow-map lookup +			shadow = 0.0; +		} +		else +		{ +			vec4 lpos; + +			vec4 near_split = shadow_clip*-0.75; +			vec4 far_split = shadow_clip*-1.25; +			vec4 transition_domain = near_split-far_split; +			float weight = 0.0; + +			if (spos.z < near_split.z) +			{ +				lpos = shadow_matrix[3]*spos; +				 +				float w = 1.0; +				w -= max(spos.z-far_split.z, 0.0)/transition_domain.z; +				shadow += pcfShadow(shadowMap3, lpos, 0.25, pos_screen)*w; +				weight += w; +				shadow += max((pos.z+shadow_clip.z)/(shadow_clip.z-shadow_clip.w)*2.0-1.0, 0.0); +			} + +			if (spos.z < near_split.y && spos.z > far_split.z) +			{ +				lpos = shadow_matrix[2]*spos; +				 +				float w = 1.0; +				w -= max(spos.z-far_split.y, 0.0)/transition_domain.y; +				w -= max(near_split.z-spos.z, 0.0)/transition_domain.z; +				shadow += pcfShadow(shadowMap2, lpos, 0.5, pos_screen)*w; +				weight += w; +			} + +			if (spos.z < near_split.x && spos.z > far_split.y) +			{ +				lpos = shadow_matrix[1]*spos; +				 +				float w = 1.0; +				w -= max(spos.z-far_split.x, 0.0)/transition_domain.x; +				w -= max(near_split.y-spos.z, 0.0)/transition_domain.y; +				shadow += pcfShadow(shadowMap1, lpos, 0.75, pos_screen)*w; +				weight += w; +			} + +			if (spos.z > far_split.x) +			{ +				lpos = shadow_matrix[0]*spos; +								 +				float w = 1.0; +				w -= max(near_split.x-spos.z, 0.0)/transition_domain.x; +				 +				shadow += pcfShadow(shadowMap0, lpos, 1.0, pos_screen)*w; +				weight += w; +			} +		 + +			shadow /= weight; + +			// take the most-shadowed value out of these two: +			//  * the blurred sun shadow in the light (shadow) map +			//  * an unblurred dot product between the sun and this norm +			// the goal is to err on the side of most-shadow to fill-in shadow holes and reduce artifacting +			shadow = min(shadow, dp_directional_light); +			 +			//lpos.xy /= lpos.w*32.0; +			//if (fract(lpos.x) < 0.1 || fract(lpos.y) < 0.1) +			//{ +			//	shadow = 0.0; +			//} +			 +		} +	} +	else +	{ +		// more distant than the shadow map covers +		shadow = 1.0; +	} +	 +	frag_color[0] = shadow; +	frag_color[1] = calcAmbientOcclusion(pos, norm); +	 +	spos = vec4(shadow_pos+norm*spot_shadow_offset, 1.0); +	 +	//spotlight shadow 1 +	vec4 lpos = shadow_matrix[4]*spos; +	frag_color[2] = pcfSpotShadow(shadowMap4, lpos, 0.8, pos_screen); +	 +	//spotlight shadow 2 +	lpos = shadow_matrix[5]*spos; +	frag_color[3] = pcfSpotShadow(shadowMap5, lpos, 0.8, pos_screen); + +	//frag_color.rgb = pos.xyz; +	//frag_color.b = shadow; +} diff --git a/indra/newview/app_settings/shaders/class3/deferred/sunLightV.glsl b/indra/newview/app_settings/shaders/class3/deferred/sunLightV.glsl new file mode 100644 index 0000000000..bc5eb5181d --- /dev/null +++ b/indra/newview/app_settings/shaders/class3/deferred/sunLightV.glsl @@ -0,0 +1,41 @@ +/**  + * @file sunLightV.glsl + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2007, Linden Research, Inc. + *  + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + *  + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU + * Lesser General Public License for more details. + *  + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA + *  + * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA + * $/LicenseInfo$ + */ + +uniform mat4 modelview_projection_matrix; + +ATTRIBUTE vec3 position; + +VARYING vec2 vary_fragcoord; + +uniform vec2 screen_res; + +void main() +{ +	//transform vertex +	vec4 pos = modelview_projection_matrix * vec4(position.xyz, 1.0); +	gl_Position = pos;  +	 +	vary_fragcoord = (pos.xy * 0.5 + 0.5)*screen_res;	 +} diff --git a/indra/newview/llfloatereditextdaycycle.cpp b/indra/newview/llfloatereditextdaycycle.cpp index 8e29e4cf32..0b59239f8c 100644 --- a/indra/newview/llfloatereditextdaycycle.cpp +++ b/indra/newview/llfloatereditextdaycycle.cpp @@ -62,8 +62,6 @@  #include "llenvironment.h"  #include "lltrans.h" -#pragma optimize("", off) -  extern LLControlGroup gSavedSettings;  //========================================================================= diff --git a/indra/newview/llfloaterfixedenvironment.cpp b/indra/newview/llfloaterfixedenvironment.cpp index e5d6412218..09a05eb7e2 100644 --- a/indra/newview/llfloaterfixedenvironment.cpp +++ b/indra/newview/llfloaterfixedenvironment.cpp @@ -55,8 +55,6 @@  #include "llsettingsvo.h"  #include "llinventorymodel.h" -#pragma optimize("", off) -  extern LLControlGroup gSavedSettings;  namespace | 
