diff options
Diffstat (limited to 'indra/newview/app_settings/shaders')
67 files changed, 3454 insertions, 2090 deletions
| diff --git a/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl b/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl index 07b0f2a98a..9670b39fdb 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/alphaF.glsl @@ -84,257 +84,156 @@ uniform vec3 light_diffuse[8];  vec4 applyWaterFogView(vec3 pos, vec4 color);  #endif -vec3 srgb_to_linear(vec3 cs); -vec3 linear_to_srgb(vec3 cl);  vec2 encode_normal (vec3 n);  vec3 decode_normal (vec2 enc); -  vec3 scaleSoftClip(vec3 l);  vec3 atmosFragAmbient(vec3 light, vec3 sunlit);  vec3 atmosFragLighting(vec3 light, vec3 additive, vec3 atten);  vec3 atmosFragAffectDirectionalLight(float light, vec3 sunlit);  void calcFragAtmospherics(vec3 inPositionEye, float ambFactor, out vec3 sunlit, out vec3 amblit, out vec3 atten, out vec3 additive); -vec3 calcPointLightOrSpotLight(vec3 light_col, vec3 diffuse, vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight) -{ -	//get light vector -	vec3 lv = lp.xyz-v; -	 -	//get distance -	float d = length(lv); -	 -	float da = 1.0; - -	vec3 col = vec3(0); - -	if (d > 0.0 && la > 0.0 && fa > 0.0) -	{ -		//normalize light vector -		lv = normalize(lv); -	 -		//distance attenuation -		float dist = d/la; -		float dist_atten = clamp(1.0-(dist-1.0*(1.0-fa))/fa, 0.0, 1.0); -		dist_atten *= dist_atten; -		dist_atten *= 2.0; - -		// spotlight coefficient. -		float spot = max(dot(-ln, lv), is_pointlight); -		da *= spot*spot; // GL_SPOT_EXPONENT=2 - -		//angular attenuation -		da *= max(dot(n, lv), 0.0);		 - -		float lit = max(da * dist_atten,0.0); - -		col = light_col * lit * diffuse; - -		// no spec for alpha shader... -	} - -	return max(col, vec3(0.0,0.0,0.0)); -} +float sampleDirectionalShadow(vec3 pos, vec3 norm, vec2 pos_screen); -#if HAS_SHADOW -float pcfShadow(sampler2DShadow shadowMap, vec4 stc) +vec3 calcPointLightOrSpotLight(vec3 light_col, vec3 diffuse, vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight)  { -	stc.xyz /= stc.w; -	stc.z += shadow_bias; -		 -	stc.x = floor(stc.x*shadow_res.x + fract(stc.y*shadow_res.y*12345))/shadow_res.x; // add some chaotic 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(-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; +    //get light vector +    vec3 lv = lp.xyz-v; +     +    //get distance +    float d = length(lv); +     +    float da = 1.0; + +    vec3 col = vec3(0); + +    if (d > 0.0 && la > 0.0 && fa > 0.0) +    { +        //normalize light vector +        lv = normalize(lv); +     +        //distance attenuation +        float dist = d/la; +        float dist_atten = clamp(1.0-(dist-1.0*(1.0-fa))/fa, 0.0, 1.0); +        dist_atten *= dist_atten; +        dist_atten *= 2.0; + +        // spotlight coefficient. +        float spot = max(dot(-ln, lv), is_pointlight); +        da *= spot*spot; // GL_SPOT_EXPONENT=2 + +        //angular attenuation +        da *= max(dot(n, lv), 0.0);      + +        float lit = max(da * dist_atten,0.0); + +        col = light_col * lit * diffuse; + +        // no spec for alpha shader... +    } + +    return max(col, vec3(0.0,0.0,0.0));  } -#endif -  void main()   { -	vec2 frag = vary_fragcoord.xy/vary_fragcoord.z*0.5+0.5; -	frag *= screen_res; -	 -	vec4 pos = vec4(vary_position, 1.0); -	 -	float shadow = 1.0; +    vec2 frag = vary_fragcoord.xy/vary_fragcoord.z*0.5+0.5; +    frag *= screen_res; +     +    vec4 pos = vec4(vary_position, 1.0); +    vec3 norm = vary_norm; -#if HAS_SHADOW -	vec4 spos = pos; -		 -	if (spos.z > -shadow_clip.w) -	{	 -		shadow = 0.0; - -		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)*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)*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)*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)*w; -			weight += w; -		} -		 - -		shadow /= weight; -	} -	else -	{ -		shadow = 1.0; -	} -#endif +    float shadow = sampleDirectionalShadow(pos.xyz, norm.xyz, frag);  #ifdef USE_INDEXED_TEX -	vec4 diff = diffuseLookup(vary_texcoord0.xy); +    vec4 diff = diffuseLookup(vary_texcoord0.xy);  #else -	vec4 diff = texture2D(diffuseMap,vary_texcoord0.xy); +    vec4 diff = texture2D(diffuseMap,vary_texcoord0.xy);  #endif  #ifdef FOR_IMPOSTOR -	vec4 color; -	color.rgb = diff.rgb; -	color.a = 1.0; +    vec4 color; +    color.rgb = diff.rgb; +    color.a = 1.0;  #ifdef USE_VERTEX_COLOR -	float final_alpha = diff.a * vertex_color.a; -	diff.rgb *= vertex_color.rgb; +    float final_alpha = diff.a * vertex_color.a; +    diff.rgb *= vertex_color.rgb;  #else -	float final_alpha = diff.a; +    float final_alpha = diff.a;  #endif -	 -	// Insure we don't pollute depth with invis pixels in impostor rendering -	// -	if (final_alpha < 0.01) -	{ -		discard; -	} +     +    // Insure we don't pollute depth with invis pixels in impostor rendering +    // +    if (final_alpha < 0.01) +    { +        discard; +    }  #else -	 +      #ifdef USE_VERTEX_COLOR -	float final_alpha = diff.a * vertex_color.a; -	diff.rgb *= vertex_color.rgb; +    float final_alpha = diff.a * vertex_color.a; +    diff.rgb *= vertex_color.rgb;  #else -	float final_alpha = diff.a; +    float final_alpha = diff.a;  #endif +    vec3 sunlit; +    vec3 amblit; +    vec3 additive; +    vec3 atten; +    calcFragAtmospherics(pos.xyz, 1.0, sunlit, amblit, additive, atten); -	vec4 gamma_diff = diff;	 -	diff.rgb = srgb_to_linear(diff.rgb); - -	vec3 norm = vary_norm;  - -        vec3 sunlit; -        vec3 amblit; -        vec3 additive; -        vec3 atten; +    vec2 abnormal   = encode_normal(norm.xyz); +         norm.xyz   = decode_normal(abnormal.xy); -	calcFragAtmospherics(pos.xyz, 1.0, sunlit, amblit, additive, atten); - -	vec2 abnormal	= encode_normal(norm.xyz); -		 norm.xyz   = decode_normal(abnormal.xy); - -	float sun_da  = dot(norm.xyz, sun_dir.xyz); -	float moon_da = dot(norm.xyz, moon_dir.xyz); +    float sun_da  = dot(norm.xyz, sun_dir.xyz); +    float moon_da = dot(norm.xyz, moon_dir.xyz);      float final_da = max(sun_da, moon_da);            final_da = min(final_da, shadow);            final_da = clamp(final_da, 0.0f, 1.0f); -	  final_da = pow(final_da, 1.0/1.3); +      final_da = pow(final_da, display_gamma); -	vec4 color = vec4(0,0,0,0); +    vec4 color = vec4(0,0,0,0); -	color.rgb = atmosFragAmbient(color.rgb, amblit); -	color.a   = final_alpha; +    color.rgb = atmosFragAmbient(color.rgb, amblit); +    color.a   = final_alpha; -	float ambient = abs(final_da); -	ambient *= 0.5; -	ambient *= ambient; -	ambient = (1.0-ambient); +    float ambient = abs(final_da); +    ambient *= 0.5; +    ambient *= ambient; +    ambient = (1.0-ambient); -	color.rgb *= ambient; -	color.rgb += atmosFragAffectDirectionalLight(final_da, sunlit); -	color.rgb *= gamma_diff.rgb; +    color.rgb *= ambient; +    color.rgb += (final_da * sunlit); +    color.rgb *= diff.rgb; -	//color.rgb = mix(diff.rgb, color.rgb, final_alpha); -	 -	color.rgb = atmosFragLighting(color.rgb, additive, atten); -	color.rgb = scaleSoftClip(color.rgb); +    //color.rgb = mix(diff.rgb, color.rgb, final_alpha); +     +    color.rgb = atmosFragLighting(color.rgb, additive, atten); +    color.rgb = scaleSoftClip(color.rgb); -	vec4 light = vec4(0,0,0,0); +    vec4 light = vec4(0,0,0,0); -	color.rgb = srgb_to_linear(color.rgb); -	     #define LIGHT_LOOP(i) light.rgb += calcPointLightOrSpotLight(light_diffuse[i].rgb, diff.rgb, pos.xyz, norm, light_position[i], light_direction[i].xyz, light_attenuation[i].x, light_attenuation[i].y, light_attenuation[i].z); -	LIGHT_LOOP(1) -	LIGHT_LOOP(2) -	LIGHT_LOOP(3) -	LIGHT_LOOP(4) -	LIGHT_LOOP(5) -	LIGHT_LOOP(6) -	LIGHT_LOOP(7) - -	// keep it linear -	// -	color.rgb += light.rgb; +    LIGHT_LOOP(1) +    LIGHT_LOOP(2) +    LIGHT_LOOP(3) +    LIGHT_LOOP(4) +    LIGHT_LOOP(5) +    LIGHT_LOOP(6) +    LIGHT_LOOP(7) -	// straight to display gamma, we're post-deferred -	// -	color.rgb = linear_to_srgb(color.rgb); +    // keep it linear +    // +    color.rgb += light.rgb;  #ifdef WATER_FOG -	color = applyWaterFogView(pos.xyz, color); +    color = applyWaterFogView(pos.xyz, color);  #endif  #endif -	frag_color = color; +    frag_color = color;  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/aoUtil.glsl b/indra/newview/app_settings/shaders/class1/deferred/aoUtil.glsl new file mode 100644 index 0000000000..3bb59dd7f9 --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/deferred/aoUtil.glsl @@ -0,0 +1,93 @@ +/**  + * @file class1/deferred/aoUtil.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 sampler2D       noiseMap; + +uniform float ssao_radius; +uniform float ssao_max_radius; +uniform float ssao_factor; +uniform float ssao_factor_inv; + +vec4 getPosition(vec2 pos_screen); + +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, vec2 pos_screen) +{ +    float ret = 1.0; +    vec3 pos_world = pos.xyz; +    vec2 noise_reflect = texture2D(noiseMap, pos_screen.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); +} + diff --git a/indra/newview/app_settings/shaders/class1/deferred/blurLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/blurLightF.glsl index b56abb66d1..812f375f42 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/blurLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/blurLightF.glsl @@ -33,7 +33,6 @@ out vec4 frag_color;  #define frag_color gl_FragColor  #endif -uniform sampler2DRect depthMap;  uniform sampler2DRect normalMap;  uniform sampler2DRect lightMap; @@ -45,85 +44,69 @@ uniform float kern_scale;  VARYING vec2 vary_fragcoord; -uniform mat4 inv_proj; -uniform vec2 screen_res; - -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; -} - +vec4 getPosition(vec2 pos_screen); +vec3 getNorm(vec2 pos_screen);  vec3 decode_normal (vec2 enc);  void main()   {      vec2 tc = vary_fragcoord.xy; -	vec3 norm = texture2DRect(normalMap, tc).xyz; -	norm = decode_normal(norm.xy); // unpack norm - -	vec3 pos = getPosition(tc).xyz; -	vec4 ccol = texture2DRect(lightMap, tc).rgba; -	 -	vec2 dlt = kern_scale * delta / (1.0+norm.xy*norm.xy); -	dlt /= max(-pos.z*dist_factor, 1.0); -	 -	vec2 defined_weight = kern[0].xy; // special case the first (centre) sample's weight in the blur; we have to sample it anyway so we get it for 'free' -	vec4 col = defined_weight.xyxx * ccol; - -	// relax tolerance according to distance to avoid speckling artifacts, as angles and distances are a lot more abrupt within a small screen area at larger distances -	float pointplanedist_tolerance_pow2 = pos.z*pos.z*0.00005; - -	// perturb sampling origin slightly in screen-space to hide edge-ghosting artifacts where smoothing radius is quite large -	float tc_mod = 0.5*(tc.x + tc.y); // mod(tc.x+tc.y,2) -	tc_mod -= floor(tc_mod); -	tc_mod *= 2.0; -	tc += ( (tc_mod - 0.5) * kern[1].z * dlt * 0.5 ); - -	for (int i = 1; i < 4; i++) -	{ -		vec2 samptc = tc + kern[i].z*dlt; -	    vec3 samppos = getPosition(samptc).xyz;  - -		float d = dot(norm.xyz, samppos.xyz-pos.xyz);// dist from plane -		 -		if (d*d <= pointplanedist_tolerance_pow2) -		{ -			col += texture2DRect(lightMap, samptc)*kern[i].xyxx; -			defined_weight += kern[i].xy; -		} -	} - -	for (int i = 1; i < 4; i++) -	{ -		vec2 samptc = tc - kern[i].z*dlt; -	    vec3 samppos = getPosition(samptc).xyz;  - -		float d = dot(norm.xyz, samppos.xyz-pos.xyz);// dist from plane -		 -		if (d*d <= pointplanedist_tolerance_pow2) -		{ -			col += texture2DRect(lightMap, samptc)*kern[i].xyxx; -			defined_weight += kern[i].xy; -		} -	} - -	col /= defined_weight.xyxx; -	col.y *= col.y; -	 -	frag_color = col; +    vec3 norm = getNorm(tc); +    vec3 pos = getPosition(tc).xyz; +    vec4 ccol = texture2DRect(lightMap, tc).rgba; +     +    vec2 dlt = kern_scale * delta / (1.0+norm.xy*norm.xy); +    dlt /= max(-pos.z*dist_factor, 1.0); +     +    vec2 defined_weight = kern[0].xy; // special case the first (centre) sample's weight in the blur; we have to sample it anyway so we get it for 'free' +    vec4 col = defined_weight.xyxx * ccol; + +    // relax tolerance according to distance to avoid speckling artifacts, as angles and distances are a lot more abrupt within a small screen area at larger distances +    float pointplanedist_tolerance_pow2 = pos.z*pos.z*0.00005; + +    // perturb sampling origin slightly in screen-space to hide edge-ghosting artifacts where smoothing radius is quite large +    float tc_mod = 0.5*(tc.x + tc.y); // mod(tc.x+tc.y,2) +    tc_mod -= floor(tc_mod); +    tc_mod *= 2.0; +    tc += ( (tc_mod - 0.5) * kern[1].z * dlt * 0.5 ); + +    for (int i = 1; i < 4; i++) +    { +        vec2 samptc = tc + kern[i].z*dlt; +        vec3 samppos = getPosition(samptc).xyz;  + +        float d = dot(norm.xyz, samppos.xyz-pos.xyz);// dist from plane +         +        if (d*d <= pointplanedist_tolerance_pow2) +        { +            col += texture2DRect(lightMap, samptc)*kern[i].xyxx; +            defined_weight += kern[i].xy; +        } +    } + +    for (int i = 1; i < 4; i++) +    { +        vec2 samptc = tc - kern[i].z*dlt; +        vec3 samppos = getPosition(samptc).xyz;  + +        float d = dot(norm.xyz, samppos.xyz-pos.xyz);// dist from plane +         +        if (d*d <= pointplanedist_tolerance_pow2) +        { +            col += texture2DRect(lightMap, samptc)*kern[i].xyxx; +            defined_weight += kern[i].xy; +        } +    } + +    col /= defined_weight.xyxx; +    col.y *= col.y; +     +    frag_color = col;  #ifdef IS_AMD_CARD -	// If it's AMD make sure the GLSL compiler sees the arrays referenced once by static index. Otherwise it seems to optimise the storage awawy which leads to unfun crashes and artifacts. -	vec3 dummy1 = kern[0]; -	vec3 dummy2 = kern[3]; +    // If it's AMD make sure the GLSL compiler sees the arrays referenced once by static index. Otherwise it seems to optimise the storage awawy which leads to unfun crashes and artifacts. +    vec3 dummy1 = kern[0]; +    vec3 dummy2 = kern[3];  #endif  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/cloudShadowF.glsl b/indra/newview/app_settings/shaders/class1/deferred/cloudShadowF.glsl new file mode 100644 index 0000000000..fa6926b007 --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/deferred/cloudShadowF.glsl @@ -0,0 +1,121 @@ +/**  + * @file class3/deferred/cloudsF.glsl + * + * $LicenseInfo:firstyear=2005&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2005, 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$ + */ +  +#ifdef DEFINE_GL_FRAGCOLOR +out vec4 frag_color; +#else +#define frag_color gl_FragColor +#endif + +uniform sampler2D diffuseMap; + +VARYING vec4 pos; +VARYING float target_pos_x; +VARYING float vary_CloudDensity; +VARYING vec2 vary_texcoord0; +VARYING vec2 vary_texcoord1; +VARYING vec2 vary_texcoord2; +VARYING vec2 vary_texcoord3; + +uniform sampler2D cloud_noise_texture; +uniform sampler2D cloud_noise_texture_next; +uniform float blend_factor; +uniform vec4 cloud_pos_density1; +uniform vec4 cloud_pos_density2; +uniform vec4 sunlight_color; +uniform vec4 cloud_color; +uniform float cloud_shadow; +uniform float cloud_scale; +uniform float cloud_variance; +uniform vec3 ambient; +uniform vec3 camPosLocal; +uniform vec3 sun_dir; +uniform float sun_size; +uniform float far_z; + +#if !DEPTH_CLAMP +VARYING vec4 post_pos; +#endif + +vec4 cloudNoise(vec2 uv) +{ +   vec4 a = texture2D(cloud_noise_texture, uv); +   vec4 b = texture2D(cloud_noise_texture_next, uv); +   vec4 cloud_noise_sample = mix(a, b, blend_factor); +   return normalize(cloud_noise_sample); +} + +void main() +{ +	// Set variables +	vec2 uv1 = vary_texcoord0.xy; +	vec2 uv2 = vary_texcoord1.xy; +	vec2 uv3 = vary_texcoord2.xy; +	float cloudDensity = 2.0 * (cloud_shadow - 0.25); + +	vec2 uv4 = vary_texcoord3.xy; + +    vec2 disturbance  = vec2(cloudNoise(uv1 / 8.0f).x, cloudNoise((uv3 + uv1) / 16.0f).x) * cloud_variance * (1.0f - cloud_scale * 0.25f); +    vec2 disturbance2 = vec2(cloudNoise((uv1 + uv3) / 4.0f).x, cloudNoise((uv4 + uv2) / 8.0f).x) * cloud_variance * (1.0f - cloud_scale * 0.25f); + +	// Offset texture coords +	uv1 += cloud_pos_density1.xy + (disturbance * 0.02);	//large texture, visible density +	uv2 += cloud_pos_density1.xy;	//large texture, self shadow +	uv3 += cloud_pos_density2.xy;	//small texture, visible density +	uv4 += cloud_pos_density2.xy;	//small texture, self shadow + +    float density_variance = min(1.0, (disturbance.x* 2.0 + disturbance.y* 2.0 + disturbance2.x + disturbance2.y)); + +    cloudDensity *= 1.0 - (density_variance * density_variance); + +	// Compute alpha1, the main cloud opacity +	float alpha1 = (cloudNoise(uv1).x - 0.5) + (cloudNoise(uv3).x - 0.5) * cloud_pos_density2.z; +	alpha1 = min(max(alpha1 + cloudDensity, 0.) * 10 * cloud_pos_density1.z, 1.); + +	// And smooth +	alpha1 = 1. - alpha1 * alpha1; +	alpha1 = 1. - alpha1 * alpha1;	 + +    if (alpha1 < 0.001f) +    { +        discard; +    } + +	// Compute alpha2, for self shadowing effect +	// (1 - alpha2) will later be used as percentage of incoming sunlight +	float alpha2 = (cloudNoise(uv2).x - 0.5); +	alpha2 = min(max(alpha2 + cloudDensity, 0.) * 2.5 * cloud_pos_density1.z, 1.); + +	// And smooth +	alpha2 = 1. - alpha2; +	alpha2 = 1. - alpha2 * alpha2;	 + +    frag_color = vec4(alpha1, alpha1, alpha1, 1); + +#if !DEPTH_CLAMP +	gl_FragDepth = max(post_pos.z/post_pos.w*0.5+0.5, 0.0); +#endif + +} diff --git a/indra/newview/app_settings/shaders/class1/deferred/cloudShadowV.glsl b/indra/newview/app_settings/shaders/class1/deferred/cloudShadowV.glsl new file mode 100644 index 0000000000..cb27b2c2c5 --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/deferred/cloudShadowV.glsl @@ -0,0 +1,63 @@ +/**  + * @file cloudShadowV.glsl + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, 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 texture_matrix0; +uniform mat4 modelview_projection_matrix; +uniform float shadow_target_width; + +ATTRIBUTE vec3 position; +ATTRIBUTE vec4 diffuse_color; +ATTRIBUTE vec2 texcoord0; + +#if !DEPTH_CLAMP +VARYING float pos_zd2; +#endif + +VARYING vec4 pos; +VARYING float target_pos_x; +VARYING vec2 vary_texcoord0; +VARYING vec4 vertex_color; + +void passTextureIndex(); + +void main() +{ +	//transform vertex +	vec4 pre_pos = vec4(position.xyz, 1.0); +	pos = modelview_projection_matrix * pre_pos; +	target_pos_x = 0.5 * (shadow_target_width - 1.0) * pos.x; + +#if !DEPTH_CLAMP +	pos_zd2 = pos.z * 0.5; +	gl_Position = vec4(pos.x, pos.y, pos.w*0.5, pos.w); +#else +	gl_Position = pos; +#endif +	 +	passTextureIndex(); + +	vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy; +	vertex_color = diffuse_color; +} diff --git a/indra/newview/app_settings/shaders/class1/deferred/cofF.glsl b/indra/newview/app_settings/shaders/class1/deferred/cofF.glsl index fef1c5a584..380d382020 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/cofF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/cofF.glsl @@ -50,14 +50,7 @@ uniform vec2 screen_res;  VARYING vec2 vary_fragcoord; -float getDepth(vec2 pos_screen) -{ -	float z = texture2DRect(depthMap, pos_screen.xy).r; -	z = z*2.0-1.0; -	vec4 ndc = vec4(0.0, 0.0, z, 1.0); -	vec4 p = inv_proj*ndc; -	return p.z/p.w; -} +float getDepth(vec2 pos_screen);  float calc_cof(float depth)  { diff --git a/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl b/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl index ec05dab57f..9d7a7f6556 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/deferredUtil.glsl @@ -25,29 +25,6 @@  uniform sampler2DRect   normalMap;  uniform sampler2DRect   depthMap; -uniform sampler2D       noiseMap; -uniform sampler2DShadow shadowMap0; -uniform sampler2DShadow shadowMap1; -uniform sampler2DShadow shadowMap2; -uniform sampler2DShadow shadowMap3; -uniform sampler2DShadow shadowMap4; -uniform sampler2DShadow shadowMap5; - -uniform float ssao_radius; -uniform float ssao_max_radius; -uniform float ssao_factor; -uniform float ssao_factor_inv; - -uniform vec3 sun_dir; -uniform vec3 moon_dir; -uniform vec2 shadow_res; -uniform vec2 proj_shadow_res; -uniform mat4 shadow_matrix[6]; -uniform vec4 shadow_clip; -uniform float shadow_bias; - -uniform float spot_shadow_bias; -uniform float spot_shadow_offset;  uniform mat4 inv_proj;  uniform vec2 screen_res; @@ -87,8 +64,6 @@ vec4 getPosition(vec2 pos_screen)      return pos;  } -#if USE_DEFERRED_SHADER_API -  vec4 getPositionWithDepth(vec2 pos_screen, float depth)  {      vec2 sc = getScreenCoordinate(pos_screen); @@ -98,200 +73,3 @@ vec4 getPositionWithDepth(vec2 pos_screen, float depth)      pos.w = 1.0;      return pos;  } - -float pcfShadow(sampler2DShadow shadowMap, vec4 stc, float bias_scale, vec2 pos_screen) -{ -    stc.xyz /= stc.w; -    stc.z += shadow_bias * bias_scale; -         -    stc.x = floor(stc.x*pos_screen.x + fract(stc.y*shadow_res.y*12345))/shadow_res.x; // add some chaotic 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(-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 bias_scale, vec2 pos_screen) -{ -    stc.xyz /= stc.w; -    stc.z += spot_shadow_bias * bias_scale; -    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; -} - -float sampleDirectionalShadow(vec3 pos, vec3 norm, vec2 pos_screen) -{ -    float dp_sun = max(0.0, dot(sun_dir.xyz, norm)); -    float dp_moon = max(0.0, dot(moon_dir.xyz, norm)); -    float dp_directional_light = max(dp_sun,dp_moon); -          dp_directional_light = clamp(dp_directional_light, 0.0, 1.0); - -        vec3 light_dir = (dp_moon > dp_sun) ? moon_dir : sun_dir; -    vec3 offset = light_dir * (1.0-dp_directional_light); -    vec3 shadow_pos = pos.xyz + (offset * shadow_bias); - -    float shadow = 0.0f; -    vec4 spos = vec4(shadow_pos,1.0); -    if (spos.z > -shadow_clip.w) -    {    -        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.5, 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.75, 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.88, 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; -    } -    return shadow; -} - -float sampleSpotShadow(vec3 pos, vec3 norm, int index, vec2 pos_screen) -{ -    float shadow = 0.0f; -    pos += norm * spot_shadow_offset; - -    vec4 spos = vec4(pos,1.0); -    if (spos.z > -shadow_clip.w) -    {    -        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; - -        { -            lpos = shadow_matrix[4 + index]*spos; -            float w = 1.0; -            w -= max(spos.z-far_split.z, 0.0)/transition_domain.z; -         -            shadow += pcfSpotShadow((index == 0) ? shadowMap4 : shadowMap5, lpos, 0.8, spos.xy)*w; -            weight += w; -            shadow += max((pos.z+shadow_clip.z)/(shadow_clip.z-shadow_clip.w)*2.0-1.0, 0.0); -        } - -        shadow /= weight; -    } -    return shadow; -} - -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, vec2 pos_screen) -{ -    float ret = 1.0; -    vec3 pos_world = pos.xyz; -    vec2 noise_reflect = texture2D(noiseMap, pos_screen.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); -} - -#endif - diff --git a/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl index 0e21e5925d..2db737a427 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/fullbrightF.glsl @@ -45,9 +45,6 @@ VARYING vec2 vary_texcoord0;  vec4 applyWaterFogView(vec3 pos, vec4 color);  #endif -vec3 srgb_to_linear(vec3 cs); -vec3 linear_to_srgb(vec3 cl); -  vec3 fullbrightAtmosTransportDeferred(vec3 light)  {  	return light; @@ -81,12 +78,9 @@ void main()  #endif  	color.rgb *= vertex_color.rgb; -	color.rgb = srgb_to_linear(color.rgb);  	color.rgb = fullbrightAtmosTransportDeferred(color.rgb);  	color.rgb = fullbrightScaleSoftClipDeferred(color.rgb); -	color.rgb = linear_to_srgb(color.rgb); -  #ifdef WATER_FOG  	vec3 pos = vary_position;  	vec4 fogged = applyWaterFogView(pos, vec4(color.rgb, final_alpha)); diff --git a/indra/newview/app_settings/shaders/class1/deferred/impostorF.glsl b/indra/newview/app_settings/shaders/class1/deferred/impostorF.glsl index 6ba16b169c..d29e8a9423 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/impostorF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/impostorF.glsl @@ -40,8 +40,6 @@ uniform sampler2D specularMap;  VARYING vec2 vary_texcoord0; -vec3 linear_to_srgb(vec3 cl); -  void main()   {  	vec4 col = texture2D(diffuseMap, vary_texcoord0.xy); @@ -54,8 +52,6 @@ void main()  	vec4 norm = texture2D(normalMap,   vary_texcoord0.xy);  	vec4 spec = texture2D(specularMap, vary_texcoord0.xy); -	col.rgb = linear_to_srgb(col.rgb); -  	frag_data[0] = vec4(col.rgb, 0.0);  	frag_data[1] = spec;  	frag_data[2] = vec4(norm.xy,0,0); diff --git a/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl b/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl index 7d5ae7c2e7..0f7c514e94 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl @@ -25,9 +25,9 @@  /*[EXTRA_CODE_HERE]*/ -#define DIFFUSE_ALPHA_MODE_IGNORE	0 -#define DIFFUSE_ALPHA_MODE_BLEND	1 -#define DIFFUSE_ALPHA_MODE_MASK		2 +#define DIFFUSE_ALPHA_MODE_IGNORE   0 +#define DIFFUSE_ALPHA_MODE_BLEND    1 +#define DIFFUSE_ALPHA_MODE_MASK     2  #define DIFFUSE_ALPHA_MODE_EMISSIVE 3  uniform float emissive_brightness; @@ -37,10 +37,6 @@ uniform float display_gamma;  vec4 applyWaterFogView(vec3 pos, vec4 color);  #endif -vec3 srgb_to_linear(vec3 cs); -vec3 linear_to_srgb(vec3 cl); - -vec3 atmosFragAmbient(vec3 l, vec3 ambient);  vec3 atmosFragLighting(vec3 l, vec3 additive, vec3 atten);  vec3 scaleSoftClipFrag(vec3 l); @@ -54,40 +50,10 @@ out vec4 frag_color;  #define frag_color gl_FragColor  #endif -#if HAS_SUN_SHADOW - -uniform sampler2DShadow shadowMap0; -uniform sampler2DShadow shadowMap1; -uniform sampler2DShadow shadowMap2; -uniform sampler2DShadow shadowMap3; - -uniform mat4 shadow_matrix[6]; -uniform vec4 shadow_clip; -uniform vec2 shadow_res; -uniform float shadow_bias; - -float pcfShadow(sampler2DShadow shadowMap, vec4 stc) -{ -	stc.xyz /= stc.w; -	stc.z += shadow_bias; -		 -	stc.x = floor(stc.x*shadow_res.x + fract(stc.y*shadow_res.y*12345))/shadow_res.x; // add some chaotic 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(-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; -} - -#endif +float sampleDirectionalShadow(vec3 pos, vec3 norm, vec2 pos_screen);  uniform samplerCube environmentMap; -uniform sampler2D	  lightFunc; +uniform sampler2D     lightFunc;  // Inputs  uniform vec4 morphFactor; @@ -113,83 +79,70 @@ uniform vec3 light_diffuse[8];  vec3 calcPointLightOrSpotLight(vec3 light_col, vec3 npos, vec3 diffuse, vec4 spec, vec3 v, vec3 n, vec4 lp, vec3 ln, float la, float fa, float is_pointlight, inout float glare)  { -	//get light vector -	vec3 lv = lp.xyz-v; -	 -	//get distance -	float d = length(lv); -	 -	float da = 1.0; - -	vec3 col = vec3(0,0,0); - -	if (d > 0.0 && la > 0.0 && fa > 0.0) -	{ -		//normalize light vector -		lv = normalize(lv); -	 -		//distance attenuation -		float dist = d/la; -		float dist_atten = clamp(1.0-(dist-1.0*(1.0-fa))/fa, 0.0, 1.0); -		dist_atten *= dist_atten; -		dist_atten *= 2.0; - -		// spotlight coefficient. -		float spot = max(dot(-ln, lv), is_pointlight); -		da *= spot*spot; // GL_SPOT_EXPONENT=2 - -		//angular attenuation -		da *= max(dot(n, lv), 0.0);		 -		 -		float lit = max(da * dist_atten, 0.0); - -		col = light_col*lit*diffuse; - -		if (spec.a > 0.0) -		{ -			//vec3 ref = dot(pos+lv, norm); -			vec3 h = normalize(lv+npos); -			float nh = dot(n, h); -			float nv = dot(n, 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); -				vec3 speccol = lit*scol*light_col.rgb*spec.rgb; -				col += speccol; - -				float cur_glare = max(speccol.r, speccol.g); -				cur_glare = max(cur_glare, speccol.b); -				glare = max(glare, speccol.r); -				glare += max(cur_glare, 0.0); -				//col += spec.rgb; -			} -		} -	} - -	return max(col, vec3(0.0,0.0,0.0));	 - -} +    //get light vector +    vec3 lv = lp.xyz-v; +     +    //get distance +    float d = length(lv); +     +    float da = 1.0; + +    vec3 col = vec3(0,0,0); + +    if (d > 0.0 && la > 0.0 && fa > 0.0) +    { +        //normalize light vector +        lv = normalize(lv); +     +        //distance attenuation +        float dist = d/la; +        float dist_atten = clamp(1.0-(dist-1.0*(1.0-fa))/fa, 0.0, 1.0); +        dist_atten *= dist_atten; +        dist_atten *= 2.0; + +        // spotlight coefficient. +        float spot = max(dot(-ln, lv), is_pointlight); +        da *= spot*spot; // GL_SPOT_EXPONENT=2 + +        //angular attenuation +        da *= max(dot(n, lv), 0.0);      +         +        float lit = max(da * dist_atten, 0.0); + +        col = light_col*lit*diffuse; + +        if (spec.a > 0.0) +        { +            //vec3 ref = dot(pos+lv, norm); +            vec3 h = normalize(lv+npos); +            float nh = dot(n, h); +            float nv = dot(n, 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); +                vec3 speccol = lit*scol*light_col.rgb*spec.rgb; +                col += speccol; + +                float cur_glare = max(speccol.r, speccol.g); +                cur_glare = max(cur_glare, speccol.b); +                glare = max(glare, speccol.r); +                glare += max(cur_glare, 0.0); +                //col += spec.rgb; +            } +        } +    } + +    return max(col, vec3(0.0,0.0,0.0));  -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;  } -  #else  #ifdef DEFINE_GL_FRAGCOLOR  out vec4 frag_data[3]; @@ -234,262 +187,188 @@ vec3 decode_normal (vec2 enc);  void main()   { -	vec4 diffcol = texture2D(diffuseMap, vary_texcoord0.xy); -	diffcol.rgb *= vertex_color.rgb; +    vec2 pos_screen = vary_texcoord0.xy; + +    vec4 diffcol = texture2D(diffuseMap, vary_texcoord0.xy); +    diffcol.rgb *= vertex_color.rgb;  #if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_MASK) -	if (diffcol.a < minimum_alpha) -	{ -		discard; -	} +    if (diffcol.a < minimum_alpha) +    { +        discard; +    }  #endif  #if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND) -	vec3 gamma_diff = diffcol.rgb; -	diffcol.rgb = srgb_to_linear(diffcol.rgb); +    vec3 gamma_diff = diffcol.rgb;  #endif  #if HAS_SPECULAR_MAP -	vec4 spec = texture2D(specularMap, vary_texcoord2.xy); -	spec.rgb *= specular_color.rgb; +    vec4 spec = texture2D(specularMap, vary_texcoord2.xy); +    spec.rgb *= specular_color.rgb;  #else -	vec4 spec = vec4(specular_color.rgb, 1.0); +    vec4 spec = vec4(specular_color.rgb, 1.0);  #endif  #if HAS_NORMAL_MAP -	vec4 norm = texture2D(bumpMap, vary_texcoord1.xy); +    vec4 norm = texture2D(bumpMap, vary_texcoord1.xy); -	norm.xyz = norm.xyz * 2 - 1; +    norm.xyz = norm.xyz * 2 - 1; -	vec3 tnorm = vec3(dot(norm.xyz,vary_mat0), -			  dot(norm.xyz,vary_mat1), -			  dot(norm.xyz,vary_mat2)); +    vec3 tnorm = vec3(dot(norm.xyz,vary_mat0), +              dot(norm.xyz,vary_mat1), +              dot(norm.xyz,vary_mat2));  #else -	vec4 norm = vec4(0,0,0,1.0); -	vec3 tnorm = vary_normal; +    vec4 norm = vec4(0,0,0,1.0); +    vec3 tnorm = vary_normal;  #endif      norm.xyz = tnorm;      norm.xyz = normalize(norm.xyz); -	vec2 abnormal	= encode_normal(norm.xyz); -		 norm.xyz   = decode_normal(abnormal.xy); +    vec2 abnormal   = encode_normal(norm.xyz); +         norm.xyz   = decode_normal(abnormal.xy); -	vec4 final_color = diffcol; -	 +    vec4 final_color = diffcol; +      #if (DIFFUSE_ALPHA_MODE != DIFFUSE_ALPHA_MODE_EMISSIVE) -	final_color.a = emissive_brightness; +    final_color.a = emissive_brightness;  #else -	final_color.a = max(final_color.a, emissive_brightness); +    final_color.a = max(final_color.a, emissive_brightness);  #endif -	vec4 final_specular = spec; +    vec4 final_specular = spec;  #if HAS_SPECULAR_MAP -	vec4 final_normal = vec4(encode_normal(normalize(tnorm)), env_intensity * spec.a, 0.0); -	final_specular.a = specular_color.a * norm.a; +    vec4 final_normal = vec4(encode_normal(normalize(tnorm)), env_intensity * spec.a, 0.0); +    final_specular.a = specular_color.a * norm.a;  #else -	vec4 final_normal = vec4(encode_normal(normalize(tnorm)), env_intensity, 0.0); -	final_specular.a = specular_color.a; +    vec4 final_normal = vec4(encode_normal(normalize(tnorm)), env_intensity, 0.0); +    final_specular.a = specular_color.a;  #endif -	 +      #if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND) -		//forward rendering, output just lit RGBA -	vec3 pos = vary_position; - -#if HAS_SUN_SHADOW -	float shadow = 0.0; -	 -	vec4 spos = vec4(pos,1.0); -		 -	if (spos.z > -shadow_clip.w) -	{	 -		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)*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)*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)*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)*w; -			weight += w; -		} -		 - -		shadow /= weight; -	} -	else -	{ -		shadow = 1.0; -	} -#else -	float shadow = 1.0; -#endif +        //forward rendering, output just lit RGBA +    vec3 pos = vary_position; + +    float shadow = sampleDirectionalShadow(pos.xyz, norm.xyz, pos_screen); -	spec = final_specular; -	vec4 diffuse = final_color; -	float envIntensity = final_normal.z; +    spec = final_specular; +    vec4 diffuse = final_color; +    float envIntensity = final_normal.z;      vec3 col = vec3(0.0f,0.0f,0.0f); -	float bloom = 0.0; +    float bloom = 0.0;          vec3 sunlit;          vec3 amblit;          vec3 additive;          vec3 atten; -	calcFragAtmospherics(pos.xyz, 1.0, sunlit, amblit, additive, atten); -	 -	vec3 refnormpersp = normalize(reflect(pos.xyz, norm.xyz)); +    calcFragAtmospherics(pos.xyz, 1.0, sunlit, amblit, additive, atten); +     +    vec3 refnormpersp = normalize(reflect(pos.xyz, norm.xyz)); -	float sun_da  = dot(norm.xyz, sun_dir.xyz); -	float moon_da = dot(norm.xyz, moon_dir.xyz); +    float sun_da  = dot(norm.xyz, sun_dir.xyz); +    float moon_da = dot(norm.xyz, moon_dir.xyz);      float final_da = max(sun_da,moon_da);            final_da = min(final_da, shadow);            //final_da = max(final_da, diffuse.a);            final_da = max(final_da, 0.0f); -		  final_da = min(final_da, 1.0f); -		  final_da = pow(final_da, 1.0/1.3); +          final_da = min(final_da, 1.0f); +          final_da = pow(final_da, display_gamma); -	col.rgb = atmosFragAmbient(col, amblit); -	 -	float ambient = min(abs(final_da), 1.0); -	ambient *= 0.5; -	ambient *= ambient; -	ambient = (1.0-ambient); +    col.rgb = (col * 0.5) + amblit; +     +    float ambient = min(abs(final_da), 1.0); +    ambient *= 0.5; +    ambient *= ambient; +    ambient = (1.0-ambient); -	col.rgb *= ambient; +    col.rgb *= ambient; -	col.rgb = col.rgb + (final_da * sunlit); +    col.rgb = col.rgb + (final_da * sunlit); -	col.rgb *= gamma_diff.rgb; -	 +    col.rgb *= gamma_diff.rgb; +     -	float glare = 0.0; +    float glare = 0.0; -	if (spec.a > 0.0) // specular reflection -	{ -		// the old infinite-sky shiny reflection -		// -				 +    if (spec.a > 0.0) // specular reflection +    { +        // the old infinite-sky shiny reflection +        // +                          float sa = dot(refnormpersp, sun_dir.xyz); -		vec3 dumbshiny = sunlit*shadow*(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; - -		glare = max(spec_contrib.r, spec_contrib.g); -		glare = max(glare, spec_contrib.b); - -		col += spec_contrib; -	} +        vec3 dumbshiny = sunlit*shadow*(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; +        glare = max(spec_contrib.r, spec_contrib.g); +        glare = max(glare, spec_contrib.b); -	col = mix(col.rgb, diffcol.rgb, diffuse.a); +        col += spec_contrib; +    } -	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);   +    col = mix(col.rgb, diffcol.rgb, diffuse.a); -		float cur_glare = max(refcol.r, refcol.g); -		cur_glare = max(cur_glare, refcol.b); -		cur_glare *= envIntensity*4.0; -		glare += cur_glare; -	} +    if (envIntensity > 0.0) +    { +        //add environmentmap +        vec3 env_vec = env_mat * refnormpersp; +         +        vec3 refcol = textureCube(environmentMap, env_vec).rgb; -	//col = mix(atmosLighting(col), fullbrightAtmosTransport(col), diffuse.a); -	//col = mix(scaleSoftClip(col), fullbrightScaleSoftClip(col),  diffuse.a); +        col = mix(col.rgb, refcol,  +            envIntensity);   -	col = atmosFragLighting(col, additive, atten); -	col = scaleSoftClipFrag(col); +        float cur_glare = max(refcol.r, refcol.g); +        cur_glare = max(cur_glare, refcol.b); +        cur_glare *= envIntensity*4.0; +        glare += cur_glare; +    } -	//convert to linear space before adding local lights -	col = srgb_to_linear(col); +    col = atmosFragLighting(col, additive, atten); -	vec3 npos = normalize(-pos.xyz); -			 -	vec3 light = vec3(0,0,0); +    vec3 npos = normalize(-pos.xyz); +             +    vec3 light = vec3(0,0,0);   #define LIGHT_LOOP(i) light.rgb += calcPointLightOrSpotLight(light_diffuse[i].rgb, npos, diffuse.rgb, final_specular, pos.xyz, norm.xyz, light_position[i], light_direction[i].xyz, light_attenuation[i].x, light_attenuation[i].y, light_attenuation[i].z, glare); -		LIGHT_LOOP(1) -		LIGHT_LOOP(2) -		LIGHT_LOOP(3) -		LIGHT_LOOP(4) -		LIGHT_LOOP(5) -		LIGHT_LOOP(6) -		LIGHT_LOOP(7) +        LIGHT_LOOP(1) +        LIGHT_LOOP(2) +        LIGHT_LOOP(3) +        LIGHT_LOOP(4) +        LIGHT_LOOP(5) +        LIGHT_LOOP(6) +        LIGHT_LOOP(7) -	col.rgb += light.rgb; +    col.rgb += light.rgb; -	glare = min(glare, 1.0); -	float al = max(diffcol.a,glare)*vertex_color.a; +    glare = min(glare, 1.0); +    float al = max(diffcol.a,glare)*vertex_color.a; -	//convert to gamma space for display on screen -	col.rgb = linear_to_srgb(col.rgb); +    col = scaleSoftClipFrag(col);  #ifdef WATER_FOG -	vec4 temp = applyWaterFogView(pos, vec4(col.rgb, al)); -	col.rgb = temp.rgb; -	al = temp.a; +    vec4 temp = applyWaterFogView(pos, vec4(col.rgb, al)); +    col.rgb = temp.rgb; +    al = temp.a;  #endif -	frag_color.rgb = col.rgb; -	frag_color.a   = al; +    frag_color.rgb = col.rgb; +    frag_color.a   = al;  #else -	frag_data[0] = final_color; -	frag_data[1] = final_specular; // XYZ = Specular color. W = Specular exponent. -	frag_data[2] = final_normal; // XY = Normal.  Z = Env. intensity. +    frag_data[0] = final_color; +    frag_data[1] = final_specular; // XYZ = Specular color. W = Specular exponent. +    frag_data[2] = final_normal; // XY = Normal.  Z = Env. intensity.  #endif  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl index d1ac19270d..e8eef9b94b 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/multiPointLightF.glsl @@ -59,18 +59,7 @@ uniform mat4 inv_proj;  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; -} +vec4 getPosition(vec2 pos_screen);  void main()   { diff --git a/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl index 1d75322b4c..7438fac8fc 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/multiSpotLightF.glsl @@ -73,13 +73,10 @@ 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 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)); @@ -99,7 +96,6 @@ vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod)  vec4 texture2DLodDiffuse(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)); @@ -117,7 +113,6 @@ vec4 texture2DLodDiffuse(sampler2D projectionMap, vec2 tc, float lod)  vec4 texture2DLodAmbient(sampler2D projectionMap, vec2 tc, float lod)  {  	vec4 ret = texture2DLod(projectionMap, tc, lod); -	ret.rgb = srgb_to_linear(ret.rgb);  	vec2 dist = tc-vec2(0.5); @@ -128,19 +123,7 @@ vec4 texture2DLodAmbient(sampler2D projectionMap, vec2 tc, float lod)  	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; -} +vec4 getPosition(vec2 pos_screen);  void main()   { diff --git a/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl index 13b803e03e..df48a66fab 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/pointLightF.glsl @@ -57,19 +57,7 @@ uniform mat4 inv_proj;  uniform vec4 viewport;  vec3 decode_normal (vec2 enc); - -vec4 getPosition(vec2 pos_screen) -{ -	float depth = texture2DRect(depthMap, pos_screen.xy).r; -	vec2 sc = (pos_screen.xy-viewport.xy)*2.0; -	sc /= viewport.zw; -	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);  void main()   { diff --git a/indra/newview/app_settings/shaders/class1/deferred/postgiF.glsl b/indra/newview/app_settings/shaders/class1/deferred/postgiF.glsl index e33254304b..cf994d3547 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/postgiF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/postgiF.glsl @@ -49,18 +49,7 @@ VARYING vec2 vary_fragcoord;  uniform mat4 inv_proj;  uniform vec2 screen_res; -vec4 getPosition(vec2 pos_screen) -{ -	float depth = texture2DRect(depthMap, pos_screen.xy).a; -	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);  void main()   { diff --git a/indra/newview/app_settings/shaders/class1/deferred/shadowUtil.glsl b/indra/newview/app_settings/shaders/class1/deferred/shadowUtil.glsl new file mode 100644 index 0000000000..f626609fc2 --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/deferred/shadowUtil.glsl @@ -0,0 +1,209 @@ +/**  + * @file class1/deferred/shadowUtil.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 sampler2DRect   normalMap; +uniform sampler2DRect   depthMap; +uniform sampler2D       noiseMap; +uniform sampler2DShadow shadowMap0; +uniform sampler2DShadow shadowMap1; +uniform sampler2DShadow shadowMap2; +uniform sampler2DShadow shadowMap3; +uniform sampler2DShadow shadowMap4; +uniform sampler2DShadow shadowMap5; + +uniform float ssao_radius; +uniform float ssao_max_radius; +uniform float ssao_factor; +uniform float ssao_factor_inv; + +uniform vec3 sun_dir; +uniform vec3 moon_dir; +uniform vec2 shadow_res; +uniform vec2 proj_shadow_res; +uniform mat4 shadow_matrix[6]; +uniform vec4 shadow_clip; +uniform float shadow_bias; + +uniform float spot_shadow_bias; +uniform float spot_shadow_offset; + +uniform mat4 inv_proj; +uniform vec2 screen_res; + +vec3 decode_normal(vec2 enc); + +float pcfShadowLegacy(sampler2DShadow shadowMap, vec4 stc) +{ +	stc.xyz /= stc.w; +	stc.z += shadow_bias; +		 +	stc.x = floor(stc.x*shadow_res.x + fract(stc.y*shadow_res.y*12345))/shadow_res.x; // add some chaotic 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(-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 pcfShadow(sampler2DShadow shadowMap, vec4 stc, float bias_scale, vec2 pos_screen) +{ +    stc.xyz /= stc.w; +    stc.z += shadow_bias * bias_scale; +  +    stc.x = floor(stc.x*pos_screen.x + fract(stc.y*pos_screen.y*0.666666666))/shadow_res.x; // add some chaotic 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(-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 bias_scale, vec2 pos_screen) +{ +    stc.xyz /= stc.w; +    stc.z += spot_shadow_bias * bias_scale; +    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; +} + +float sampleDirectionalShadow(vec3 pos, vec3 norm, vec2 pos_screen) +{ +    float dp_sun = max(0.0, dot(sun_dir.xyz, norm)); +    float dp_moon = max(0.0, dot(moon_dir.xyz, norm)); +    float dp_directional_light = max(dp_sun,dp_moon); +          dp_directional_light = clamp(dp_directional_light, 0.0, 1.0); + +    vec3 light_dir = (dp_moon > dp_sun) ? moon_dir : sun_dir; +    vec3 offset = light_dir * (1.0-dp_directional_light); +    vec3 shadow_pos = pos.xyz + (offset * shadow_bias); + +    float shadow = 0.0f; +    vec4 spos = vec4(shadow_pos,1.0); +    if (spos.z > -shadow_clip.w) +    {    +        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 += pcfShadowLegacy(shadowMap3, lpos)*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 += pcfShadowLegacy(shadowMap2, lpos)*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 += pcfShadowLegacy(shadowMap1, lpos)*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 += pcfShadowLegacy(shadowMap0, lpos)*w; +            weight += w; +        } + +        shadow /= weight; +    } +    return shadow; +} + +float sampleSpotShadow(vec3 pos, vec3 norm, int index, vec2 pos_screen) +{ +    float shadow = 0.0f; +    pos += norm * spot_shadow_offset; + +    vec4 spos = vec4(pos,1.0); +    if (spos.z > -shadow_clip.w) +    {    +        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; + +        { +            lpos = shadow_matrix[4 + index]*spos; +            float w = 1.0; +            w -= max(spos.z-far_split.z, 0.0)/transition_domain.z; +         +            shadow += pcfSpotShadow((index == 0) ? shadowMap4 : shadowMap5, lpos, 0.8, spos.xy)*w; +            weight += w; +            shadow += max((pos.z+shadow_clip.z)/(shadow_clip.z-shadow_clip.w)*2.0-1.0, 0.0); +        } + +        shadow /= weight; +    } +    return shadow; +} + diff --git a/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl index 41eb06126b..f0b038cc93 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl @@ -66,10 +66,7 @@ uniform vec2 screen_res;  vec4 applyWaterFogView(vec3 pos, vec4 color);  #endif -vec3 srgb_to_linear(vec3 cs); -vec3 linear_to_srgb(vec3 cl);  vec3 decode_normal (vec2 enc); -  vec3 atmosFragLighting(vec3 l, vec3 additive, vec3 atten);  vec3 fullbrightAtmosTransportFrag(vec3 l, vec3 additive, vec3 atten);  void calcFragAtmospherics(vec3 inPositionEye, float ambFactor, out vec3 sunlit, out vec3 amblit, out vec3 additive, out vec3 atten); @@ -77,46 +74,26 @@ void calcFragAtmospherics(vec3 inPositionEye, float ambFactor, out vec3 sunlit,  vec3 scaleSoftClip(vec3 l);  vec3 fullbrightScaleSoftClip(vec3 l); -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).a; -    return getPosition_d(pos_screen, depth); -} - +vec4 getPositionWithDepth(vec2 pos_screen, float depth);  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_sun  = dot(norm.xyz, normalize(sun_dir.xyz)); +	vec2 tc = vary_fragcoord.xy; +	float depth = texture2DRect(depthMap, tc.xy).r; +	vec4 pos = getPositionWithDepth(tc, depth); +	vec4 norm = texture2DRect(normalMap, tc); +	float envIntensity = norm.z; +	norm.xyz = decode_normal(norm.xy); // unpack norm +		 +	float da_sun  = dot(norm.xyz, normalize(sun_dir.xyz));      float da_moon = dot(norm.xyz, normalize(moon_dir.xyz));      float da = max(da_sun, da_moon);      float final_da = clamp(da, 0.0, 1.0); -          final_da = pow(final_da, global_gamma); +          final_da = pow(final_da, global_gamma + 0.3);      vec4 diffuse = texture2DRect(diffuseRect, tc); -    //convert to gamma space -    //diffuse.rgb = linear_to_srgb(diffuse.rgb); -      vec4 spec = texture2DRect(specularRect, vary_fragcoord.xy);      vec3 col;      float bloom = 0.0; @@ -173,10 +150,6 @@ void main()              col = fogged.rgb;              bloom = fogged.a;          #endif - -        //col = srgb_to_linear(col); -        //col = vec3(1,0,1); -        //col.g = envIntensity;      }      frag_color.rgb = col.rgb; diff --git a/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl index 2b6428963d..22488944cd 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/spotLightF.glsl @@ -71,18 +71,10 @@ 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)); @@ -102,7 +94,6 @@ vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod)  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)); @@ -120,7 +111,6 @@ vec4 texture2DLodDiffuse(sampler2D projectionMap, vec2 tc, float lod)  vec4 texture2DLodAmbient(sampler2D projectionMap, vec2 tc, float lod)  {  	vec4 ret = texture2DLod(projectionMap, tc, lod); -	ret = correctWithGamma(ret);  	vec2 dist = tc-vec2(0.5); @@ -131,19 +121,7 @@ vec4 texture2DLodAmbient(sampler2D projectionMap, vec2 tc, float lod)  	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; -} +vec4 getPosition(vec2 pos_screen);  void main()   { diff --git a/indra/newview/app_settings/shaders/class1/deferred/srgb.glsl b/indra/newview/app_settings/shaders/class1/deferred/srgb.glsl deleted file mode 100644 index bc3324f543..0000000000 --- a/indra/newview/app_settings/shaders/class1/deferred/srgb.glsl +++ /dev/null @@ -1,61 +0,0 @@ -/**  - * @file srgb.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$ - */ - -vec3 rgb2hsv(vec3 c) -{ -    vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); -    vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g)); -    vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r)); - -    float d = q.x - min(q.w, q.y); -    float e = 1.0e-10; -    return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); -} - -vec3 hsv2rgb(vec3 c) -{ -    vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); -    vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www); -    return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); -} - -vec3 srgb_to_linear(vec3 cs) -{ -	vec3 low_range = cs / vec3(12.92); -	vec3 high_range = pow((cs+vec3(0.055))/vec3(1.055), vec3(2.4)); - -	bvec3 lte = lessThanEqual(cs,vec3(0.04045)); -	return mix(high_range, low_range, lte); -} - -vec3 linear_to_srgb(vec3 cl) -{ -	cl = clamp(cl, vec3(0), vec3(1)); -	vec3 low_range  = cl * 12.92; -	vec3 high_range = 1.055 * pow(cl, vec3(0.41666)) - 0.055; - -	bvec3 lt = lessThan(cl,vec3(0.0031308)); -	return mix(high_range, low_range, lt); -} diff --git a/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOF.glsl b/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOF.glsl index 403df87853..e98ab1f2eb 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/sunLightSSAOF.glsl @@ -35,88 +35,16 @@ out vec4 frag_color;  //class 1 -- no shadow, SSAO only -uniform sampler2DRect depthMap;  uniform sampler2DRect normalMap; -uniform sampler2D noiseMap; -  // Inputs -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; -  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; -} +vec4 getPosition(vec2 pos_screen);  //calculate decreases in ambient lighting when crowded out (SSAO) -float calcAmbientOcclusion(vec4 pos, vec3 norm) -{ -	float ret = 1.0; -	 -	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; - -	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; -	int 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(kern[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) -			 -		angle_hidden = angle_hidden + float(dot((samppos_world - 0.05*norm - pos_world), norm) > 0.0) * min(1.0/dist2, ssao_factor_inv); -			 -		// 'blocked' samples (significantly closer to camera relative to pos_world) are "no data", not "no occlusion"  -		points = points + int(diff.z > -1.0); -	} -		 -	angle_hidden = min(ssao_factor*angle_hidden/float(points), 1.0); -		 -	ret = (1.0 - (float(points != 0) * angle_hidden)); -	 -	return min(ret, 1.0); -} +float calcAmbientOcclusion(vec4 pos, vec3 norm, vec2 pos_screen);  void main()   { @@ -124,13 +52,11 @@ void main()  	//try doing an unproject here -	vec4 pos = getPosition(pos_screen); -	 -	vec3 norm = texture2DRect(normalMap, pos_screen).xyz; -	norm = decode_normal(norm.xy); -		 +	vec4 pos  = getPosition(pos_screen); +	vec3 norm = decode_normal(texture2DRect(normalMap, pos_screen).xy); +  	frag_color[0] = 1.0; -	frag_color[1] = calcAmbientOcclusion(pos, norm); +	frag_color[1] = calcAmbientOcclusion(pos, norm, pos_screen);  	frag_color[2] = 1.0;   	frag_color[3] = 1.0;  } diff --git a/indra/newview/app_settings/shaders/class1/deferred/underWaterF.glsl b/indra/newview/app_settings/shaders/class1/deferred/underWaterF.glsl index db1eab23fb..e95a688e1f 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/underWaterF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/underWaterF.glsl @@ -58,9 +58,6 @@ VARYING vec4 refCoord;  VARYING vec4 littleWave;  VARYING vec4 view; -vec3 srgb_to_linear(vec3 cs); -vec3 linear_to_srgb(vec3 cl); -  vec2 encode_normal(vec3 n);  vec4 applyWaterFog(vec4 color, vec3 viewVec) diff --git a/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl b/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl index 869c9e7927..2acfe58e82 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/waterF.glsl @@ -62,7 +62,6 @@ VARYING vec4 littleWave;  VARYING vec4 view;  VARYING vec4 vary_position; -vec3 srgb_to_linear(vec3 cs);  vec2 encode_normal(vec3 n);  vec3 scaleSoftClipFrag(vec3 l); diff --git a/indra/newview/app_settings/shaders/class1/environment/srgbF.glsl b/indra/newview/app_settings/shaders/class1/environment/srgbF.glsl index f98b3a5edf..4a8b892c3a 100644 --- a/indra/newview/app_settings/shaders/class1/environment/srgbF.glsl +++ b/indra/newview/app_settings/shaders/class1/environment/srgbF.glsl @@ -64,3 +64,21 @@ vec3 ColorFromRadiance(vec3 radiance)  {      return vec3(1.0) - exp(-radiance * 0.0001);  } + +vec3 rgb2hsv(vec3 c) +{ +    vec4 K = vec4(0.0, -1.0 / 3.0, 2.0 / 3.0, -1.0); +    vec4 p = mix(vec4(c.bg, K.wz), vec4(c.gb, K.xy), step(c.b, c.g)); +    vec4 q = mix(vec4(p.xyw, c.r), vec4(c.r, p.yzx), step(p.x, c.r)); + +    float d = q.x - min(q.w, q.y); +    float e = 1.0e-10; +    return vec3(abs(q.z + (q.w - q.y) / (6.0 * d + e)), d / (q.x + e), q.x); +} + +vec3 hsv2rgb(vec3 c) +{ +    vec4 K = vec4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0); +    vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www); +    return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y); +} diff --git a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsF.glsl b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsF.glsl index 8b7c4f2ecf..4f0e2a6cb6 100644 --- a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsF.glsl +++ b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsF.glsl @@ -1,5 +1,5 @@  /**  - * @file atmosphericsF.glsl + * @file class1\windlight\atmosphericsF.glsl   *   * $LicenseInfo:firstyear=2005&license=viewerlgpl$   * Second Life Viewer Source Code diff --git a/indra/newview/app_settings/shaders/class1/windlight/cloudShadowF.glsl b/indra/newview/app_settings/shaders/class1/windlight/cloudShadowF.glsl new file mode 100644 index 0000000000..fa6926b007 --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/windlight/cloudShadowF.glsl @@ -0,0 +1,121 @@ +/**  + * @file class3/deferred/cloudsF.glsl + * + * $LicenseInfo:firstyear=2005&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2005, 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$ + */ +  +#ifdef DEFINE_GL_FRAGCOLOR +out vec4 frag_color; +#else +#define frag_color gl_FragColor +#endif + +uniform sampler2D diffuseMap; + +VARYING vec4 pos; +VARYING float target_pos_x; +VARYING float vary_CloudDensity; +VARYING vec2 vary_texcoord0; +VARYING vec2 vary_texcoord1; +VARYING vec2 vary_texcoord2; +VARYING vec2 vary_texcoord3; + +uniform sampler2D cloud_noise_texture; +uniform sampler2D cloud_noise_texture_next; +uniform float blend_factor; +uniform vec4 cloud_pos_density1; +uniform vec4 cloud_pos_density2; +uniform vec4 sunlight_color; +uniform vec4 cloud_color; +uniform float cloud_shadow; +uniform float cloud_scale; +uniform float cloud_variance; +uniform vec3 ambient; +uniform vec3 camPosLocal; +uniform vec3 sun_dir; +uniform float sun_size; +uniform float far_z; + +#if !DEPTH_CLAMP +VARYING vec4 post_pos; +#endif + +vec4 cloudNoise(vec2 uv) +{ +   vec4 a = texture2D(cloud_noise_texture, uv); +   vec4 b = texture2D(cloud_noise_texture_next, uv); +   vec4 cloud_noise_sample = mix(a, b, blend_factor); +   return normalize(cloud_noise_sample); +} + +void main() +{ +	// Set variables +	vec2 uv1 = vary_texcoord0.xy; +	vec2 uv2 = vary_texcoord1.xy; +	vec2 uv3 = vary_texcoord2.xy; +	float cloudDensity = 2.0 * (cloud_shadow - 0.25); + +	vec2 uv4 = vary_texcoord3.xy; + +    vec2 disturbance  = vec2(cloudNoise(uv1 / 8.0f).x, cloudNoise((uv3 + uv1) / 16.0f).x) * cloud_variance * (1.0f - cloud_scale * 0.25f); +    vec2 disturbance2 = vec2(cloudNoise((uv1 + uv3) / 4.0f).x, cloudNoise((uv4 + uv2) / 8.0f).x) * cloud_variance * (1.0f - cloud_scale * 0.25f); + +	// Offset texture coords +	uv1 += cloud_pos_density1.xy + (disturbance * 0.02);	//large texture, visible density +	uv2 += cloud_pos_density1.xy;	//large texture, self shadow +	uv3 += cloud_pos_density2.xy;	//small texture, visible density +	uv4 += cloud_pos_density2.xy;	//small texture, self shadow + +    float density_variance = min(1.0, (disturbance.x* 2.0 + disturbance.y* 2.0 + disturbance2.x + disturbance2.y)); + +    cloudDensity *= 1.0 - (density_variance * density_variance); + +	// Compute alpha1, the main cloud opacity +	float alpha1 = (cloudNoise(uv1).x - 0.5) + (cloudNoise(uv3).x - 0.5) * cloud_pos_density2.z; +	alpha1 = min(max(alpha1 + cloudDensity, 0.) * 10 * cloud_pos_density1.z, 1.); + +	// And smooth +	alpha1 = 1. - alpha1 * alpha1; +	alpha1 = 1. - alpha1 * alpha1;	 + +    if (alpha1 < 0.001f) +    { +        discard; +    } + +	// Compute alpha2, for self shadowing effect +	// (1 - alpha2) will later be used as percentage of incoming sunlight +	float alpha2 = (cloudNoise(uv2).x - 0.5); +	alpha2 = min(max(alpha2 + cloudDensity, 0.) * 2.5 * cloud_pos_density1.z, 1.); + +	// And smooth +	alpha2 = 1. - alpha2; +	alpha2 = 1. - alpha2 * alpha2;	 + +    frag_color = vec4(alpha1, alpha1, alpha1, 1); + +#if !DEPTH_CLAMP +	gl_FragDepth = max(post_pos.z/post_pos.w*0.5+0.5, 0.0); +#endif + +} diff --git a/indra/newview/app_settings/shaders/class1/windlight/cloudShadowV.glsl b/indra/newview/app_settings/shaders/class1/windlight/cloudShadowV.glsl new file mode 100644 index 0000000000..52164e7b80 --- /dev/null +++ b/indra/newview/app_settings/shaders/class1/windlight/cloudShadowV.glsl @@ -0,0 +1,61 @@ +/**  + * @file cloudShadowV.glsl + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, 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 texture_matrix0; +uniform mat4 modelview_projection_matrix; +uniform float shadow_target_width; + +ATTRIBUTE vec3 position; +ATTRIBUTE vec4 diffuse_color; +ATTRIBUTE vec2 texcoord0; + +#if !DEPTH_CLAMP +VARYING float pos_zd2; +#endif + +VARYING vec4 pos; +VARYING float target_pos_x; +VARYING vec2 vary_texcoord0; + +void passTextureIndex(); + +void main() +{ +	//transform vertex +	vec4 pre_pos = vec4(position.xyz, 1.0); +	pos = modelview_projection_matrix * pre_pos; +	target_pos_x = 0.5 * (shadow_target_width - 1.0) * pos.x; + +#if !DEPTH_CLAMP +	pos_zd2 = pos.z * 0.5; +	gl_Position = vec4(pos.x, pos.y, pos.w*0.5, pos.w); +#else +	gl_Position = pos; +#endif +	 +	passTextureIndex(); + +	vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy; +} diff --git a/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl index 864ba4859d..1c5d3901f5 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/multiSpotLightF.glsl @@ -71,19 +71,11 @@ 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)); @@ -103,7 +95,6 @@ vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod)  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)); @@ -121,7 +112,6 @@ vec4 texture2DLodDiffuse(sampler2D projectionMap, vec2 tc, float lod)  vec4 texture2DLodAmbient(sampler2D projectionMap, vec2 tc, float lod)  {  	vec4 ret = texture2DLod(projectionMap, tc, lod); -	ret = correctWithGamma(ret);  	vec2 dist = tc-vec2(0.5); @@ -132,19 +122,7 @@ vec4 texture2DLodAmbient(sampler2D projectionMap, vec2 tc, float lod)  	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; -} +vec4 getPosition(vec2 pos_screen);  void main()   { diff --git a/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl index 184ac13b27..c5d317ad37 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl @@ -74,37 +74,19 @@ VARYING vec2 vary_fragcoord;  uniform mat4 inv_proj;  uniform vec2 screen_res; -vec3 srgb_to_linear(vec3 cs); -vec3 linear_to_srgb(vec3 cl);  vec3 decode_normal (vec2 enc);  void calcFragAtmospherics(vec3 inPositionEye, float ambFactor, out vec3 sunlit, out vec3 amblit, out vec3 additive, out vec3 atten);  vec3 atmosFragLighting(vec3 l, vec3 additive, vec3 atten); -vec3 fullbrightScaleSoftClipFrag(vec3 l); +vec3 fullbrightScaleSoftClipFrag(vec3 l, vec3 add, vec3 atten);  vec3 scaleSoftClipFrag(vec3 l);  vec3 atmosTransportFrag(vec3 light, vec3 additive, vec3 atten);  vec3 fullbrightAtmosTransportFrag(vec3 light, vec3 additive, vec3 atten);  vec3 fullbrightShinyAtmosTransportFrag(vec3 light, vec3 additive, vec3 atten); -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); -} - +vec4 getPositionWithDepth(vec2 pos_screen, float depth); +vec4 getPosition(vec2 pos_screen);  #ifdef WATER_FOG  vec4 applyWaterFogView(vec3 pos, vec4 color); @@ -112,32 +94,29 @@ vec4 applyWaterFogView(vec3 pos, vec4 color);  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_sun  = dot(norm.xyz, normalize(sun_dir.xyz)); +	vec2 tc = vary_fragcoord.xy; +	float depth = texture2DRect(depthMap, tc.xy).r; +	vec4 pos = getPositionWithDepth(tc, depth); +	vec4 norm = texture2DRect(normalMap, tc); +	float envIntensity = norm.z; +	norm.xyz = decode_normal(norm.xy); // unpack norm +		 +	float da_sun  = dot(norm.xyz, normalize(sun_dir.xyz));      float da_moon = dot(norm.xyz, normalize(moon_dir.xyz));      float da = max(da_sun, da_moon);            da = clamp(da, 0.0, 1.0); -    da = pow(da, global_gamma); - -    vec4 diffuse = texture2DRect(diffuseRect, tc); - -    //convert to gamma space -	//diffuse.rgb = linear_to_srgb(diffuse.rgb); +	da = pow(da, global_gamma + 0.3); +	vec4 diffuse = texture2DRect(diffuseRect, tc); +	      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(global_gamma)); +        scol_ambocc = pow(scol_ambocc, vec2(global_gamma + 0.3));          float scol = max(scol_ambocc.r, diffuse.a);           float ambocc = scol_ambocc.g; @@ -187,7 +166,7 @@ void main()          if (norm.w < 0.5)          {              col = mix(atmosFragLighting(col, additive, atten), fullbrightAtmosTransportFrag(col, additive, atten), diffuse.a); -            col = mix(scaleSoftClipFrag(col), fullbrightScaleSoftClipFrag(col), diffuse.a); +            col = mix(scaleSoftClipFrag(col), fullbrightScaleSoftClipFrag(col, additive, atten), diffuse.a);          }          #ifdef WATER_FOG @@ -195,9 +174,6 @@ void main()              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/class2/deferred/softenLightV.glsl b/indra/newview/app_settings/shaders/class2/deferred/softenLightV.glsl index c840d72784..8b8b338f68 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/softenLightV.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/softenLightV.glsl @@ -36,7 +36,5 @@ 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/class2/deferred/spotLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl index a7da140b31..36854b0e66 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/spotLightF.glsl @@ -72,18 +72,10 @@ 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)); @@ -103,7 +95,6 @@ vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod)  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)); @@ -121,7 +112,6 @@ vec4 texture2DLodDiffuse(sampler2D projectionMap, vec2 tc, float lod)  vec4 texture2DLodAmbient(sampler2D projectionMap, vec2 tc, float lod)  {  	vec4 ret = texture2DLod(projectionMap, tc, lod); -	ret = correctWithGamma(ret);  	vec2 dist = tc-vec2(0.5); @@ -132,19 +122,7 @@ vec4 texture2DLodAmbient(sampler2D projectionMap, vec2 tc, float lod)  	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; -} +vec4 getPosition(vec2 pos_screen);  void main()   { diff --git a/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl index f2d04c95fe..fc5756beef 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/sunLightF.glsl @@ -35,219 +35,27 @@ out vec4 frag_color;  //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 vec3 moon_dir; - -uniform vec2 shadow_res;  uniform float shadow_bias; -uniform float shadow_offset; - -uniform float spot_shadow_bias; -uniform float spot_shadow_offset; +vec3 getNorm(vec2 pos_screen);  vec3 decode_normal (vec2 enc); +vec4 getPosition(vec2 pos_screen); -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; -} +float sampleDirectionalShadow(vec3 pos, vec3 norm, vec2 pos_screen); +float sampleSpotShadow(vec3 pos, vec3 norm, int index, vec2 pos_screen);  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_sun  = dot(norm, normalize(sun_dir.xyz)); -	float dp_moon = dot(norm, normalize(moon_dir.xyz)); -	float dp_directional_light = max(dp_sun, dp_moon); -        dp_directional_light = clamp(dp_directional_light, 0.0, 1.0); - -        vec3 light_direction = (dp_moon > dp_sun) ? moon_dir : sun_dir;	 - -	vec3 shadow_pos = pos.xyz; -	vec3 offset = light_direction.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; +    vec2 pos_screen = vary_fragcoord.xy; +    vec4 pos        = getPosition(pos_screen); +    vec3 norm       = getNorm(pos_screen); + +    frag_color.r = sampleDirectionalShadow(pos.xyz, norm, pos_screen); +    frag_color.g = 1.0f; +    frag_color.b = sampleSpotShadow(pos.xyz, norm, 0, pos_screen);  +    frag_color.a = sampleSpotShadow(pos.xyz, norm, 1, pos_screen);  } diff --git a/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl b/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl index fd3256e9c8..390f9fc947 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/sunLightSSAOF.glsl @@ -1,5 +1,5 @@  /**  - * @file sunLightSSAOF.glsl + * @file class2/deferred/sunLightSSAOF.glsl   * $LicenseInfo:firstyear=2007&license=viewerlgpl$   * Second Life Viewer Source Code   * Copyright (C) 2007, Linden Research, Inc. @@ -34,281 +34,25 @@ out vec4 frag_color;  //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 vec3 moon_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); +vec3 getNorm(vec2 pos_screen); -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; -} +float sampleDirectionalShadow(vec3 shadow_pos, vec3 norm, vec2 pos_screen); +float sampleSpotShadow(vec3 shadow_pos, vec3 norm, int index, vec2 pos_screen); +float calcAmbientOcclusion(vec4 pos, vec3 norm, vec2 pos_screen);  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_sun = dot(norm, normalize(sun_dir.xyz)); -	float dp_moon = dot(norm, normalize(moon_dir.xyz)); -	float dp_directional_light = max(dp_sun, dp_moon); -	dp_directional_light = max(0.0, dp_directional_light); - -        vec3 light_direction = (dp_moon > dp_sun) ? moon_dir : sun_dir;	 - -	vec3 shadow_pos = pos.xyz; -	vec3 offset = light_direction.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; +    vec2 pos_screen = vary_fragcoord.xy; +    vec4 pos  = getPosition(pos_screen); +    vec3 norm = getNorm(pos_screen); + +    frag_color.r = sampleDirectionalShadow(pos.xyz, norm, pos_screen); +    frag_color.g = calcAmbientOcclusion(pos, norm, pos_screen); +    frag_color.b = sampleSpotShadow(pos.xyz, norm, 0, pos_screen); +    frag_color.a = sampleSpotShadow(pos.xyz, norm, 1, pos_screen);  } diff --git a/indra/newview/app_settings/shaders/class2/windlight/gammaF.glsl b/indra/newview/app_settings/shaders/class2/windlight/gammaF.glsl index ac7c57747e..143bafc9c9 100644 --- a/indra/newview/app_settings/shaders/class2/windlight/gammaF.glsl +++ b/indra/newview/app_settings/shaders/class2/windlight/gammaF.glsl @@ -47,7 +47,7 @@ vec3 scaleSoftClip(vec3 light)      return scaleSoftClipFrag(light);  } -vec3 fullbrightScaleSoftClipFrag(vec3 light) { +vec3 fullbrightScaleSoftClipFrag(vec3 light, vec3 add, vec3 atten) {      return scaleSoftClipFrag(light.rgb);   } diff --git a/indra/newview/app_settings/shaders/class3/deferred/attachmentShadowF.glsl b/indra/newview/app_settings/shaders/class3/deferred/attachmentShadowF.glsl new file mode 100644 index 0000000000..d973326f93 --- /dev/null +++ b/indra/newview/app_settings/shaders/class3/deferred/attachmentShadowF.glsl @@ -0,0 +1,44 @@ +/**  + * @file avatarShadowF.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$ + */ + +/*[EXTRA_CODE_HERE]*/ + +#ifdef DEFINE_GL_FRAGCOLOR +out vec4 frag_color; +#else +#define frag_color gl_FragColor +#endif + +uniform sampler2D diffuseMap; + +VARYING vec4 pos; +VARYING vec2 vary_texcoord0; + +vec4 computeMoments(float depth, float a); + +void main()  +{ +    frag_color = computeMoments(length(pos), 1.0); +} + diff --git a/indra/newview/app_settings/shaders/class3/deferred/attachmentShadowV.glsl b/indra/newview/app_settings/shaders/class3/deferred/attachmentShadowV.glsl new file mode 100644 index 0000000000..3be9cb3de8 --- /dev/null +++ b/indra/newview/app_settings/shaders/class3/deferred/attachmentShadowV.glsl @@ -0,0 +1,51 @@ +/**  + * @file attachmentShadowV.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 projection_matrix; +uniform mat4 modelview_matrix; +uniform mat4 texture_matrix0; + +ATTRIBUTE vec3 position; +ATTRIBUTE vec2 texcoord0; + +mat4 getObjectSkinnedTransform(); + +VARYING vec4 pos; + +void main() +{ +	//transform vertex +	mat4 mat = getObjectSkinnedTransform(); +	 +	mat = modelview_matrix * mat; +	pos = (mat*vec4(position.xyz, 1.0)); +	pos = projection_matrix * vec4(pos.xyz, 1.0); + +#if !DEPTH_CLAMP +	pos.z = max(pos.z, -pos.w+0.01); +	gl_Position = pos; +#else +	gl_Position = pos; +#endif +} diff --git a/indra/newview/app_settings/shaders/class3/windlight/gammaF.glsl b/indra/newview/app_settings/shaders/class3/deferred/avatarShadowF.glsl index 709d9cbc0a..f4e5a61e36 100644 --- a/indra/newview/app_settings/shaders/class3/windlight/gammaF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/avatarShadowF.glsl @@ -1,5 +1,5 @@  /**  - * @file gammaF.glsl + * @file avatarShadowF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$   * Second Life Viewer Source Code @@ -22,33 +22,31 @@   * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA   * $/LicenseInfo$   */ -  +/*[EXTRA_CODE_HERE]*/  -uniform vec4 gamma; -uniform int no_atmo; +#ifdef DEFINE_GL_FRAGCOLOR +out vec4 frag_color; +#else +#define frag_color gl_FragColor +#endif -vec3 scaleSoftClipFrag(vec3 light) { -    if (no_atmo == 1) -    { -        return light; -    } -	light = 1. - clamp(light, vec3(0.), vec3(1.)); -	light = 1. - pow(light, gamma.xxx); -	return light; -} +uniform sampler2D diffuseMap; -/// Soft clips the light with a gamma correction -vec3 scaleSoftClip(vec3 light) { -	return scaleSoftClipFrag(light); -} +#if !DEPTH_CLAMP +VARYING vec4 post_pos; +#endif + +VARYING vec4 pos; -vec3 fullbrightScaleSoftClipFrag(vec3 light) +vec4 computeMoments(float depth, float a); + +void main()   { -	return scaleSoftClipFrag(light.rgb); -} +    frag_color = computeMoments(length(pos), 1.0); -vec3 fullbrightScaleSoftClip(vec3 light) { -	return fullbrightScaleSoftClipFrag(light.rgb); +#if !DEPTH_CLAMP +	gl_FragDepth = max(post_pos.z/post_pos.w*0.5+0.5, 0.0); +#endif  } diff --git a/indra/newview/app_settings/shaders/class3/deferred/avatarShadowV.glsl b/indra/newview/app_settings/shaders/class3/deferred/avatarShadowV.glsl new file mode 100644 index 0000000000..96ca2fd707 --- /dev/null +++ b/indra/newview/app_settings/shaders/class3/deferred/avatarShadowV.glsl @@ -0,0 +1,68 @@ +/**  + * @file avatarShadowV.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 projection_matrix; + +mat4 getSkinnedTransform(); + +ATTRIBUTE vec3 position; +ATTRIBUTE vec3 normal; +ATTRIBUTE vec2 texcoord0; + +#if !DEPTH_CLAMP +VARYING vec4 post_pos; +#endif + +VARYING vec4 pos; + +void main() +{ +	vec3 norm; +	 +	vec4 pos_in = vec4(position.xyz, 1.0); +	mat4 trans = getSkinnedTransform(); + +	pos.x = dot(trans[0], pos_in); +	pos.y = dot(trans[1], pos_in); +	pos.z = dot(trans[2], pos_in); +	pos.w = 1.0; +	 +	norm.x = dot(trans[0].xyz, normal); +	norm.y = dot(trans[1].xyz, normal); +	norm.z = dot(trans[2].xyz, normal); +	norm = normalize(norm); +	 +	pos = projection_matrix * pos; + +#if !DEPTH_CLAMP +	post_pos = pos; +	gl_Position = vec4(pos.x, pos.y, pos.w*0.5, pos.w); +#else +	gl_Position = pos; +#endif + +} + + diff --git a/indra/newview/app_settings/shaders/class3/deferred/cloudShadowF.glsl b/indra/newview/app_settings/shaders/class3/deferred/cloudShadowF.glsl new file mode 100644 index 0000000000..65af2821be --- /dev/null +++ b/indra/newview/app_settings/shaders/class3/deferred/cloudShadowF.glsl @@ -0,0 +1,114 @@ +/**  + * @file class3/deferred/cloudsF.glsl + * + * $LicenseInfo:firstyear=2005&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2005, 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$ + */ +  +#ifdef DEFINE_GL_FRAGCOLOR +out vec4 frag_color; +#else +#define frag_color gl_FragColor +#endif + +uniform sampler2D diffuseMap; + +VARYING vec4 pos; +VARYING float target_pos_x; +VARYING float vary_CloudDensity; +VARYING vec2 vary_texcoord0; +VARYING vec2 vary_texcoord1; +VARYING vec2 vary_texcoord2; +VARYING vec2 vary_texcoord3; + +uniform sampler2D cloud_noise_texture; +uniform sampler2D cloud_noise_texture_next; +uniform float blend_factor; +uniform vec4 cloud_pos_density1; +uniform vec4 cloud_pos_density2; +uniform vec4 sunlight_color; +uniform vec4 cloud_color; +uniform float cloud_shadow; +uniform float cloud_scale; +uniform float cloud_variance; +uniform vec3 ambient; +uniform vec3 camPosLocal; +uniform vec3 sun_dir; +uniform float sun_size; +uniform float far_z; + +vec4 cloudNoise(vec2 uv) +{ +   vec4 a = texture2D(cloud_noise_texture, uv); +   vec4 b = texture2D(cloud_noise_texture_next, uv); +   vec4 cloud_noise_sample = mix(a, b, blend_factor); +   return normalize(cloud_noise_sample); +} + +vec4 computeMoments(float depth, float alpha); + +void main() +{ +	// Set variables +	vec2 uv1 = vary_texcoord0.xy; +	vec2 uv2 = vary_texcoord1.xy; +	vec2 uv3 = vary_texcoord2.xy; +	float cloudDensity = 2.0 * (cloud_shadow - 0.25); + +	vec2 uv4 = vary_texcoord3.xy; + +    vec2 disturbance  = vec2(cloudNoise(uv1 / 8.0f).x, cloudNoise((uv3 + uv1) / 16.0f).x) * cloud_variance * (1.0f - cloud_scale * 0.25f); +    vec2 disturbance2 = vec2(cloudNoise((uv1 + uv3) / 4.0f).x, cloudNoise((uv4 + uv2) / 8.0f).x) * cloud_variance * (1.0f - cloud_scale * 0.25f); + +	// Offset texture coords +	uv1 += cloud_pos_density1.xy + (disturbance * 0.02);	//large texture, visible density +	uv2 += cloud_pos_density1.xy;	//large texture, self shadow +	uv3 += cloud_pos_density2.xy;	//small texture, visible density +	uv4 += cloud_pos_density2.xy;	//small texture, self shadow + +    float density_variance = min(1.0, (disturbance.x* 2.0 + disturbance.y* 2.0 + disturbance2.x + disturbance2.y)); + +    cloudDensity *= 1.0 - (density_variance * density_variance); + +	// Compute alpha1, the main cloud opacity +	float alpha1 = (cloudNoise(uv1).x - 0.5) + (cloudNoise(uv3).x - 0.5) * cloud_pos_density2.z; +	alpha1 = min(max(alpha1 + cloudDensity, 0.) * 10 * cloud_pos_density1.z, 1.); + +	// And smooth +	alpha1 = 1. - alpha1 * alpha1; +	alpha1 = 1. - alpha1 * alpha1;	 + +    if (alpha1 < 0.001f) +    { +        discard; +    } + +	// Compute alpha2, for self shadowing effect +	// (1 - alpha2) will later be used as percentage of incoming sunlight +	float alpha2 = (cloudNoise(uv2).x - 0.5); +	alpha2 = min(max(alpha2 + cloudDensity, 0.) * 2.5 * cloud_pos_density1.z, 1.); + +	// And smooth +	alpha2 = 1. - alpha2; +	alpha2 = 1. - alpha2 * alpha2;	 + +    frag_color = computeMoments(length(pos), alpha1); +} diff --git a/indra/newview/app_settings/shaders/class3/deferred/cloudShadowV.glsl b/indra/newview/app_settings/shaders/class3/deferred/cloudShadowV.glsl new file mode 100644 index 0000000000..cb27b2c2c5 --- /dev/null +++ b/indra/newview/app_settings/shaders/class3/deferred/cloudShadowV.glsl @@ -0,0 +1,63 @@ +/**  + * @file cloudShadowV.glsl + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, 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 texture_matrix0; +uniform mat4 modelview_projection_matrix; +uniform float shadow_target_width; + +ATTRIBUTE vec3 position; +ATTRIBUTE vec4 diffuse_color; +ATTRIBUTE vec2 texcoord0; + +#if !DEPTH_CLAMP +VARYING float pos_zd2; +#endif + +VARYING vec4 pos; +VARYING float target_pos_x; +VARYING vec2 vary_texcoord0; +VARYING vec4 vertex_color; + +void passTextureIndex(); + +void main() +{ +	//transform vertex +	vec4 pre_pos = vec4(position.xyz, 1.0); +	pos = modelview_projection_matrix * pre_pos; +	target_pos_x = 0.5 * (shadow_target_width - 1.0) * pos.x; + +#if !DEPTH_CLAMP +	pos_zd2 = pos.z * 0.5; +	gl_Position = vec4(pos.x, pos.y, pos.w*0.5, pos.w); +#else +	gl_Position = pos; +#endif +	 +	passTextureIndex(); + +	vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy; +	vertex_color = diffuse_color; +} diff --git a/indra/newview/app_settings/shaders/class3/deferred/cloudsF.glsl b/indra/newview/app_settings/shaders/class3/deferred/cloudsF.glsl index f8373215f0..015caad749 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/cloudsF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/cloudsF.glsl @@ -138,9 +138,23 @@ void main()  	// Combine  	vec4 color; +    vec4 l1tap = vec4(1.0/sqrt(4*3.14159265), sqrt(3)/sqrt(4*3.14159265), sqrt(3)/sqrt(4*3.14159265), sqrt(3)/sqrt(4*3.14159265)); + +    vec4 l1r = texture2D(sh_input_r, vec2(0,0)); +    vec4 l1g = texture2D(sh_input_g, vec2(0,0)); +    vec4 l1b = texture2D(sh_input_b, vec2(0,0)); + +    vec3 sun_indir = vec3(-view_direction.xy, view_direction.z); +    vec3 amb = vec3(dot(l1r, l1tap * vec4(1, sun_indir)), +                    dot(l1g, l1tap * vec4(1, sun_indir)), +                    dot(l1b, l1tap * vec4(1, sun_indir))); + + +    amb = max(vec3(0), amb); +      color.rgb = sun_color * cloud_color.rgb * (1. - alpha2);      color.rgb = pow(color.rgb, vec3(1.0 / 2.2)); -    color.rgb += ambient; +    color.rgb += amb;  	frag_data[0] = vec4(color.rgb, alpha1);  	frag_data[1] = vec4(0); diff --git a/indra/newview/app_settings/shaders/class3/deferred/deferredUtil.glsl b/indra/newview/app_settings/shaders/class3/deferred/deferredUtil.glsl new file mode 100644 index 0000000000..cccd01e0d7 --- /dev/null +++ b/indra/newview/app_settings/shaders/class3/deferred/deferredUtil.glsl @@ -0,0 +1,75 @@ +/**  + * @file class3/deferred/deferredUtil.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 sampler2DRect   normalMap; +uniform sampler2DRect   depthMap; + +uniform mat4 inv_proj; +uniform vec2 screen_res; + +vec3 decode_normal(vec2 enc); + +vec2 getScreenCoordinate(vec2 screenpos) +{ +    vec2 sc = screenpos.xy * 2.0; +    if (screen_res.x > 0 && screen_res.y > 0) +    { +       sc /= screen_res; +    } +    return sc - vec2(1.0, 1.0); +} + +vec3 getNorm(vec2 screenpos) +{ +   vec2 enc_norm = texture2DRect(normalMap, screenpos.xy).xy; +   return decode_normal(enc_norm); +} + +float getDepth(vec2 pos_screen) +{ +    float depth = texture2DRect(depthMap, pos_screen).r; +    return depth; +} + +vec4 getPosition(vec2 pos_screen) +{ +    float depth = getDepth(pos_screen); +    vec2 sc = getScreenCoordinate(pos_screen); +    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 getPositionWithDepth(vec2 pos_screen, float depth) +{ +    vec2 sc = getScreenCoordinate(pos_screen); +    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; +} diff --git a/indra/newview/app_settings/shaders/class3/deferred/depthToShadowVolumeG.glsl b/indra/newview/app_settings/shaders/class3/deferred/depthToShadowVolumeG.glsl new file mode 100644 index 0000000000..5734e2abb2 --- /dev/null +++ b/indra/newview/app_settings/shaders/class3/deferred/depthToShadowVolumeG.glsl @@ -0,0 +1,202 @@ +/** 
 + * @file depthToShadowVolumeG.glsl
 + *
 + * $LicenseInfo:firstyear=2011&license=viewerlgpl$
 + * Second Life Viewer Source Code
 + * Copyright (C) 2011, 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_geometry_shader4  : enable
 +#extension GL_ARB_texture_rectangle : enable
 +
 +/*[EXTRA_CODE_HERE]*/
 +
 +layout (triangles) in;
 +layout (triangle_strip, max_vertices = 128) out;
 +
 +uniform sampler2DRect depthMap;
 +uniform mat4 shadowMatrix[6]; 
 +uniform vec4 lightpos;
 +
 +VARYING vec2 vary_texcoord0;
 +
 +out vec3 to_vec;
 +
 +void cross_products(out vec4 ns[3], int a, int b, int c)
 +{
 +   ns[0] = cross(gl_PositionIn[b].xyz - gl_PositionIn[a].xyz, gl_PositionIn[c].xyz - gl_PositionIn[a].xyz);
 +   ns[1] = cross(gl_PositionIn[c].xyz - gl_PositionIn[b].xyz, gl_PositionIn[a].xyz - gl_PositionIn[b].xyz);
 +   ns[2] = cross(gl_PositionIn[a].xyz - gl_PositionIn[c].xyz, gl_PositionIn[b].xyz - gl_PositionIn[c].xyz);
 +}
 +
 +vec3 getLightDirection(vec4 lightpos, vec3 pos)
 +{
 +
 +    vec3 lightdir = lightpos.xyz - lightpos.w * pos;
 +    return lightdir;
 +}
 +
 +void emitTri(vec4 v[3])
 +{
 +    gl_Position = proj_matrix * v[0];
 +    EmitVertex();
 +
 +    gl_Position = proj_matrix * v[1];
 +    EmitVertex();
 +
 +    gl_Position = proj_matrix * v[2];
 +    EmitVertex();
 +
 +    EndPrimitive();
 +}
 +
 +void emitQuad(vec4 v[4]
 +{
 +    // Emit a quad as a triangle strip.
 +    gl_Position = proj_matrix*v[0];
 +    EmitVertex();
 +
 +    gl_Position = proj_matrix*v[1];
 +    EmitVertex();
 +
 +    gl_Position = proj_matrix*v[2];
 +    EmitVertex();
 +
 +    gl_Position = proj_matrix*v[3];
 +    EmitVertex(); 
 +
 +    EndPrimitive();
 +}
 +
 +void emitPrimitives(int layer)
 +{
 +    int i = layer;
 +    gl_Layer = i;
 +
 +    vec4 depth1 = vec4(texture2DRect(depthMap, tc0).rg, texture2DRect(depthMap, tc1).rg));
 +    vec3 depth2 = vec4(texture2DRect(depthMap, tc2).rg, texture2DRect(depthMap, tc3).rg));
 +    vec3 depth3 = vec4(texture2DRect(depthMap, tc4).rg, texture2DRect(depthMap, tc5).rg));
 +    vec3 depth4 = vec4(texture2DRect(depthMap, tc6).rg, texture2DRect(depthMap, tc7).rg));
 +
 +    depth1 = min(depth1, depth2);
 +    depth1 = min(depth1, depth3);
 +    depth1 = min(depth1, depth4);
 +
 +    vec2 depth = min(depth1.xy, depth1.zw);
 +
 +    int side = sqrt(gl_VerticesIn);
 +
 +    for (int j = 0; j < side; j++)
 +    {
 +        for (int k = 0; k < side; ++k)
 +        {
 +            vec3 pos = gl_PositionIn[(j * side) + k].xyz;
 +            vec4 v = shadowMatrix[i] * vec4(pos, 1.0);
 +            gl_Position = v;
 +            to_vec = pos - light_position.xyz * depth;
 +            EmitVertex();
 +        }
 +
 +        EndPrimitive();
 +    }
 +
 +    vec3 norms[3]; // Normals
 +    vec3 lightdir3]; // Directions toward light
 +
 +    vec4 v[4]; // Temporary vertices
 +
 +    vec4 or_pos[3] =
 +    {  // Triangle oriented toward light source
 +        gl_PositionIn[0],
 +        gl_PositionIn[2],
 +        gl_PositionIn[4]
 +    };
 +
 +    // Compute normal at each vertex.
 +    cross_products(n, 0, 2, 4);
 +
 +    // Compute direction from vertices to light.
 +    lightdir[0] = getLightDirection(lightpos, gl_PositionIn[0].xyz);
 +    lightdir[1] = getLightDirection(lightpos, gl_PositionIn[2].xyz);
 +    lightdir[2] = getLightDirection(lightpos, gl_PositionIn[4].xyz);
 +
 +    // Check if the main triangle faces the light.
 +    bool faces_light = true;
 +    if (!(dot(ns[0],d[0]) > 0
 +         |dot(ns[1],d[1]) > 0
 +         |dot(ns[2],d[2]) > 0))
 +    {
 +        // Flip vertex winding order in or_pos.
 +        or_pos[1] = gl_PositionIn[4];
 +        or_pos[2] = gl_PositionIn[2];
 +        faces_light = false;
 +    }
 +
 +    // Near cap: simply render triangle.
 +    emitTri(or_pos);
 +
 +    // Far cap: extrude positions to infinity.
 +    v[0] =vec4(lightpos.w * or_pos[0].xyz - lightpos.xyz,0);
 +    v[1] =vec4(lightpos.w * or_pos[2].xyz - lightpos.xyz,0);
 +    v[2] =vec4(lightpos.w * or_pos[1].xyz - lightpos.xyz,0);
 +
 +    emitTri(v);
 +
 +    // Loop over all edges and extrude if needed.
 +    for ( int i=0; i<3; i++ ) 
 +    {
 +       // Compute indices of neighbor triangle.
 +       int v0 = i*2;
 +       int nb = (i*2+1);
 +       int v1 = (i*2+2) % 6;
 +       cross_products(n, v0, nb, v1);
 +
 +       // Compute direction to light, again as above.
 +       d[0] =lightpos.xyz-lightpos.w*gl_PositionIn[v0].xyz;
 +       d[1] =lightpos.xyz-lightpos.w*gl_PositionIn[nb].xyz;
 +       d[2] =lightpos.xyz-lightpos.w*gl_PositionIn[v1].xyz;
 +
 +       bool is_parallel = gl_PositionIn[nb].w < 1e-5;
 +
 +       // Extrude the edge if it does not have a
 +       // neighbor, or if it's a possible silhouette.
 +       if (is_parallel ||
 +          ( faces_light != (dot(ns[0],d[0])>0 ||
 +                            dot(ns[1],d[1])>0 ||
 +                            dot(ns[2],d[2])>0) ))
 +       {
 +           // Make sure sides are oriented correctly.
 +           int i0 = faces_light ? v0 : v1;
 +           int i1 = faces_light ? v1 : v0;
 +
 +           v[0] = gl_PositionIn[i0];
 +           v[1] = vec4(lightpos.w*gl_PositionIn[i0].xyz - lightpos.xyz, 0);
 +           v[2] = gl_PositionIn[i1];
 +           v[3] = vec4(lightpos.w*gl_PositionIn[i1].xyz - lightpos.xyz, 0);
 +
 +           emitQuad(v);
 +       }
 +    }
 +}
 +
 +void main()
 +{
 +    // Output
 +    emitPrimitives(0);
 +}
 diff --git a/indra/newview/app_settings/shaders/class3/deferred/gatherSkyShF.glsl b/indra/newview/app_settings/shaders/class3/deferred/gatherSkyShF.glsl new file mode 100644 index 0000000000..34d26cddea --- /dev/null +++ b/indra/newview/app_settings/shaders/class3/deferred/gatherSkyShF.glsl @@ -0,0 +1,70 @@ +/**  + * @file class3/deferred/gatherSkyShF.glsl + * + * $LicenseInfo:firstyear=2005&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2005, 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$ + */ +  +#ifdef DEFINE_GL_FRAGCOLOR +out vec4 frag_data[3]; +#else +#define frag_data gl_FragData +#endif + +VARYING vec2 vary_frag; + +uniform vec2 screen_res; +uniform sampler2D sh_input_r; +uniform sampler2D sh_input_g; +uniform sampler2D sh_input_b; + +void main() +{ +    vec2 offset	  = vec2(2.0) / screen_res; + +    vec4 r = vec4(0); +    vec4 g = vec4(0); +    vec4 b = vec4(0); + +    vec2 tc = vary_frag * 2.0; + +	r += texture2D(sh_input_r, tc + vec2(0,        0)); +	r += texture2D(sh_input_r, tc + vec2(offset.x, 0)); +	r += texture2D(sh_input_r, tc + vec2(0,        offset.y)); +	r += texture2D(sh_input_r, tc + vec2(offset.x, offset.y)); +    r /= 4.0f; + +	g += texture2D(sh_input_g, tc + vec2(0,        0)); +	g += texture2D(sh_input_g, tc + vec2(offset.x, 0)); +	g += texture2D(sh_input_g, tc + vec2(0,        offset.y)); +	g += texture2D(sh_input_g, tc + vec2(offset.x, offset.y)); +    g /= 4.0f; + +	b += texture2D(sh_input_b, tc + vec2(0,        0)); +	b += texture2D(sh_input_b, tc + vec2(offset.x, 0)); +	b += texture2D(sh_input_b, tc + vec2(0,        offset.y)); +	b += texture2D(sh_input_b, tc + vec2(offset.x, offset.y)); +    b /= 4.0f; + +    frag_data[0] = r; +    frag_data[1] = g; +    frag_data[2] = b; +} diff --git a/indra/newview/app_settings/shaders/class3/deferred/gatherSkyShV.glsl b/indra/newview/app_settings/shaders/class3/deferred/gatherSkyShV.glsl new file mode 100644 index 0000000000..337c8a50fe --- /dev/null +++ b/indra/newview/app_settings/shaders/class3/deferred/gatherSkyShV.glsl @@ -0,0 +1,40 @@ +/**  + * @file gatherSkyShV.glsl + * + * $LicenseInfo:firstyear=2005&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2005, 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$ + */ +  +ATTRIBUTE vec3 position; +ATTRIBUTE vec2 texcoord0; + +VARYING vec2 vary_frag; +uniform vec2 screen_res; + +void main() +{ +    // pass through untransformed fullscreen pos +    float oo_divisor = screen_res.x / 64.0; +    vec3 pos = (position.xyz * oo_divisor) + vec3(oo_divisor - 1, oo_divisor - 1, 0); +	gl_Position = vec4(pos.xyz, 1.0); +    vary_frag = texcoord0 * oo_divisor; +} + diff --git a/indra/newview/app_settings/shaders/class3/deferred/genSkyShF.glsl b/indra/newview/app_settings/shaders/class3/deferred/genSkyShF.glsl new file mode 100644 index 0000000000..c02e6d1e57 --- /dev/null +++ b/indra/newview/app_settings/shaders/class3/deferred/genSkyShF.glsl @@ -0,0 +1,112 @@ +/**  + * @file class3/deferred/genSkyShF.glsl + * + * $LicenseInfo:firstyear=2005&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2005, 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$ + */ +  +#ifdef DEFINE_GL_FRAGCOLOR +out vec4 frag_data[3]; +#else +#define frag_data gl_FragData +#endif + +VARYING vec2 vary_frag; + +uniform vec3 sun_dir; + +uniform sampler2D transmittance_texture; +uniform sampler3D scattering_texture; +uniform sampler3D single_mie_scattering_texture; +uniform sampler2D irradiance_texture; +uniform vec4 gamma; + +vec3 GetSkyLuminance(vec3 camPos, vec3 view_dir, float shadow_length, vec3 dir, out vec3 transmittance); + +vec3 calcDirection(vec2 tc) +{ +     float phi = tc.y * 2.0 * 3.14159265; +     float cosTheta = sqrt(1.0 - tc.x); +     float sinTheta = sqrt(1.0 - cosTheta * cosTheta); +     return vec3(cos(phi) * sinTheta, sin(phi) * sinTheta, cosTheta); +} + +// reverse mapping above to convert a hemisphere direction into phi/theta values +void getPhiAndThetaFromDirection(vec3 dir, out float phi, out float theta) +{ +     float sin_theta; +     float cos_theta; +     cos_theta = dir.z; +     theta     = acos(cos_theta); +     sin_theta = sin(theta); +     phi       = abs(sin_theta) > 0.0001 ? acos(dir.x / sin_theta) : 1.0; +} + +// reverse mapping above to convert a hemisphere direction into an SH texture sample pos +vec2 calcShUvFromDirection(vec3 dir) +{ +    vec2 uv; +    float phi; +    float theta; +    getPhiAndThetaFromDirection(dir, phi, theta); +    uv.y = phi   / 2.0 * 3.14159265; +    uv.x = theta / 2.0 * 3.14159265; +    return uv; +} + +void projectToL1(vec3 n, vec3 c, vec4 basis, out vec4 coeffs[3]) +{ +    coeffs[0] = vec4(basis.x, n * basis.yzw * c.r); +    coeffs[1] = vec4(basis.x, n * basis.yzw * c.g); +    coeffs[2] = vec4(basis.x, n * basis.yzw * c.b); +} + +void main() +{ +    float Y00 = sqrt(1.0 / 3.14159265) * 0.5; +    float Y1x = sqrt(3.0 / 3.14159265) * 0.5; +    float Y1y = Y1x; +    float Y1z = Y1x; + +    vec4 L1 = vec4(Y00, Y1x, Y1y, Y1z); + +    vec3 view_direction = calcDirection(vary_frag); +    vec3 sun_direction  = normalize(sun_dir); +    vec3 cam_pos        = vec3(0, 0, 6360); + +    vec3 transmittance; +    vec3 radiance = GetSkyLuminance(cam_pos, view_direction, 0.0f, sun_direction, transmittance); + +    vec3 color = vec3(1.0) - exp(-radiance * 0.0001); + +    color = pow(color, vec3(1.0/2.2)); + +    vec4 coeffs[3]; +    coeffs[0] = vec4(0); +    coeffs[1] = vec4(0); +    coeffs[2] = vec4(0); + +    projectToL1(view_direction, color.rgb, L1, coeffs); + +    frag_data[0] = coeffs[0]; +    frag_data[1] = coeffs[1]; +    frag_data[2] = coeffs[2]; +} diff --git a/indra/newview/app_settings/shaders/class3/deferred/genSkyShV.glsl b/indra/newview/app_settings/shaders/class3/deferred/genSkyShV.glsl new file mode 100644 index 0000000000..b466883dc7 --- /dev/null +++ b/indra/newview/app_settings/shaders/class3/deferred/genSkyShV.glsl @@ -0,0 +1,37 @@ +/**  + * @file genSkyShV.glsl + * + * $LicenseInfo:firstyear=2005&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2005, 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$ + */ +  +ATTRIBUTE vec3 position; +ATTRIBUTE vec2 texcoord0; + +VARYING vec2 vary_frag; + +void main() +{ +    // pass through untransformed fullscreen pos +	gl_Position = vec4(position.xyz, 1.0); +    vary_frag = texcoord0; +} + diff --git a/indra/newview/app_settings/shaders/class3/deferred/indirect.glsl b/indra/newview/app_settings/shaders/class3/deferred/indirect.glsl new file mode 100644 index 0000000000..33c5667cae --- /dev/null +++ b/indra/newview/app_settings/shaders/class3/deferred/indirect.glsl @@ -0,0 +1,44 @@ +/**  + * @file class3/deferred/indirect.glsl + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, 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$ + */ + +/*[EXTRA_CODE_HERE]*/ + +uniform sampler2D sh_input_r; +uniform sampler2D sh_input_g; +uniform sampler2D sh_input_b; + +vec3 GetIndirect(vec3 norm) +{ +    vec4 l1tap = vec4(1.0/sqrt(4*3.14159265), sqrt(3)/sqrt(4*3.14159265), sqrt(3)/sqrt(4*3.14159265), sqrt(3)/sqrt(4*3.14159265)); +    vec4 l1r = texture2D(sh_input_r, vec2(0,0)); +    vec4 l1g = texture2D(sh_input_g, vec2(0,0)); +    vec4 l1b = texture2D(sh_input_b, vec2(0,0)); +    vec3 indirect = vec3(dot(l1r, l1tap * vec4(1, norm.xyz)), +                         dot(l1g, l1tap * vec4(1, norm.xyz)), +                         dot(l1b, l1tap * vec4(1, norm.xyz))); +    indirect = clamp(indirect, vec3(0), vec3(1.0)); +    return indirect; +} + diff --git a/indra/newview/app_settings/shaders/class3/deferred/lightUtil.glsl b/indra/newview/app_settings/shaders/class3/deferred/lightUtil.glsl new file mode 100644 index 0000000000..8bb3f07fc6 --- /dev/null +++ b/indra/newview/app_settings/shaders/class3/deferred/lightUtil.glsl @@ -0,0 +1,117 @@ +/**  + * @file lightInfo.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$ + */ + +struct DirectionalLightInfo +{ +    vec4 pos; +    float depth; +    vec4 normal; +    vec3 normalizedLightDirection; +    vec3 normalizedToLight; +    float lightIntensity; +    vec3 lightDiffuseColor; +    float specExponent; +    float shadow; +}; + +struct SpotLightInfo +{ +    vec4 pos; +    float depth; +    vec4 normal; +    vec3 normalizedLightDirection; +    vec3 normalizedToLight; +    float lightIntensity; +    float attenuation; +    float distanceToLight; +    vec3 lightDiffuseColor; +    float innerHalfAngleCos; +    float outerHalfAngleCos; +    float spotExponent; +    float specExponent; +    float shadow; +}; + +struct PointLightInfo +{ +    vec4 pos; +    float depth; +    vec4 normal; +    vec3 normalizedToLight; +    float lightIntensity; +    float attenuation; +    float distanceToLight; +    vec3 lightDiffuseColor; +    float lightRadius; +    float specExponent; +    vec3 worldspaceLightDirection; +    float shadow; +}; + +float attenuate(float attenuationSelection, float distanceToLight) +{ +// LLRENDER_REVIEW +// sh/could eventually consume attenuation func defined in texture +    return (attenuationSelection == 0.0f) ? 1.0f : // none +           (attenuationSelection <  1.0f) ? (1.0f / distanceToLight) : // linear atten  +           (attenuationSelection <  2.0f) ? (1.0f / (distanceToLight*distanceToLight)) // quadratic atten +										  : (1.0f / (distanceToLight*distanceToLight*distanceToLight));	// cubic atten     +} + + +vec3 lightDirectional(struct DirectionalLightInfo dli) +{ +    float lightIntensity = dli.lightIntensity; +	lightIntensity *= dot(dli.normal.xyz, dli.normalizedLightDirection); +    //lightIntensity *= directionalShadowSample(vec4(dli.pos.xyz, 1.0f), dli.depth, dli.directionalShadowMap, dli.directionalShadowMatrix); +	return lightIntensity * dli.lightDiffuseColor; +} + + +vec3 lightSpot(struct SpotLightInfo sli)     +{ +	float penumbraRange = (sli.outerHalfAngleCos - sli.innerHalfAngleCos); +    float coneAngleCos = max(dot(sli.normalizedLightDirection, sli.normalizedToLight), 0.0); +	float coneAttenFactor = (coneAngleCos <= sli.outerHalfAngleCos) ? 1.0f : pow(smoothstep(1,0, sli.outerHalfAngleCos / penumbraRange), sli.spotExponent); +    float distanceAttenuation = attenuate(sli.attenuation, sli.distanceToLight); +    float lightIntensity = sli.lightIntensity; +    lightIntensity *= distanceAttenuation; +	lightIntensity *= max(dot(sli.normal.xyz, sli.normalizedLightDirection), 0.0); +	lightIntensity *= coneAttenFactor; +    lightIntensity *= sli.shadow; +	return lightIntensity * sli.lightDiffuseColor; +} + +vec3 lightPoint(struct PointLightInfo pli) +{ +    float padRadius = pli.lightRadius * 0.1; // distance for which to perform smoothed dropoff past light radius +	float distanceAttenuation =	attenuate(pli.attenuation, pli.distanceToLight); +    float lightIntensity = pli.lightIntensity; +    lightIntensity*= distanceAttenuation;     +	lightIntensity *= clamp((padRadius - pli.distanceToLight + pli.lightRadius) / padRadius, 0.0, 1.0); +    lightIntensity *= pli.shadow; +    lightIntensity *= max(dot(pli.normal.xyz, pli.normalizedToLight), 0.0); +	return lightIntensity * pli.lightDiffuseColor; +} diff --git a/indra/newview/app_settings/shaders/class3/deferred/pointShadowBlurF.glsl b/indra/newview/app_settings/shaders/class3/deferred/pointShadowBlurF.glsl new file mode 100644 index 0000000000..ca9ce3a2e1 --- /dev/null +++ b/indra/newview/app_settings/shaders/class3/deferred/pointShadowBlurF.glsl @@ -0,0 +1,37 @@ +/**  + * @file pointShadowBlur.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 samplerCube cube_map;  + +in vec3 to_vec; + +out vec4 fragColor; + +void main()  +{ +	vec4 vcol = texture(cube_map, to_vec); +	fragColor = vec4(vcol.rgb, 1.0); +} + diff --git a/indra/newview/app_settings/shaders/class3/deferred/shVisF.glsl b/indra/newview/app_settings/shaders/class3/deferred/shVisF.glsl new file mode 100644 index 0000000000..c8991f7a18 --- /dev/null +++ b/indra/newview/app_settings/shaders/class3/deferred/shVisF.glsl @@ -0,0 +1,73 @@ +/**  + * @file class3/deferred/shVisF.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$ + */ + +#ifdef DEFINE_GL_FRAGCOLOR +    out vec4 frag_color; +#else +    #define frag_color gl_FragColor +#endif + +///////////////////////////////////////////////////////////////////////// +// Fragment shader for L1 SH debug rendering +///////////////////////////////////////////////////////////////////////// + +uniform sampler2D sh_input_r; +uniform sampler2D sh_input_g; +uniform sampler2D sh_input_b; + +uniform mat3 inv_modelviewprojection; + +VARYING vec4 vary_pos; + +void main(void)  +{ +    vec2 coord = vary_pos.xy + vec2(0.5,0.5); + +    coord.x *= (1.6/0.9); + +    if (dot(coord, coord) > 0.25) +    { +        discard; +    } + +    vec4 n = vec4(coord*2.0, 0.0, 1); +    //n.y = -n.y; +    n.z = sqrt(max(1.0-n.x*n.x-n.y*n.y, 0.0)); +    //n.xyz = inv_modelviewprojection * n.xyz; + +    vec4 l1tap = vec4(1.0/sqrt(4*3.14159265), sqrt(3)/sqrt(4*3.14159265), sqrt(3)/sqrt(4*3.14159265), sqrt(3)/sqrt(4*3.14159265)); +    vec4 l1r = texture2D(sh_input_r, vec2(0,0)); +    vec4 l1g = texture2D(sh_input_g, vec2(0,0)); +    vec4 l1b = texture2D(sh_input_b, vec2(0,0)); +    vec3 indirect = vec3( +                      dot(l1r, l1tap * n), +                      dot(l1g, l1tap * n), +                      dot(l1b, l1tap * n)); + +    //indirect = pow(indirect, vec3(0.45)); +    indirect *= 3.0; + +	frag_color = vec4(indirect, 1.0); +} diff --git a/indra/newview/app_settings/shaders/class3/deferred/shVisV.glsl b/indra/newview/app_settings/shaders/class3/deferred/shVisV.glsl new file mode 100644 index 0000000000..8f32dfde79 --- /dev/null +++ b/indra/newview/app_settings/shaders/class3/deferred/shVisV.glsl @@ -0,0 +1,33 @@ +/**  + * @file class3/deferred/shVisV.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$ + */ +ATTRIBUTE vec3 position; +VARYING vec4 vary_pos; + +void main() +{ +    // Output +    vary_pos = vec4(position, 1); +    gl_Position = vary_pos; +} diff --git a/indra/newview/app_settings/shaders/class3/deferred/shadowAlphaBlendF.glsl b/indra/newview/app_settings/shaders/class3/deferred/shadowAlphaBlendF.glsl new file mode 100644 index 0000000000..01599d81c4 --- /dev/null +++ b/indra/newview/app_settings/shaders/class3/deferred/shadowAlphaBlendF.glsl @@ -0,0 +1,58 @@ +/**  + * @file shadowAlphaMaskF.glsl + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, 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$ + */ + +/*[EXTRA_CODE_HERE]*/ + +#ifdef DEFINE_GL_FRAGCOLOR +out vec4 frag_color; +#else +#define frag_color gl_FragColor +#endif + +uniform sampler2D diffuseMap; + +#if !DEPTH_CLAMP +VARYING float pos_zd2; +#endif + +VARYING float pos_w; + +VARYING float target_pos_x; +VARYING vec4 vertex_color; +VARYING vec2 vary_texcoord0; +VARYING vec3 pos; + +vec4 computeMoments(float depth, float a); + +void main()  +{ +	float alpha = diffuseLookup(vary_texcoord0.xy).a * vertex_color.a; + +    frag_color = computeMoments(length(pos), float a); + +#if !DEPTH_CLAMP +	gl_FragDepth = max(pos_zd2/pos_w+0.5, 0.0); +#endif +} diff --git a/indra/newview/app_settings/shaders/class3/deferred/shadowAlphaBlendV.glsl b/indra/newview/app_settings/shaders/class3/deferred/shadowAlphaBlendV.glsl new file mode 100644 index 0000000000..3fb2bafca4 --- /dev/null +++ b/indra/newview/app_settings/shaders/class3/deferred/shadowAlphaBlendV.glsl @@ -0,0 +1,66 @@ +/**  + * @file shadowAlphaMaskV.glsl + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, 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 texture_matrix0; +uniform mat4 modelview_projection_matrix; +uniform float shadow_target_width; + +ATTRIBUTE vec3 position; +ATTRIBUTE vec4 diffuse_color; +ATTRIBUTE vec2 texcoord0; + +#if !DEPTH_CLAMP +VARYING float pos_zd2; +#endif + +VARYING float target_pos_x; +VARYING vec4 pos; +VARYING vec4 vertex_color; +VARYING vec2 vary_texcoord0; + +void passTextureIndex(); + +void main() +{ +	//transform vertex +	vec4 pre_pos = vec4(position.xyz, 1.0); +	vec4 pos = modelview_projection_matrix * pre_pos; +	target_pos_x = 0.5 * (shadow_target_width - 1.0) * pos.x; + +	pos_w = pos.w; + +#if !DEPTH_CLAMP +	pos_zd2 = pos.z * 0.5; +	 +	gl_Position = vec4(pos.x, pos.y, pos.w*0.5, pos.w); +#else +	gl_Position = pos; +#endif +	 +	passTextureIndex(); + +	vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy; +	vertex_color = diffuse_color; +} diff --git a/indra/newview/app_settings/shaders/class3/deferred/shadowAlphaMaskF.glsl b/indra/newview/app_settings/shaders/class3/deferred/shadowAlphaMaskF.glsl new file mode 100644 index 0000000000..d6ed5b6bb0 --- /dev/null +++ b/indra/newview/app_settings/shaders/class3/deferred/shadowAlphaMaskF.glsl @@ -0,0 +1,74 @@ +/**  + * @file class3/deferred/shadowAlphaMaskF.glsl + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, 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$ + */ + +/*[EXTRA_CODE_HERE]*/ + +#ifdef DEFINE_GL_FRAGCOLOR +out vec4 frag_color; +#else +#define frag_color gl_FragColor +#endif + +uniform sampler2D diffuseMap; + +#if !DEPTH_CLAMP +VARYING float pos_zd2; +#endif + +VARYING float pos_w; + +VARYING float target_pos_x; +VARYING vec4 vertex_color; +VARYING vec2 vary_texcoord0; + +vec4 getPosition(vec2 screen_coord); +vec4 computeMoments(float depth, float a); + +void main()  +{ +    vec4 pos = getPosition(vary_texcoord0.xy); + +    float alpha = diffuseLookup(vary_texcoord0.xy).a * vertex_color.a; + +    if (alpha < 0.05) // treat as totally transparent +    { +        discard; +    } + +    if (alpha < 0.88) // treat as semi-transparent +    { +        if (fract(0.5*floor(target_pos_x / pos_w )) < 0.25) +        { +            discard; +        } +    } + +    frag_color = computeMoments(length(pos.xyz), alpha); +     +#if !DEPTH_CLAMP +    gl_FragDepth = max(pos_zd2/pos_w+0.5, 0.0); +#endif + +} diff --git a/indra/newview/app_settings/shaders/class3/deferred/shadowAlphaMaskV.glsl b/indra/newview/app_settings/shaders/class3/deferred/shadowAlphaMaskV.glsl new file mode 100644 index 0000000000..bc7fe003f2 --- /dev/null +++ b/indra/newview/app_settings/shaders/class3/deferred/shadowAlphaMaskV.glsl @@ -0,0 +1,67 @@ +/**  + * @file class3/deferred/shadowAlphaMaskV.glsl + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, 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 texture_matrix0; +uniform mat4 modelview_projection_matrix; +uniform float shadow_target_width; + +ATTRIBUTE vec3 position; +ATTRIBUTE vec4 diffuse_color; +ATTRIBUTE vec2 texcoord0; + +#if !DEPTH_CLAMP +VARYING float pos_zd2; +#endif + +VARYING vec4 pos; +VARYING float target_pos_x; +VARYING vec4 vertex_color; +VARYING vec2 vary_texcoord0; + +void passTextureIndex(); + +void main() +{ +	//transform vertex +	vec4 pre_pos = vec4(position.xyz, 1.0); + +	pos = modelview_projection_matrix * pre_pos; + +	target_pos_x = 0.5 * (shadow_target_width - 1.0) * pos.x; + +#if !DEPTH_CLAMP +	pos_zd2 = pos.z * 0.5; +	 +	gl_Position = vec4(pos.x, pos.y, pos.w*0.5, pos.w); +#else +	gl_Position = pos; +#endif +	 +	passTextureIndex(); + +	vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy; + +	vertex_color = diffuse_color; +} diff --git a/indra/newview/app_settings/shaders/class3/deferred/shadowCubeV.glsl b/indra/newview/app_settings/shaders/class3/deferred/shadowCubeV.glsl new file mode 100644 index 0000000000..923de09ada --- /dev/null +++ b/indra/newview/app_settings/shaders/class3/deferred/shadowCubeV.glsl @@ -0,0 +1,50 @@ +/**  + * @file class3/deferred/shadowCubeV.glsl + * + * $LicenseInfo:firstyear=2011&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; + +#if !DEPTH_CLAMP +VARYING vec4 post_pos; +#endif + +uniform vec3 box_center; +uniform vec3 box_size; + +void main() +{ +	//transform vertex +	vec3 p = position*box_size+box_center; +	vec4 pos = modelview_projection_matrix*vec4(p.xyz, 1.0); + +#if !DEPTH_CLAMP +	post_pos = pos; + +	gl_Position = vec4(pos.x, pos.y, pos.w*0.5, pos.w); +#else +	gl_Position = pos; +#endif +} diff --git a/indra/newview/app_settings/shaders/class3/deferred/shadowF.glsl b/indra/newview/app_settings/shaders/class3/deferred/shadowF.glsl new file mode 100644 index 0000000000..5a6c8728c0 --- /dev/null +++ b/indra/newview/app_settings/shaders/class3/deferred/shadowF.glsl @@ -0,0 +1,49 @@ +/**  + * @file class3/deferred/shadowF.glsl + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, 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$ + */ + +/*[EXTRA_CODE_HERE]*/ + +#ifdef DEFINE_GL_FRAGCOLOR +out vec4 frag_color; +#else +#define frag_color gl_FragColor +#endif + +uniform sampler2D diffuseMap; + +#if !DEPTH_CLAMP +VARYING float pos_zd2; +#endif + +VARYING vec4 pos; +VARYING float target_pos_x; + +vec4 computeMoments(float depth, float a); + +void main()  +{ +    frag_color = computeMoments(length(pos), 1.0); +} + diff --git a/indra/newview/app_settings/shaders/class3/deferred/shadowUtil.glsl b/indra/newview/app_settings/shaders/class3/deferred/shadowUtil.glsl new file mode 100644 index 0000000000..2f69a353e8 --- /dev/null +++ b/indra/newview/app_settings/shaders/class3/deferred/shadowUtil.glsl @@ -0,0 +1,157 @@ +/**  + * @file class3/deferred/shadowUtil.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 sampler2D       shadowMap0; +uniform sampler2D       shadowMap1; +uniform sampler2D       shadowMap2; +uniform sampler2D       shadowMap3; +uniform sampler2D       shadowMap4; +uniform sampler2D       shadowMap5; + +uniform vec3 sun_dir; +uniform vec3 moon_dir; +uniform vec2 shadow_res; +uniform vec2 proj_shadow_res; +uniform mat4 shadow_matrix[6]; +uniform vec4 shadow_clip; +uniform float shadow_bias; + +uniform float spot_shadow_bias; +uniform float spot_shadow_offset; + +float getDepth(vec2 screenpos); +vec3 getNorm(vec2 screenpos); +vec4 getPosition(vec2 pos_screen); + +float ReduceLightBleeding(float p_max, float Amount) +{ +    return smoothstep(Amount, 1, p_max); +} + +float ChebyshevUpperBound(vec2 m, float t, float min_v, float Amount) +{ +    float p = (t <= m.x) ? 1.0 : 0.0; + +    float v = m.y - (m.x*m.x); +    v = max(v, min_v); + +    float d = t - m.x; + +    float p_max = v / (v + d*d); + +    p_max = ReduceLightBleeding(p_max, Amount); + +    return max(p, p_max); +} + +vec4 computeMoments(float depth, float a) +{ +    float m1 = depth; +    float dx = dFdx(depth); +    float dy = dFdy(depth); +    float m2 = m1*m1 + 0.25 * a * (dx*dx + dy*dy); +    return vec4(m1, m2, a, max(dx, dy)); +} + +float vsmDirectionalSample(vec4 stc, float depth, sampler2D shadowMap, mat4 shadowMatrix) +{ +    vec4 lpos = shadowMatrix * stc; +    vec4 moments = texture2D(shadowMap, lpos.xy); +    return ChebyshevUpperBound(moments.rg, depth - shadow_bias * 256.0f, 0.125, 0.9); +} + +float vsmSpotSample(vec4 stc, float depth, sampler2D shadowMap, mat4 shadowMatrix) +{ +    vec4 lpos = shadowMatrix * stc; +    vec4 moments = texture2D(shadowMap, lpos.xy); +    lpos.xyz /= lpos.w; +    lpos.xy *= 0.5; +    lpos.xy += 0.5; +    return ChebyshevUpperBound(moments.rg, depth - spot_shadow_bias * 16.0f, 0.125, 0.9); +} + +#if VSM_POINT_SHADOWS +float vsmPointSample(float lightDistance, vec3 lightDirection, samplerCube shadow_cube_map) +{ +    vec4 moments = textureCube(shadow_cube_map, light_direction); +    return ChebyshevUpperBound(moments.rg, light_distance, 0.01, 0.25); +} +#endif + +float sampleDirectionalShadow(vec3 pos, vec3 norm, vec2 pos_screen) +{ +	if (pos.z < -shadow_clip.w) +    { +        discard; +    } + +    float depth = getDepth(pos_screen); + +    vec4 spos       = vec4(pos,1.0); +    vec4 near_split = shadow_clip*-0.75; +    vec4 far_split  = shadow_clip*-1.25; + +    float shadow = 0.0f; +    float weight = 1.0; + +    if (spos.z < near_split.z) +    { +        shadow += vsmDirectionalSample(spos, depth, shadowMap3, shadow_matrix[3]); +        weight += 1.0f; +    } +    if (spos.z < near_split.y) +    { +        shadow += vsmDirectionalSample(spos, depth, shadowMap2, shadow_matrix[2]); +        weight += 1.0f; +    } +    if (spos.z < near_split.x) +    { +        shadow += vsmDirectionalSample(spos, depth, shadowMap1, shadow_matrix[1]); +        weight += 1.0f; +    } +    if (spos.z > far_split.x) +    { +        shadow += vsmDirectionalSample(spos, depth, shadowMap0, shadow_matrix[0]); +        weight += 1.0f; +    } + +    shadow /= weight; + +    return shadow; +} + +float sampleSpotShadow(vec3 pos, vec3 norm, int index, vec2 pos_screen) +{ +	if (pos.z < -shadow_clip.w) +    { +        discard; +    } + +    float depth = getDepth(pos_screen); + +    pos += norm * spot_shadow_offset; +    return vsmSpotSample(vec4(pos, 1.0), depth, (index == 0) ? shadowMap4 : shadowMap5, shadow_matrix[4 + index]); +} + diff --git a/indra/newview/app_settings/shaders/class3/deferred/shadowV.glsl b/indra/newview/app_settings/shaders/class3/deferred/shadowV.glsl new file mode 100644 index 0000000000..9a5edaf091 --- /dev/null +++ b/indra/newview/app_settings/shaders/class3/deferred/shadowV.glsl @@ -0,0 +1,62 @@ +/**  + * @file class3/deferred/shadowV.glsl + * + * $LicenseInfo:firstyear=2011&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2011, 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; +uniform float shadow_target_width; +uniform mat4 texture_matrix0; + +ATTRIBUTE vec3 position; +ATTRIBUTE vec2 texcoord0; + +#if !DEPTH_CLAMP +VARYING float pos_zd2; +#endif + +VARYING vec4 pos; +VARYING float target_pos_x; +VARYING vec4 vertex_color; +VARYING vec2 vary_texcoord0; + +void passTextureIndex(); + +void main() +{ +	//transform vertex +	vec4 pre_pos = vec4(position.xyz, 1.0); + +	pos = modelview_projection_matrix * pre_pos; + +	target_pos_x = 0.5 * (shadow_target_width - 1.0) * pos.x; + +#if !DEPTH_CLAMP +	pos_zd2 = pos.z * 0.5; +	 +	gl_Position = vec4(pos.x, pos.y, pos.w*0.5, pos.w); +#else +	gl_Position = pos; +#endif +	 +	vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy; +} diff --git a/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl index ecf6858136..9411e905d3 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl @@ -40,15 +40,13 @@ uniform sampler2DRect lightMap;  uniform sampler2DRect depthMap;  uniform sampler2D     lightFunc; -uniform float blur_size;  uniform samplerCube environmentMap; - +uniform float blur_size;  uniform float blur_fidelity;  // Inputs  uniform vec4 morphFactor;  uniform vec3 camPosLocal; -uniform vec4 gamma;  uniform float cloud_shadow;  uniform float max_y;  uniform vec4 glow; @@ -78,12 +76,7 @@ vec3 GetSunAndSkyIrradiance(vec3 camPos, vec3 norm, vec3 dir, out vec3 sky_irrad  vec3 GetSkyLuminance(vec3 camPos, vec3 view_dir, float shadow_length, vec3 dir, out vec3 transmittance);  vec3 GetSkyLuminanceToPoint(vec3 camPos, vec3 pos, float shadow_length, vec3 dir, out vec3 transmittance); -vec3 scaleSoftClipFrag(vec3 c); -vec3 fullbrightScaleSoftClipFrag(vec3 c); -vec3 srgb_to_linear(vec3 cs); -vec3 linear_to_srgb(vec3 cl); -vec3 decode_normal (vec2 enc); - +vec3 decode_normal(vec2 xy);  vec3 ColorFromRadiance(vec3 radiance);  vec4 getPositionWithDepth(vec2 pos_screen, float depth);  vec4 getPosition(vec2 pos_screen); @@ -95,32 +88,31 @@ vec4 applyWaterFogView(vec3 pos, vec4 color);  void main()   { -	vec2 tc = vary_fragcoord.xy; -	float depth = texture2DRect(depthMap, tc.xy).r; -	vec3 pos = getPositionWithDepth(tc, depth).xyz; -	vec4 norm = texture2DRect(normalMap, tc); -	float envIntensity = norm.z; +    vec2 tc = vary_fragcoord.xy; +    float depth = texture2DRect(depthMap, tc.xy).r; +    vec3 pos = getPositionWithDepth(tc, depth).xyz; +    vec4 norm = texture2DRect(normalMap, tc); +    float envIntensity = norm.z;      norm.xyz = decode_normal(norm.xy); -	float da = max(dot(norm.xyz, sun_dir.xyz), 0.0); - -	float light_gamma = 1.0/1.3; +    float da = max(dot(norm.xyz, sun_dir.xyz), 0.0); +              da = pow(da, global_gamma + 0.3); -	vec4 diffuse = texture2DRect(diffuseRect, tc); // linear +    vec4 diffuse = texture2DRect(diffuseRect, tc); // linear -	vec3 col; -	float bloom = 0.0; -	{ +    vec3 col; +    float bloom = 0.0; +    {          vec3 camPos = (camPosLocal / 1000.0f) + vec3(0, 0, 6360.0f); -		vec4 spec = texture2DRect(specularRect, vary_fragcoord.xy); -		 -		vec2 scol_ambocc = texture2DRect(lightMap, vary_fragcoord.xy).rg; -		scol_ambocc = pow(scol_ambocc, vec2(light_gamma)); +        vec4 spec = texture2DRect(specularRect, vary_fragcoord.xy); +         +        vec2 scol_ambocc = texture2DRect(lightMap, vary_fragcoord.xy).rg; +//        scol_ambocc = pow(scol_ambocc, vec3(global_gamma + 0.3)); -		float scol = max(scol_ambocc.r, diffuse.a);  +        float scol = max(scol_ambocc.r, diffuse.a);  -		float ambocc = scol_ambocc.g; +        float ambocc = scol_ambocc.g;          vec4 l1tap = vec4(1.0/sqrt(4*3.14159265), sqrt(3)/sqrt(4*3.14159265), sqrt(3)/sqrt(4*3.14159265), sqrt(3)/sqrt(4*3.14159265));          vec4 l1r = texture2D(sh_input_r, vec2(0,0)); @@ -145,46 +137,44 @@ void main()          col *= transmittance;          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 = scol * texture2D(lightFunc, vec2(sa, spec.a)).r * atmo_color; -			 -			// 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 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 = scol * texture2D(lightFunc, vec2(sa, spec.a)).r * atmo_color; +             +            // 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 sun_direction  = (inv_modelview * vec4(sun_dir, 1.0)).xyz;              vec3 radiance_sun  = GetSkyLuminance(camPos, env_vec, 0.0f, sun_direction, transmittance);              vec3 refcol = ColorFromRadiance(radiance_sun); -			col = mix(col.rgb, refcol, envIntensity); -		} -						 -		/*if (norm.w < 0.5) -		{ -			col = scaleSoftClipFrag(col); -		}*/ - -		#ifdef WATER_FOG -			vec4 fogged = applyWaterFogView(pos,vec4(col, bloom)); -			col = fogged.rgb; -			bloom = fogged.a; -		#endif - -        col = pow(col, vec3(light_gamma)); -	} -	 -	frag_color.rgb = col; -	frag_color.a = bloom; +            col = mix(col.rgb, refcol, envIntensity); +        } +                         +        /*if (norm.w < 0.5) +        { +            col = scaleSoftClipFrag(col); +        }*/ + +        #ifdef WATER_FOG +            vec4 fogged = applyWaterFogView(pos,vec4(col, bloom)); +            col = fogged.rgb; +            bloom = fogged.a; +        #endif +    } +     +    frag_color.rgb = col; +    frag_color.a = bloom;  } diff --git a/indra/newview/app_settings/shaders/class3/deferred/sunLightF.glsl b/indra/newview/app_settings/shaders/class3/deferred/sunLightF.glsl index 894534b105..e230ebb71c 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/sunLightF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/sunLightF.glsl @@ -1,5 +1,5 @@  /**  - * @file sunLightF.glsl + * @file class3\deferred\sunLightF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$   * Second Life Viewer Source Code @@ -35,197 +35,24 @@ out vec4 frag_color;  //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);  vec3 getNorm(vec2 pos_screen); -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; -} +float sampleDirectionalShadow(vec3 pos, vec3 norm, vec2 pos_screen);  +float sampleSpotShadow(vec3 pos, vec3 norm, int index, vec2 pos_screen);   void main()   {  	vec2 pos_screen = vary_fragcoord.xy;  	vec4 pos = getPosition(pos_screen);  	vec3 norm = getNorm(pos_screen); -		 -	/*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; +	frag_color.r = sampleDirectionalShadow(pos.xyz, norm, pos_screen); +	frag_color.g = 1.0f; +    frag_color.b = sampleSpotShadow(pos.xyz, norm, 0, pos_screen); +    frag_color.a = sampleSpotShadow(pos.xyz, norm, 1, pos_screen);  } diff --git a/indra/newview/app_settings/shaders/class3/deferred/sunLightSSAOF.glsl b/indra/newview/app_settings/shaders/class3/deferred/sunLightSSAOF.glsl index 0870a80a32..342a2ff3ed 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/sunLightSSAOF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/sunLightSSAOF.glsl @@ -1,5 +1,5 @@  /**  - * @file sunLightSSAOF.glsl + * @file class3\deferred\sunLightSSAOF.glsl   * $LicenseInfo:firstyear=2007&license=viewerlgpl$   * Second Life Viewer Source Code   * Copyright (C) 2007, Linden Research, Inc. @@ -34,200 +34,28 @@ out vec4 frag_color;  //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; -  vec4 getPosition(vec2 pos_screen);  vec3 getNorm(vec2 pos_screen); -//calculate decreases in ambient lighting when crowded out (SSAO) -float calcAmbientOcclusion(vec4 pos, vec3 norm, pos_screen); - -float pcfShadow(sampler2DShadow shadowMap, vec4 stc, float scl, vec2 pos_screen) -{ -	stc.xyz /= stc.w; -	stc.z += shadow_bias; +float sampleDirectionalShadow(vec3 pos, vec3 norm, vec2 pos_screen); +float sampleSpotShadow(vec3 pos, vec3 norm, int index, vec2 pos_screen); -	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; -} +//calculate decreases in ambient lighting when crowded out (SSAO) +float calcAmbientOcclusion(vec4 pos, vec3 norm, vec2 pos_screen);  void main()   { -	vec2 pos_screen = vary_fragcoord.xy;	 +	vec2 pos_screen = vary_fragcoord.xy;  	vec4 pos        = getPosition(pos_screen);  	vec3 norm       = getNorm(pos_screen); -		 -	/*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, pos_screen); -	 -	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; +	frag_color.r = sampleDirectionalShadow(pos.xyz, norm, pos_screen); +    frag_color.b = calcAmbientOcclusion(pos, norm, pos_screen); +    frag_color.b = sampleSpotShadow(pos.xyz, norm, 0, pos_screen); +    frag_color.a = sampleSpotShadow(pos.xyz, norm, 1, pos_screen);  } diff --git a/indra/newview/app_settings/shaders/class3/deferred/treeShadowF.glsl b/indra/newview/app_settings/shaders/class3/deferred/treeShadowF.glsl new file mode 100644 index 0000000000..693af31bf2 --- /dev/null +++ b/indra/newview/app_settings/shaders/class3/deferred/treeShadowF.glsl @@ -0,0 +1,59 @@ +/**  + * @file treeShadowF.glsl + * + * $LicenseInfo:firstyear=2005&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2005, 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$ + */ + +/*[EXTRA_CODE_HERE]*/ + +#ifdef DEFINE_GL_FRAGCOLOR +out vec4 frag_color; +#else +#define frag_color gl_FragColor +#endif + +uniform float minimum_alpha; + +uniform sampler2D diffuseMap; + +VARYING vec4 pos; +VARYING vec2 vary_texcoord0; + +vec4 computeMoments(float d, float a); + +void main()  +{ +	float alpha = texture2D(diffuseMap, vary_texcoord0.xy).a; + +	if (alpha < minimum_alpha) +	{ +		discard; +	} + +    frag_color = computeMoments(length(pos), 1.0); + +#if !DEPTH_CLAMP +	gl_FragDepth = max(pos.z/pos.w*0.5+0.5, 0.0); +#endif + +} + diff --git a/indra/newview/app_settings/shaders/class3/deferred/treeShadowV.glsl b/indra/newview/app_settings/shaders/class3/deferred/treeShadowV.glsl new file mode 100644 index 0000000000..15e769ac10 --- /dev/null +++ b/indra/newview/app_settings/shaders/class3/deferred/treeShadowV.glsl @@ -0,0 +1,43 @@ +/**  + * @file treeShadowV.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 texture_matrix0; +uniform mat4 modelview_projection_matrix; +  +ATTRIBUTE vec3 position; +ATTRIBUTE vec2 texcoord0; + +VARYING vec4 pos; +VARYING vec2 vary_texcoord0; + +void main() +{ +	//transform vertex +	pos = modelview_projection_matrix*vec4(position.xyz, 1.0); + +	gl_Position = vec4(pos.x, pos.y, pos.w*0.5, pos.w); +	 +	vary_texcoord0 = (texture_matrix0 * vec4(texcoord0,0,1)).xy; +} diff --git a/indra/newview/app_settings/shaders/class3/deferred/underWaterF.glsl b/indra/newview/app_settings/shaders/class3/deferred/underWaterF.glsl new file mode 100644 index 0000000000..9d18d1afd8 --- /dev/null +++ b/indra/newview/app_settings/shaders/class3/deferred/underWaterF.glsl @@ -0,0 +1,118 @@ +/** + * @file underWaterF.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$ + */ +  +/*[EXTRA_CODE_HERE]*/ + +#ifdef DEFINE_GL_FRAGCOLOR +out vec4 frag_data[3]; +#else +#define frag_data gl_FragData +#endif + +uniform sampler2D diffuseMap; +uniform sampler2D bumpMap;    +uniform sampler2D screenTex; +uniform sampler2D refTex; +uniform sampler2D screenDepth; + +uniform vec4 fogCol; +uniform vec3 lightDir; +uniform vec3 specular; +uniform float lightExp; +uniform vec2 fbScale; +uniform float refScale; +uniform float znear; +uniform float zfar; +uniform float kd; +uniform vec4 waterPlane; +uniform vec3 eyeVec; +uniform vec4 waterFogColor; +uniform float waterFogDensity; +uniform float waterFogKS; +uniform vec2 screenRes; + +//bigWave is (refCoord.w, view.w); +VARYING vec4 refCoord; +VARYING vec4 littleWave; +VARYING vec4 view; + +vec3 srgb_to_linear(vec3 cs); +vec3 linear_to_srgb(vec3 cl); + +vec2 encode_normal(vec3 n); + +vec4 applyWaterFog(vec4 color, vec3 viewVec) +{ +	//normalize view vector +	vec3 view = normalize(viewVec); +	float es = -view.z; + +	//find intersection point with water plane and eye vector +	 +	//get eye depth +	float e0 = max(-waterPlane.w, 0.0); +	 +	//get object depth +	float depth = length(viewVec); +		 +	//get "thickness" of water +	float l = max(depth, 0.1); + +	float kd = waterFogDensity; +	float ks = waterFogKS; +	vec4 kc = waterFogColor; +	 +	float F = 0.98; +	 +	float t1 = -kd * pow(F, ks * e0); +	float t2 = kd + ks * es; +	float t3 = pow(F, t2*l) - 1.0; +	 +	float L = min(t1/t2*t3, 1.0); +	 +	float D = pow(0.98, l*kd); +	return color * D + kc * L; +} + +void main()  +{ +	vec4 color; +	     +	//get detail normals +	vec3 wave1 = texture2D(bumpMap, vec2(refCoord.w, view.w)).xyz*2.0-1.0; +	vec3 wave2 = texture2D(bumpMap, littleWave.xy).xyz*2.0-1.0; +	vec3 wave3 = texture2D(bumpMap, littleWave.zw).xyz*2.0-1.0;     +	vec3 wavef = normalize(wave1+wave2+wave3); +	 +	//figure out distortion vector (ripply)    +	vec2 distort = (refCoord.xy/refCoord.z) * 0.5 + 0.5; +	distort = distort+wavef.xy*refScale; +		 +	vec4 fb = texture2D(screenTex, distort); + +	frag_data[0] = vec4(fb.rgb, 1.0); // diffuse +	frag_data[1] = vec4(0.5,0.5,0.5, 0.95); // speccolor*spec, spec +	frag_data[2] = vec4(encode_normal(wavef), 0.0, 0.0); // normalxyz, displace +} diff --git a/indra/newview/app_settings/shaders/class3/deferred/waterF.glsl b/indra/newview/app_settings/shaders/class3/deferred/waterF.glsl new file mode 100644 index 0000000000..2a144ba23a --- /dev/null +++ b/indra/newview/app_settings/shaders/class3/deferred/waterF.glsl @@ -0,0 +1,175 @@ +/**  + * @file waterF.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_data[3]; +#else +#define frag_data gl_FragData +#endif + +uniform sampler2D bumpMap;    +uniform sampler2D bumpMap2; +uniform float blend_factor; +uniform sampler2D screenTex; +uniform sampler2D refTex; + +uniform float sunAngle; +uniform float sunAngle2; +uniform vec3 lightDir; +uniform vec3 specular; +uniform float lightExp; +uniform float refScale; +uniform float kd; +uniform vec2 screenRes; +uniform vec3 normScale; +uniform float fresnelScale; +uniform float fresnelOffset; +uniform float blurMultiplier; +uniform vec2 screen_res; +uniform mat4 norm_mat; //region space to screen space + +//bigWave is (refCoord.w, view.w); +VARYING vec4 refCoord; +VARYING vec4 littleWave; +VARYING vec4 view; +VARYING vec4 vary_position; + +vec3 scaleSoftClip(vec3 c); +vec3 srgb_to_linear(vec3 cs); +vec2 encode_normal(vec3 n); + +vec3 BlendNormal(vec3 bump1, vec3 bump2) +{ +    //vec3 normal   = bump1.xyz * vec3( 2.0,  2.0, 2.0) - vec3(1.0, 1.0,  0.0); +    //vec3 normal2  = bump2.xyz * vec3(-2.0, -2.0, 2.0) + vec3(1.0, 1.0, -1.0); +    //vec3 n        = normalize(normal * dot(normal, normal2) - (normal2 * normal.z)); +    vec3 n = normalize(mix(bump1, bump2, blend_factor)); +    return n; +} + +void main()  +{ +	vec4 color; +	float dist = length(view.xy); +	 +	//normalize view vector +	vec3 viewVec = normalize(view.xyz); +	 +	//get wave normals +	vec3 wave1_a = texture2D(bumpMap, vec2(refCoord.w, view.w)).xyz*2.0-1.0; +	vec3 wave2_a = texture2D(bumpMap, littleWave.xy).xyz*2.0-1.0; +	vec3 wave3_a = texture2D(bumpMap, littleWave.zw).xyz*2.0-1.0; + + +	vec3 wave1_b = texture2D(bumpMap2, vec2(refCoord.w, view.w)).xyz*2.0-1.0; +	vec3 wave2_b = texture2D(bumpMap2, littleWave.xy).xyz*2.0-1.0; +	vec3 wave3_b = texture2D(bumpMap2, littleWave.zw).xyz*2.0-1.0; + +    vec3 wave1 = BlendNormal(wave1_a, wave1_b); +    vec3 wave2 = BlendNormal(wave2_a, wave2_b); +    vec3 wave3 = BlendNormal(wave3_a, wave3_b); + +	//get base fresnel components	 +	 +	vec3 df = vec3( +					dot(viewVec, wave1), +					dot(viewVec, (wave2 + wave3) * 0.5), +					dot(viewVec, wave3) +				 ) * fresnelScale + fresnelOffset; +	df *= df; +		     +	vec2 distort = (refCoord.xy/refCoord.z) * 0.5 + 0.5; +	 +	float dist2 = dist; +	dist = max(dist, 5.0); +	 +	float dmod = sqrt(dist); +	 +	vec2 dmod_scale = vec2(dmod*dmod, dmod); +	 +	//get reflected color +	vec2 refdistort1 = wave1.xy*normScale.x; +	vec2 refvec1 = distort+refdistort1/dmod_scale; +	vec4 refcol1 = texture2D(refTex, refvec1); +	 +	vec2 refdistort2 = wave2.xy*normScale.y; +	vec2 refvec2 = distort+refdistort2/dmod_scale; +	vec4 refcol2 = texture2D(refTex, refvec2); +	 +	vec2 refdistort3 = wave3.xy*normScale.z; +	vec2 refvec3 = distort+refdistort3/dmod_scale; +	vec4 refcol3 = texture2D(refTex, refvec3); + +	vec4 refcol = refcol1 + refcol2 + refcol3; +	float df1 = df.x + df.y + df.z; +	refcol *= df1 * 0.333; +	 +	vec3 wavef = (wave1 + wave2 * 0.4 + wave3 * 0.6) * 0.5; +	wavef.z *= max(-viewVec.z, 0.1); +	wavef = normalize(wavef); +	 +	float df2 = dot(viewVec, wavef) * fresnelScale+fresnelOffset; +	 +	vec2 refdistort4 = wavef.xy*0.125; +	refdistort4.y -= abs(refdistort4.y); +	vec2 refvec4 = distort+refdistort4/dmod; +	float dweight = min(dist2*blurMultiplier, 1.0); +	vec4 baseCol = texture2D(refTex, refvec4); + +	refcol = mix(baseCol*df2, refcol, dweight); + +	//get specular component +	float spec = clamp(dot(lightDir, (reflect(viewVec,wavef))),0.0,1.0); +		 +	//harden specular +	spec = pow(spec, 128.0); + +	//figure out distortion vector (ripply)    +	vec2 distort2 = distort+wavef.xy*refScale/max(dmod*df1, 1.0); +		 +	vec4 fb = texture2D(screenTex, distort2); +	 +	//mix with reflection +	// Note we actually want to use just df1, but multiplying by 0.999999 gets around an nvidia compiler bug +	color.rgb = mix(fb.rgb, refcol.rgb, df1 * 0.99999); + +    color.rgb *= 2.0f; +    color.rgb = scaleSoftClip(color.rgb); +	 +	vec4 pos = vary_position; +	 +	color.rgb += spec * specular; +	color.a    = spec * sunAngle2; +     +	vec3 screenspacewavef = normalize((norm_mat*vec4(wavef, 1.0)).xyz); +	 +	frag_data[0] = vec4(color.rgb, color); // diffuse +	frag_data[1] = vec4(spec * specular, spec);		// speccolor, spec +	frag_data[2] = vec4(encode_normal(wavef.xyz), 0.05, 0);// normalxy, 0, 0 +} diff --git a/indra/newview/app_settings/shaders/class3/deferred/waterV.glsl b/indra/newview/app_settings/shaders/class3/deferred/waterV.glsl new file mode 100644 index 0000000000..02000d90ca --- /dev/null +++ b/indra/newview/app_settings/shaders/class3/deferred/waterV.glsl @@ -0,0 +1,95 @@ +/**  + * @file waterV.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_matrix; +uniform mat4 modelview_projection_matrix; + +ATTRIBUTE vec3 position; + + +uniform vec2 d1; +uniform vec2 d2; +uniform float time; +uniform vec3 eyeVec; +uniform float waterHeight; + +VARYING vec4 refCoord; +VARYING vec4 littleWave; +VARYING vec4 view; + +VARYING vec4 vary_position; + +float wave(vec2 v, float t, float f, vec2 d, float s)  +{ +   return (dot(d, v)*f + t*s)*f; +} + +void main() +{ +	//transform vertex +	vec4 pos = vec4(position.xyz, 1.0); +	mat4 modelViewProj = modelview_projection_matrix; +	 +	vec4 oPosition; +		     +	//get view vector +	vec3 oEyeVec; +	oEyeVec.xyz = pos.xyz-eyeVec; +		 +	float d = length(oEyeVec.xy); +	float ld = min(d, 2560.0); +	 +	pos.xy = eyeVec.xy + oEyeVec.xy/d*ld; +	view.xyz = oEyeVec; +		 +	d = clamp(ld/1536.0-0.5, 0.0, 1.0);	 +	d *= d; +		 +	oPosition = vec4(position, 1.0); +	oPosition.z = mix(oPosition.z, max(eyeVec.z*0.75, 0.0), d); +	vary_position = modelview_matrix * oPosition; +	oPosition = modelViewProj * oPosition; +	 +	refCoord.xyz = oPosition.xyz + vec3(0,0,0.2); +	 +	//get wave position parameter (create sweeping horizontal waves) +	vec3 v = pos.xyz; +	v.x += (cos(v.x*0.08/*+time*0.01*/)+sin(v.y*0.02))*6.0; +	     +	//push position for further horizon effect. +	pos.xyz = oEyeVec.xyz*(waterHeight/oEyeVec.z); +	pos.w = 1.0; +	pos = modelview_matrix*pos; +	 +	//pass wave parameters to pixel shader +	vec2 bigWave =  (v.xy) * vec2(0.04,0.04)  + d1 * time * 0.055; +	//get two normal map (detail map) texture coordinates +	littleWave.xy = (v.xy) * vec2(0.45, 0.9)   + d2 * time * 0.13; +	littleWave.zw = (v.xy) * vec2(0.1, 0.2) + d1 * time * 0.1; +	view.w = bigWave.y; +	refCoord.w = bigWave.x; +	 +	gl_Position = oPosition; +} diff --git a/indra/newview/app_settings/shaders/class3/windlight/transportF.glsl b/indra/newview/app_settings/shaders/class3/windlight/transportF.glsl index 9c050256dc..90ab5d2793 100644 --- a/indra/newview/app_settings/shaders/class3/windlight/transportF.glsl +++ b/indra/newview/app_settings/shaders/class3/windlight/transportF.glsl @@ -61,14 +61,17 @@ vec3 fullbrightShinyAtmosTransportFrag(vec3 light, vec3 additive, vec3 atten)  	return mix(atmosTransportFrag(light.rgb, additive, atten), (light.rgb + additive.rgb) * (2.0 - brightness), brightness * brightness);  } -vec3 atmosTransport(vec3 light) { -     return (no_atmo == 1) ? light : atmosTransportFrag(light, getAdditiveColor(), getAtmosAttenuation()); +vec3 atmosTransport(vec3 light) +{ +     return atmosTransportFrag(light, getAdditiveColor(), getAtmosAttenuation());  } -vec3 fullbrightAtmosTransport(vec3 light) { -     return (no_atmo == 1) ? light : fullbrightAtmosTransportFrag(light, GetAdditiveColor(), getAtmosAttenuation()); +vec3 fullbrightAtmosTransport(vec3 light) +{ +     return fullbrightAtmosTransportFrag(light, getAdditiveColor(), getAtmosAttenuation());  } -vec3 fullbrightShinyAtmosTransport(vec3 light) { -    return (no_atmo == 1) ? light : fullbrightShinyAtmosTransportFrag(light, getAdditiveColor(), getAtmosAttenuation()); +vec3 fullbrightShinyAtmosTransport(vec3 light) +{ +    return fullbrightShinyAtmosTransportFrag(light, getAdditiveColor(), getAtmosAttenuation());  } | 
