diff options
Diffstat (limited to 'indra/newview/app_settings/shaders')
46 files changed, 1242 insertions, 3580 deletions
| diff --git a/indra/newview/app_settings/shaders/class1/deferred/fullbrightShinyF.glsl b/indra/newview/app_settings/shaders/class1/deferred/fullbrightShinyF.glsl index a04f611440..9fcee04c32 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/fullbrightShinyF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/fullbrightShinyF.glsl @@ -35,11 +35,10 @@ out vec4 frag_color;  uniform sampler2D diffuseMap;  #endif -  VARYING vec4 vertex_color;  VARYING vec2 vary_texcoord0;  VARYING vec3 vary_texcoord1; -VARYING vec3 vary_position; +VARYING vec4 vary_position;  uniform samplerCube environmentMap; @@ -55,14 +54,6 @@ void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, ou  vec3 linear_to_srgb(vec3 c);  vec3 srgb_to_linear(vec3 c); -#ifdef HAS_REFLECTION_PROBES -// reflection probe interface -void sampleReflectionProbes(inout vec3 ambenv, inout vec3 glossenv, inout vec3 legacyEnv,  -        vec3 pos, vec3 norm, float glossiness, float envIntensity); -void applyGlossEnv(inout vec3 color, vec3 glossenv, vec4 spec, vec3 pos, vec3 norm); -void applyLegacyEnv(inout vec3 color, vec3 legacyenv, vec4 spec, vec3 pos, vec3 norm, float envIntensity); -#endif -  // See:  //   class1\deferred\fullbrightShinyF.glsl  //   class1\lighting\lightFullbrightShinyF.glsl @@ -79,29 +70,21 @@ void main()  	// SL-9632 HUDs are affected by Atmosphere  	if (no_atmo == 0)  	{ -        vec3 sunlit; -        vec3 amblit; -        vec3 additive; -        vec3 atten; -        vec3 pos = vary_position; -        calcAtmosphericVars(pos.xyz, vec3(0), 1.0, sunlit, amblit, additive, atten, false); - -        float env_intensity = vertex_color.a; -#ifndef HAS_REFLECTION_PROBES -        vec3 envColor = textureCube(environmentMap, vary_texcoord1.xyz).rgb;	 -        color.rgb = mix(color.rgb, envColor.rgb, env_intensity); -#else -        vec3 ambenv; -        vec3 glossenv; -        vec3 legacyenv; -        vec3 norm = normalize(vary_texcoord1.xyz); -        vec4 spec = vec4(0,0,0,0); -        sampleReflectionProbes(ambenv, glossenv, legacyenv, pos.xyz, norm.xyz, spec.a, env_intensity); -        legacyenv *= 1.5; // fudge brighter -        applyLegacyEnv(color.rgb, legacyenv, spec, pos, norm, env_intensity); -#endif -        color.rgb = fullbrightAtmosTransportFrag(color.rgb, additive, atten); -        color.rgb = fullbrightScaleSoftClip(color.rgb); +	vec3 sunlit; +	vec3 amblit; +	vec3 additive; +	vec3 atten; +		vec3 pos = vary_position.xyz/vary_position.w; + +	calcAtmosphericVars(pos.xyz, vec3(0), 1.0, sunlit, amblit, additive, atten, false); +	 +	vec3 envColor = textureCube(environmentMap, vary_texcoord1.xyz).rgb;	 +	float env_intensity = vertex_color.a; + +	//color.rgb = srgb_to_linear(color.rgb); +		color.rgb = mix(color.rgb, envColor.rgb, env_intensity); +	color.rgb = fullbrightAtmosTransportFrag(color.rgb, additive, atten); +	color.rgb = fullbrightScaleSoftClip(color.rgb);  	}  /* @@ -115,6 +98,7 @@ void main()  */  	color.a = 1.0; +  	//color.rgb = linear_to_srgb(color.rgb);  	frag_color = color; diff --git a/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl b/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl index c5b1937cfb..02d83925ea 100644 --- a/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl +++ b/indra/newview/app_settings/shaders/class1/deferred/materialF.glsl @@ -64,13 +64,6 @@ out vec4 frag_color;  float sampleDirectionalShadow(vec3 pos, vec3 norm, vec2 pos_screen);  #endif -#ifdef HAS_REFLECTION_PROBES -void sampleReflectionProbes(inout vec3 ambenv, inout vec3 glossenv, inout vec3 legacyenv,  -        vec3 pos, vec3 norm, float glossiness, float envIntensity); -void applyGlossEnv(inout vec3 color, vec3 glossenv, vec4 spec, vec3 pos, vec3 norm); -void applyLegacyEnv(inout vec3 color, vec3 legacyenv, vec4 spec, vec3 pos, vec3 norm, float envIntensity); -#endif -  uniform samplerCube environmentMap;  uniform sampler2D     lightFunc; @@ -329,16 +322,6 @@ void main()      // lighting from the sun stays sharp      float da = clamp(dot(normalize(norm.xyz), light_dir.xyz), 0.0, 1.0);      da = pow(da, 1.0 / 1.3); -    vec3 sun_contrib = min(da, shadow) * sunlit; - -#ifdef HAS_REFLECTION_PROBES -    vec3 ambenv; -    vec3 glossenv; -    vec3 legacyenv; -    sampleReflectionProbes(ambenv, glossenv, legacyenv, pos.xyz, norm.xyz, spec.a, envIntensity); -    amblit = max(ambenv, amblit); -    color.rgb = amblit; -#else      color = amblit; @@ -350,8 +333,9 @@ void main()      ambient *= ambient;      ambient = (1.0 - ambient); +    vec3 sun_contrib = min(da, shadow) * sunlit; +          color *= ambient; -#endif      color += sun_contrib; @@ -361,6 +345,35 @@ void main()      if (spec.a > 0.0)  // specular reflection      { +        /*  // Reverting this specular calculation to previous 'dumbshiny' version - DJH 6/17/2020 +            // Preserving the refactored version as a comment for potential reconsideration, +            // overriding the general rule to avoid pollutiong the source with commented code. +            // +            //  If you're reading this in 2021+, feel free to obliterate. + +        vec3 npos = -normalize(pos.xyz); + +        //vec3 ref = dot(pos+lv, norm); +        vec3 h = normalize(light_dir.xyz + npos); +        float nh = dot(norm.xyz, h); +        float nv = dot(norm.xyz, 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 sp = sun_contrib*scol / 6.0f; +            sp = clamp(sp, vec3(0), vec3(1)); +            bloom = dot(sp, sp) / 4.0; +            color += sp * spec.rgb; +        } +        */ +          float sa        = dot(refnormpersp, sun_dir.xyz);          vec3  dumbshiny = sunlit * shadow * (texture2D(lightFunc, vec2(sa, spec.a)).r); @@ -372,24 +385,10 @@ void main()          glare = max(glare, spec_contrib.b);          color += spec_contrib; - -#ifdef HAS_REFLECTION_PROBES -        applyGlossEnv(color, glossenv, spec, pos.xyz, norm.xyz); -#endif      } -      color = mix(color.rgb, diffcol.rgb, diffuse.a); -#ifdef HAS_REFLECTION_PROBES -    if (envIntensity > 0.0) -    {  // add environmentmap -        //fudge darker -        legacyenv *= 0.5*diffuse.a+0.5; -         -        applyLegacyEnv(color, legacyenv, spec, pos.xyz, norm.xyz, envIntensity); -    } -#else      if (envIntensity > 0.0)      {          //add environmentmap @@ -404,7 +403,6 @@ void main()          cur_glare *= envIntensity*4.0;          glare += cur_glare;      } -#endif      color = atmosFragLighting(color, additive, atten);      color = scaleSoftClipFrag(color); diff --git a/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl index d88400dddb..7700d16007 100644 --- a/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl +++ b/indra/newview/app_settings/shaders/class2/deferred/softenLightF.glsl @@ -26,10 +26,7 @@  #extension GL_ARB_texture_rectangle : enable  #extension GL_ARB_shader_texture_lod : enable -#define FLT_MAX 3.402823466e+38 - -#define REFMAP_COUNT 256 -#define REF_SAMPLE_COUNT 64 //maximum number of samples to consider +/*[EXTRA_CODE_HERE]*/  #ifdef DEFINE_GL_FRAGCOLOR  out vec4 frag_color; @@ -42,6 +39,7 @@ uniform sampler2DRect specularRect;  uniform sampler2DRect normalMap;  uniform sampler2DRect lightMap;  uniform sampler2DRect depthMap; +uniform samplerCube   environmentMap;  uniform sampler2D     lightFunc;  uniform float blur_size; @@ -68,12 +66,6 @@ vec3  scaleSoftClipFrag(vec3 l);  vec3  fullbrightAtmosTransportFrag(vec3 light, vec3 additive, vec3 atten);  vec3  fullbrightScaleSoftClip(vec3 light); -// reflection probe interface -void sampleReflectionProbes(inout vec3 ambenv, inout vec3 glossenv, inout vec3 legacyEnv,  -        vec3 pos, vec3 norm, float glossiness, float envIntensity); -void applyGlossEnv(inout vec3 color, vec3 glossenv, vec4 spec, vec3 pos, vec3 norm); -void applyLegacyEnv(inout vec3 color, vec3 legacyenv, vec4 spec, vec3 pos, vec3 norm, float envIntensity); -  vec3 linear_to_srgb(vec3 c);  vec3 srgb_to_linear(vec3 c); @@ -111,53 +103,40 @@ void main()      vec3 amblit;      vec3 additive;      vec3 atten; -      calcAtmosphericVars(pos.xyz, light_dir, ambocc, sunlit, amblit, additive, atten, true); -    //vec3 amb_vec = env_mat * norm.xyz; +    color.rgb = amblit; -    vec3 ambenv; -    vec3 glossenv; -    vec3 legacyenv; -    sampleReflectionProbes(ambenv, glossenv, legacyenv, pos.xyz, norm.xyz, spec.a, envIntensity); - -    amblit = max(ambenv, amblit); -    color.rgb = amblit*ambocc; - -    //float ambient = min(abs(dot(norm.xyz, sun_dir.xyz)), 1.0); -    //ambient *= 0.5; -    //ambient *= ambient; -    //ambient = (1.0 - ambient); -    //color.rgb *= ambient; +    float ambient = min(abs(dot(norm.xyz, sun_dir.xyz)), 1.0); +    ambient *= 0.5; +    ambient *= ambient; +    ambient = (1.0 - ambient); +    color.rgb *= ambient;      vec3 sun_contrib = min(da, scol) * sunlit;      color.rgb += sun_contrib; -    color.rgb = min(color.rgb, vec3(1,1,1));      color.rgb *= diffuse.rgb; -    vec3 refnormpersp = reflect(pos.xyz, norm.xyz); +    vec3 refnormpersp = normalize(reflect(pos.xyz, norm.xyz));      if (spec.a > 0.0)  // specular reflection      { -        float sa        = dot(normalize(refnormpersp), light_dir.xyz); +        float sa        = dot(refnormpersp, light_dir.xyz);          vec3  dumbshiny = sunlit * scol * (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;          color.rgb += spec_contrib; - -        // add reflection map - EXPERIMENTAL WORK IN PROGRESS -        applyGlossEnv(color, glossenv, spec, pos.xyz, norm.xyz);      }      color.rgb = mix(color.rgb, diffuse.rgb, diffuse.a);      if (envIntensity > 0.0)      {  // add environmentmap -        //fudge darker -        legacyenv *= 0.5*diffuse.a+0.5;; -        applyLegacyEnv(color, legacyenv, spec, pos.xyz, norm.xyz, envIntensity); +        vec3 env_vec         = env_mat * refnormpersp; +        vec3 reflected_color = textureCube(environmentMap, env_vec).rgb; +        color                = mix(color.rgb, reflected_color, envIntensity);      }      if (norm.w < 0.5) @@ -174,9 +153,6 @@ void main()      // convert to linear as fullscreen lights need to sum in linear colorspace      // and will be gamma (re)corrected downstream... -    //color = vec3(ambocc); -    //color = ambenv; -    //color.b = diffuse.a;      frag_color.rgb = srgb_to_linear(color.rgb); -    frag_color.a = bloom; +    frag_color.a   = bloom;  } diff --git a/indra/newview/app_settings/shaders/class3/deferred/attachmentShadowF.glsl b/indra/newview/app_settings/shaders/class3/deferred/attachmentShadowF.glsl deleted file mode 100644 index d973326f93..0000000000 --- a/indra/newview/app_settings/shaders/class3/deferred/attachmentShadowF.glsl +++ /dev/null @@ -1,44 +0,0 @@ -/**  - * @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 deleted file mode 100644 index 1a655e6467..0000000000 --- a/indra/newview/app_settings/shaders/class3/deferred/attachmentShadowV.glsl +++ /dev/null @@ -1,49 +0,0 @@ -/**  - * @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 !defined(DEPTH_CLAMP) -	pos.z = max(pos.z, -pos.w+0.01); -#endif -	gl_Position = pos; -} diff --git a/indra/newview/app_settings/shaders/class3/deferred/avatarShadowF.glsl b/indra/newview/app_settings/shaders/class3/deferred/avatarShadowF.glsl deleted file mode 100644 index 48eefc7a73..0000000000 --- a/indra/newview/app_settings/shaders/class3/deferred/avatarShadowF.glsl +++ /dev/null @@ -1,52 +0,0 @@ -/**  - * @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; - -#if !defined(DEPTH_CLAMP) -VARYING vec4 post_pos; -#endif - -VARYING vec4 pos; - -vec4 computeMoments(float depth, float a); - -void main()  -{ -    frag_color = computeMoments(length(pos), 1.0); - -#if !defined(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 deleted file mode 100644 index 164b355f20..0000000000 --- a/indra/newview/app_settings/shaders/class3/deferred/avatarShadowV.glsl +++ /dev/null @@ -1,68 +0,0 @@ -/**  - * @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 !defined(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 !defined(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 deleted file mode 100644 index 32210f60dc..0000000000 --- a/indra/newview/app_settings/shaders/class3/deferred/cloudShadowF.glsl +++ /dev/null @@ -1,119 +0,0 @@ -/**  - * @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 cloud_color; -uniform float cloud_shadow; -uniform float cloud_scale; -uniform float cloud_variance; -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() -{ -    if (cloud_scale >= 0.001) -    { -        // 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.2);    //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) * 4.0); -     -        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); -    } -    else -    { -        frag_color = vec4(0); -    } -} diff --git a/indra/newview/app_settings/shaders/class3/deferred/cloudShadowV.glsl b/indra/newview/app_settings/shaders/class3/deferred/cloudShadowV.glsl deleted file mode 100644 index effb070f93..0000000000 --- a/indra/newview/app_settings/shaders/class3/deferred/cloudShadowV.glsl +++ /dev/null @@ -1,63 +0,0 @@ -/**  - * @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 !defined(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 !defined(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 deleted file mode 100644 index e40d7e7c75..0000000000 --- a/indra/newview/app_settings/shaders/class3/deferred/cloudsF.glsl +++ /dev/null @@ -1,166 +0,0 @@ -/**  - * @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_data[3]; -#else -#define frag_data gl_FragData -#endif - -///////////////////////////////////////////////////////////////////////// -// The fragment shader for the sky -///////////////////////////////////////////////////////////////////////// - -VARYING vec4 vary_CloudColorSun; -VARYING vec4 vary_CloudColorAmbient; -VARYING float vary_CloudDensity; -VARYING vec2 vary_texcoord0; -VARYING vec2 vary_texcoord1; -VARYING vec2 vary_texcoord2; -VARYING vec2 vary_texcoord3; -VARYING vec3 vary_pos; - -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 cloud_color; -uniform float cloud_shadow; -uniform float cloud_scale; -uniform float cloud_variance; -uniform vec3 camPosLocal; -uniform vec3 sun_dir; -uniform float sun_size; -uniform float far_z; - -uniform sampler2D transmittance_texture; -uniform sampler3D scattering_texture; -uniform sampler3D single_mie_scattering_texture; -uniform sampler2D irradiance_texture; -uniform sampler2D sh_input_r; -uniform sampler2D sh_input_g; -uniform sampler2D sh_input_b; - -vec3 GetSkyLuminance(vec3 camPos, vec3 view_dir, float shadow_length, vec3 dir, out vec3 transmittance); - -/// Soft clips the light with a gamma correction -vec3 scaleSoftClip(vec3 light); - -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 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); - -    if (cloud_scale < 0.001) -    { -        discard; -    } - -    vec2 uv4 = vary_texcoord3.xy; - -    vec2 disturbance = vec2(cloudNoise(uv1 / 16.0f).x, cloudNoise((uv3 + uv1) / 16.0f).x) * cloud_variance * (1.0f - cloud_scale * 0.25f); - -    // Offset texture coords -    uv1 += cloud_pos_density1.xy + (disturbance * 0.2); //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) * 4.0); - -    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;   - -    vec3 view_ray = vary_pos.xyz + camPosLocal; - -    vec3 view_direction = normalize(view_ray); -    vec3 sun_direction  = normalize(sun_dir); -    vec3 earth_center   = vec3(0, 0, -6360.0f); -    vec3 camPos = (camPosLocal / 1000.0f) - earth_center; - -    vec3 transmittance; -    vec3 radiance_sun  = GetSkyLuminance(camPos, view_direction, 1.0 - alpha1, sun_direction, transmittance); - -    vec3 sun_color = vec3(1.0) - exp(-radiance_sun * 0.0001); - -    // 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 += amb; - -    frag_data[0] = vec4(color.rgb, alpha1); -    frag_data[1] = vec4(0); -    frag_data[2] = vec4(0,1,0,1); -} - diff --git a/indra/newview/app_settings/shaders/class3/deferred/cloudsV.glsl b/indra/newview/app_settings/shaders/class3/deferred/cloudsV.glsl deleted file mode 100644 index 71e422ddf0..0000000000 --- a/indra/newview/app_settings/shaders/class3/deferred/cloudsV.glsl +++ /dev/null @@ -1,70 +0,0 @@ -/**  - * @file WLCloudsV.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$ - */ - -uniform mat4 modelview_projection_matrix; -uniform mat4 modelview_matrix; - -ATTRIBUTE vec3 position; -ATTRIBUTE vec2 texcoord0; - -////////////////////////////////////////////////////////////////////////// -// The vertex shader for creating the atmospheric sky -/////////////////////////////////////////////////////////////////////////////// - -// Output parameters -VARYING vec2 vary_texcoord0; -VARYING vec2 vary_texcoord1; -VARYING vec2 vary_texcoord2; -VARYING vec2 vary_texcoord3; -VARYING vec3 vary_pos; - -// Inputs -uniform float cloud_scale; -uniform vec4  lightnorm; -uniform vec3  camPosLocal; - -void main() -{ -    vary_pos = position; - -    // World / view / projection -    gl_Position = modelview_projection_matrix * vec4(position.xyz, 1.0); - -    // Texture coords -    vary_texcoord0 = texcoord0; -    vary_texcoord0.xy -= 0.5; -    vary_texcoord0.xy /= max(0.001, cloud_scale); -    vary_texcoord0.xy += 0.5; - -    vary_texcoord1 = vary_texcoord0; -    vary_texcoord1.x += lightnorm.x * 0.0125; -    vary_texcoord1.y += lightnorm.z * 0.0125; - -    vary_texcoord2 = vary_texcoord0 * 16.; -    vary_texcoord3 = vary_texcoord1 * 16.; - -    // END CLOUDS -} - diff --git a/indra/newview/app_settings/shaders/class3/deferred/deferredUtil.glsl b/indra/newview/app_settings/shaders/class3/deferred/deferredUtil.glsl deleted file mode 100644 index e27bbce094..0000000000 --- a/indra/newview/app_settings/shaders/class3/deferred/deferredUtil.glsl +++ /dev/null @@ -1,79 +0,0 @@ -/**  - * @file class1/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; - -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 = texture2DRect(normalMap, screenpos.xy).xy; -   vec2 fenc = enc*4-2; -   float f = dot(fenc,fenc); -   float g = sqrt(1-f/4); -   vec3 n; -   n.xy = fenc*g; -   n.z = 1-f/2; -   return n; -} - -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 deleted file mode 100644 index cdaff4b09f..0000000000 --- a/indra/newview/app_settings/shaders/class3/deferred/depthToShadowVolumeG.glsl +++ /dev/null @@ -1,202 +0,0 @@ -/**  - * @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/fullbrightShinyF.glsl b/indra/newview/app_settings/shaders/class3/deferred/fullbrightShinyF.glsl new file mode 100644 index 0000000000..a04f611440 --- /dev/null +++ b/indra/newview/app_settings/shaders/class3/deferred/fullbrightShinyF.glsl @@ -0,0 +1,122 @@ +/**  + * @file fullbrightShinyF.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 + +#ifndef HAS_DIFFUSE_LOOKUP +uniform sampler2D diffuseMap; +#endif + + +VARYING vec4 vertex_color; +VARYING vec2 vary_texcoord0; +VARYING vec3 vary_texcoord1; +VARYING vec3 vary_position; + +uniform samplerCube environmentMap; + +// render_hud_attachments() -> HUD objects set LLShaderMgr::NO_ATMO; used in LLDrawPoolAlpha::beginRenderPass() +uniform int no_atmo; + +vec3 fullbrightShinyAtmosTransport(vec3 light); +vec3 fullbrightAtmosTransportFrag(vec3 light, vec3 additive, vec3 atten); +vec3 fullbrightScaleSoftClip(vec3 light); + +void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, out vec3 sunlit, out vec3 amblit, out vec3 additive, out vec3 atten, bool use_ao); + +vec3 linear_to_srgb(vec3 c); +vec3 srgb_to_linear(vec3 c); + +#ifdef HAS_REFLECTION_PROBES +// reflection probe interface +void sampleReflectionProbes(inout vec3 ambenv, inout vec3 glossenv, inout vec3 legacyEnv,  +        vec3 pos, vec3 norm, float glossiness, float envIntensity); +void applyGlossEnv(inout vec3 color, vec3 glossenv, vec4 spec, vec3 pos, vec3 norm); +void applyLegacyEnv(inout vec3 color, vec3 legacyenv, vec4 spec, vec3 pos, vec3 norm, float envIntensity); +#endif + +// See: +//   class1\deferred\fullbrightShinyF.glsl +//   class1\lighting\lightFullbrightShinyF.glsl +void main() +{ +#ifdef HAS_DIFFUSE_LOOKUP +	vec4 color = diffuseLookup(vary_texcoord0.xy); +#else +	vec4 color = texture2D(diffuseMap, vary_texcoord0.xy); +#endif +	 +	color.rgb *= vertex_color.rgb; + +	// SL-9632 HUDs are affected by Atmosphere +	if (no_atmo == 0) +	{ +        vec3 sunlit; +        vec3 amblit; +        vec3 additive; +        vec3 atten; +        vec3 pos = vary_position; +        calcAtmosphericVars(pos.xyz, vec3(0), 1.0, sunlit, amblit, additive, atten, false); + +        float env_intensity = vertex_color.a; +#ifndef HAS_REFLECTION_PROBES +        vec3 envColor = textureCube(environmentMap, vary_texcoord1.xyz).rgb;	 +        color.rgb = mix(color.rgb, envColor.rgb, env_intensity); +#else +        vec3 ambenv; +        vec3 glossenv; +        vec3 legacyenv; +        vec3 norm = normalize(vary_texcoord1.xyz); +        vec4 spec = vec4(0,0,0,0); +        sampleReflectionProbes(ambenv, glossenv, legacyenv, pos.xyz, norm.xyz, spec.a, env_intensity); +        legacyenv *= 1.5; // fudge brighter +        applyLegacyEnv(color.rgb, legacyenv, spec, pos, norm, env_intensity); +#endif +        color.rgb = fullbrightAtmosTransportFrag(color.rgb, additive, atten); +        color.rgb = fullbrightScaleSoftClip(color.rgb); +	} + +/* +	// NOTE: HUD objects will be full bright. Uncomment if you want "some" environment lighting effecting these HUD objects. +	else +	{ +		vec3  envColor = textureCube(environmentMap, vary_texcoord1.xyz).rgb; +		float env_intensity = vertex_color.a; +		color.rgb = mix(color.rgb, envColor.rgb, env_intensity); +	} +*/ + +	color.a = 1.0; +	//color.rgb = linear_to_srgb(color.rgb); + +	frag_color = color; +} + diff --git a/indra/newview/app_settings/shaders/class3/deferred/gatherSkyShF.glsl b/indra/newview/app_settings/shaders/class3/deferred/gatherSkyShF.glsl deleted file mode 100644 index 34d26cddea..0000000000 --- a/indra/newview/app_settings/shaders/class3/deferred/gatherSkyShF.glsl +++ /dev/null @@ -1,70 +0,0 @@ -/**  - * @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 deleted file mode 100644 index 337c8a50fe..0000000000 --- a/indra/newview/app_settings/shaders/class3/deferred/gatherSkyShV.glsl +++ /dev/null @@ -1,40 +0,0 @@ -/**  - * @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 deleted file mode 100644 index d5d91c88f0..0000000000 --- a/indra/newview/app_settings/shaders/class3/deferred/genSkyShF.glsl +++ /dev/null @@ -1,111 +0,0 @@ -/**  - * @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; - -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 deleted file mode 100644 index b466883dc7..0000000000 --- a/indra/newview/app_settings/shaders/class3/deferred/genSkyShV.glsl +++ /dev/null @@ -1,37 +0,0 @@ -/**  - * @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 deleted file mode 100644 index 33c5667cae..0000000000 --- a/indra/newview/app_settings/shaders/class3/deferred/indirect.glsl +++ /dev/null @@ -1,44 +0,0 @@ -/**  - * @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/materialF.glsl b/indra/newview/app_settings/shaders/class3/deferred/materialF.glsl new file mode 100644 index 0000000000..c5b1937cfb --- /dev/null +++ b/indra/newview/app_settings/shaders/class3/deferred/materialF.glsl @@ -0,0 +1,455 @@ +/** +* @file materialF.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]*/ + +//class1/deferred/materialF.glsl + +// This shader is used for both writing opaque/masked content to the gbuffer and writing blended content to the framebuffer during the alpha pass. + +#define DIFFUSE_ALPHA_MODE_NONE     0 +#define DIFFUSE_ALPHA_MODE_BLEND    1 +#define DIFFUSE_ALPHA_MODE_MASK     2 +#define DIFFUSE_ALPHA_MODE_EMISSIVE 3 + +uniform float emissive_brightness;  // fullbright flag, 1.0 == fullbright, 0.0 otherwise +uniform int sun_up_factor; + +#ifdef WATER_FOG +vec4 applyWaterFogView(vec3 pos, vec4 color); +#endif + +vec3 atmosFragLighting(vec3 l, vec3 additive, vec3 atten); +vec3 scaleSoftClipFrag(vec3 l); + +vec3 fullbrightAtmosTransportFrag(vec3 light, vec3 additive, vec3 atten); +vec3 fullbrightScaleSoftClip(vec3 light); + +void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, out vec3 sunlit, out vec3 amblit, out vec3 additive, out vec3 atten, bool use_ao); + +vec3 srgb_to_linear(vec3 cs); +vec3 linear_to_srgb(vec3 cs); + +#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND) + +#ifdef DEFINE_GL_FRAGCOLOR +out vec4 frag_color; +#else +#define frag_color gl_FragColor +#endif + +#ifdef HAS_SUN_SHADOW +float sampleDirectionalShadow(vec3 pos, vec3 norm, vec2 pos_screen); +#endif + +#ifdef HAS_REFLECTION_PROBES +void sampleReflectionProbes(inout vec3 ambenv, inout vec3 glossenv, inout vec3 legacyenv,  +        vec3 pos, vec3 norm, float glossiness, float envIntensity); +void applyGlossEnv(inout vec3 color, vec3 glossenv, vec4 spec, vec3 pos, vec3 norm); +void applyLegacyEnv(inout vec3 color, vec3 legacyenv, vec4 spec, vec3 pos, vec3 norm, float envIntensity); +#endif + +uniform samplerCube environmentMap; +uniform sampler2D     lightFunc; + +// Inputs +uniform vec4 morphFactor; +uniform vec3 camPosLocal; +uniform mat3 env_mat; + +uniform vec3 sun_dir; +uniform vec3 moon_dir; +VARYING vec2 vary_fragcoord; + +VARYING vec3 vary_position; + +uniform mat4 proj_mat; +uniform mat4 inv_proj; +uniform vec2 screen_res; + +uniform vec4 light_position[8]; +uniform vec3 light_direction[8]; +uniform vec4 light_attenuation[8]; +uniform vec3 light_diffuse[8]; + +float getAmbientClamp(); + +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, float ambiance) +{ +    // SL-14895 inverted attenuation work-around +    // This routine is tweaked to match deferred lighting, but previously used an inverted la value. To reconstruct +    // that previous value now that the inversion is corrected, we reverse the calculations in LLPipeline::setupHWLights() +    // to recover the `adjusted_radius` value previously being sent as la. +    float falloff_factor = (12.0 * fa) - 9.0; +    float inverted_la = falloff_factor / la; +    // Yes, it makes me want to cry as well. DJH +     +    vec3 col = vec3(0); + +    //get light vector +    vec3 lv = lp.xyz - v; + +    //get distance +    float dist = length(lv); +    float da = 1.0; + +    dist /= inverted_la; + +    if (dist > 0.0 && inverted_la > 0.0) +    { +        //normalize light vector +        lv = normalize(lv); + +        //distance attenuation +        float dist_atten = clamp(1.0 - (dist - 1.0*(1.0 - fa)) / fa, 0.0, 1.0); +        dist_atten *= dist_atten; +        dist_atten *= 2.0f; + +        if (dist_atten <= 0.0) +        { +            return col; +        } + +        // spotlight coefficient. +        float spot = max(dot(-ln, lv), is_pointlight); +        da *= spot*spot; // GL_SPOT_EXPONENT=2 + +        //angular attenuation +        da *= dot(n, lv); + +        float lit = 0.0f; + +        float amb_da = ambiance; +        if (da >= 0) +        { +            lit = max(da * dist_atten, 0.0); +            col = lit * light_col * diffuse; +            amb_da += (da*0.5 + 0.5) * ambiance; +        } +        amb_da += (da*da*0.5 + 0.5) * ambiance; +        amb_da *= dist_atten; +        amb_da = min(amb_da, 1.0f - lit); + +        // SL-10969 need to see why these are blown out +        //col.rgb += amb_da * light_col * 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; +                speccol = clamp(speccol, vec3(0), vec3(1)); +                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); +            } +        } +    } + +    return max(col, vec3(0.0, 0.0, 0.0)); +} + +#else +#ifdef DEFINE_GL_FRAGCOLOR +out vec4 frag_data[3]; +#else +#define frag_data gl_FragData +#endif +#endif + +uniform sampler2D diffuseMap;  //always in sRGB space + +#ifdef HAS_NORMAL_MAP +uniform sampler2D bumpMap; +#endif + +#ifdef HAS_SPECULAR_MAP +uniform sampler2D specularMap; + +VARYING vec2 vary_texcoord2; +#endif + +uniform float env_intensity; +uniform vec4 specular_color;  // specular color RGB and specular exponent (glossiness) in alpha + +#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_MASK) +uniform float minimum_alpha; +#endif + +#ifdef HAS_NORMAL_MAP +VARYING vec3 vary_mat0; +VARYING vec3 vary_mat1; +VARYING vec3 vary_mat2; +VARYING vec2 vary_texcoord1; +#else +VARYING vec3 vary_normal; +#endif + +VARYING vec4 vertex_color; +VARYING vec2 vary_texcoord0; + +vec2 encode_normal(vec3 n); + +void main() +{ +    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) + +    // Comparing floats cast from 8-bit values, produces acne right at the 8-bit transition points +    float bias = 0.001953125; // 1/512, or half an 8-bit quantization +    if (diffcol.a < minimum_alpha-bias) +    { +        discard; +    } +#endif + +#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND) +	vec3 gamma_diff = diffcol.rgb; +	diffcol.rgb = srgb_to_linear(diffcol.rgb); +#endif + +#ifdef HAS_SPECULAR_MAP +    vec4 spec = texture2D(specularMap, vary_texcoord2.xy); +    spec.rgb *= specular_color.rgb; +#else +    vec4 spec = vec4(specular_color.rgb, 1.0); +#endif + +#ifdef HAS_NORMAL_MAP +	vec4 norm = texture2D(bumpMap, vary_texcoord1.xy); + +	norm.xyz = norm.xyz * 2 - 1; + +	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; +#endif + +    norm.xyz = normalize(tnorm.xyz); + +    vec2 abnormal = encode_normal(norm.xyz); + +    vec4 final_color = diffcol; + +#if (DIFFUSE_ALPHA_MODE != DIFFUSE_ALPHA_MODE_EMISSIVE) +	final_color.a = emissive_brightness; +#else +	final_color.a = max(final_color.a, emissive_brightness); +#endif + +    vec4 final_specular = spec; +     +#ifdef 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; +#else +	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 sRGBA +    vec3 pos = vary_position; + +    float shadow = 1.0f; + +#ifdef HAS_SUN_SHADOW +    shadow = sampleDirectionalShadow(pos.xyz, norm.xyz, pos_screen); +#endif + +    spec = final_specular; +    vec4 diffuse = final_color; +    float envIntensity = final_normal.z; + +    vec3 color = vec3(0,0,0); + +    vec3 light_dir = (sun_up_factor == 1) ? sun_dir : moon_dir; + +    float bloom = 0.0; +    vec3 sunlit; +    vec3 amblit; +    vec3 additive; +    vec3 atten; + +    calcAtmosphericVars(pos.xyz, light_dir, 1.0, sunlit, amblit, additive, atten, false); +     +        // This call breaks the Mac GLSL compiler/linker for unknown reasons (17Mar2020) +        // The call is either a no-op or a pure (pow) gamma adjustment, depending on GPU level +        // TODO: determine if we want to re-apply the gamma adjustment, and if so understand & fix Mac breakage +        //color = fullbrightScaleSoftClip(color); + +    vec3 refnormpersp = normalize(reflect(pos.xyz, norm.xyz)); + +    //we're in sRGB space, so gamma correct this dot product so  +    // lighting from the sun stays sharp +    float da = clamp(dot(normalize(norm.xyz), light_dir.xyz), 0.0, 1.0); +    da = pow(da, 1.0 / 1.3); +    vec3 sun_contrib = min(da, shadow) * sunlit; + +#ifdef HAS_REFLECTION_PROBES +    vec3 ambenv; +    vec3 glossenv; +    vec3 legacyenv; +    sampleReflectionProbes(ambenv, glossenv, legacyenv, pos.xyz, norm.xyz, spec.a, envIntensity); +    amblit = max(ambenv, amblit); +    color.rgb = amblit; +#else + +    color = amblit; + +    //darken ambient for normals perpendicular to light vector so surfaces in shadow  +    // and facing away from light still have some definition to them. +    // do NOT gamma correct this dot product so ambient lighting stays soft +    float ambient = min(abs(dot(norm.xyz, sun_dir.xyz)), 1.0); +    ambient *= 0.5; +    ambient *= ambient; +    ambient = (1.0 - ambient); + +    color *= ambient; +#endif + +    color += sun_contrib; + +    color *= gamma_diff.rgb; + +    float glare = 0.0; + +    if (spec.a > 0.0)  // specular 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); + +        color += spec_contrib; + +#ifdef HAS_REFLECTION_PROBES +        applyGlossEnv(color, glossenv, spec, pos.xyz, norm.xyz); +#endif +    } + + +    color = mix(color.rgb, diffcol.rgb, diffuse.a); + +#ifdef HAS_REFLECTION_PROBES +    if (envIntensity > 0.0) +    {  // add environmentmap +        //fudge darker +        legacyenv *= 0.5*diffuse.a+0.5; +         +        applyLegacyEnv(color, legacyenv, spec, pos.xyz, norm.xyz, envIntensity); +    } +#else +    if (envIntensity > 0.0) +    { +        //add environmentmap +        vec3 env_vec = env_mat * refnormpersp; + +        vec3 reflected_color = textureCube(environmentMap, env_vec).rgb; + +        color = mix(color, reflected_color, envIntensity); + +        float cur_glare = max(reflected_color.r, reflected_color.g); +        cur_glare = max(cur_glare, reflected_color.b); +        cur_glare *= envIntensity*4.0; +        glare += cur_glare; +    } +#endif + +    color = atmosFragLighting(color, additive, atten); +    color = scaleSoftClipFrag(color); + +    //convert to linear before adding local lights +    color = srgb_to_linear(color); + +    vec3 npos = normalize(-pos.xyz); + +    vec3 light = vec3(0, 0, 0); +     +    final_specular.rgb = srgb_to_linear(final_specular.rgb); // SL-14035 + +#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_attenuation[i].w ); + +    LIGHT_LOOP(1) +        LIGHT_LOOP(2) +        LIGHT_LOOP(3) +        LIGHT_LOOP(4) +        LIGHT_LOOP(5) +        LIGHT_LOOP(6) +        LIGHT_LOOP(7) + +    color += light; + +    glare = min(glare, 1.0); +    float al = max(diffcol.a, glare)*vertex_color.a; + +    //convert to srgb as this color is being written post gamma correction +    color = linear_to_srgb(color); + +#ifdef WATER_FOG +    vec4 temp = applyWaterFogView(pos, vec4(color, al)); +    color = temp.rgb; +    al = temp.a; +#endif + +    frag_color = vec4(color, al); + +#else // mode is not DIFFUSE_ALPHA_MODE_BLEND, encode to gbuffer  + +    // deferred path +    frag_data[0] = final_color; //gbuffer is sRGB +    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/class3/deferred/multiSpotLightF.glsl b/indra/newview/app_settings/shaders/class3/deferred/multiSpotLightF.glsl deleted file mode 100644 index 9d62b9d180..0000000000 --- a/indra/newview/app_settings/shaders/class3/deferred/multiSpotLightF.glsl +++ /dev/null @@ -1,291 +0,0 @@ -/**  - * @file multiSpotLightF.glsl - * - * $LicenseInfo:firstyear=2007&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2007, Linden Research, Inc. - *  - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - *  - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU - * Lesser General Public License for more details. - *  - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA - *  - * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA - * $/LicenseInfo$ - */ -  -#extension GL_ARB_texture_rectangle : enable -#extension GL_ARB_shader_texture_lod : enable - -/*[EXTRA_CODE_HERE]*/ - -#ifdef DEFINE_GL_FRAGCOLOR -out vec4 frag_color; -#else -#define frag_color gl_FragColor -#endif - -uniform sampler2DRect diffuseRect; -uniform sampler2DRect specularRect; -uniform sampler2DRect depthMap; -uniform sampler2DRect normalMap; -uniform samplerCube environmentMap; -uniform sampler2DRect lightMap; -uniform sampler2D noiseMap; -uniform sampler2D projectionMap; -uniform sampler2D lightFunc; - -uniform mat4 proj_mat; //screen space to light space -uniform float proj_near; //near clip for projection -uniform vec3 proj_p; //plane projection is emitting from (in screen space) -uniform vec3 proj_n; -uniform float proj_focus; //distance from plane to begin blurring -uniform float proj_lod;  //(number of mips in proj map) -uniform float proj_range; //range between near clip and far clip plane of projection -uniform float proj_ambient_lod; -uniform float proj_ambiance; -uniform float near_clip; -uniform float far_clip; - -uniform vec3 proj_origin; //origin of projection to be used for angular attenuation -uniform float sun_wash; -uniform int proj_shadow_idx; -uniform float shadow_fade; - -uniform vec3 center; -uniform float size; -uniform vec3 color; -uniform float falloff; - -VARYING vec4 vary_fragcoord; -uniform vec2 screen_res; - -uniform mat4 inv_proj; - -vec3 getNorm(vec2 pos_screen); - -vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod) -{ -    vec4 ret = texture2DLod(projectionMap, tc, lod); -     -    vec2 dist = vec2(0.5) - abs(tc-vec2(0.5)); -     -    float det = min(lod/(proj_lod*0.5), 1.0); -     -    float d = min(dist.x, dist.y); -     -    d *= min(1, d * (proj_lod - lod)); -     -    float edge = 0.25*det; -     -    ret *= clamp(d/edge, 0.0, 1.0); -     -    return ret; -} - -vec4 texture2DLodDiffuse(sampler2D projectionMap, vec2 tc, float lod) -{ -    vec4 ret = texture2DLod(projectionMap, tc, lod); - -    vec2 dist = vec2(0.5) - abs(tc-vec2(0.5)); -     -    float det = min(lod/(proj_lod*0.5), 1.0); -     -    float d = min(dist.x, dist.y); -     -    float edge = 0.25*det; -         -    ret *= clamp(d/edge, 0.0, 1.0); -     -    return ret; -} - -vec4 texture2DLodAmbient(sampler2D projectionMap, vec2 tc, float lod) -{ -    vec4 ret = texture2DLod(projectionMap, tc, lod); - -    vec2 dist = tc-vec2(0.5); -     -    float d = dot(dist,dist); -         -    ret *= min(clamp((0.25-d)/0.25, 0.0, 1.0), 1.0); -     -    return ret; -} - - -vec4 getPosition(vec2 pos_screen); - -void main()  -{ -    vec4 frag = vary_fragcoord; -    frag.xyz /= frag.w; -    frag.xyz = frag.xyz*0.5+0.5; -    frag.xy *= screen_res; -     -    vec3 pos = getPosition(frag.xy).xyz; -    vec3 lv = center.xyz-pos.xyz; -    float dist = length(lv); -    dist /= size; -    if (dist > 1.0) -    { -        discard; -    } -     -    float shadow = 1.0; -     -    if (proj_shadow_idx >= 0) -    { -        vec4 shd = texture2DRect(lightMap, frag.xy); -        shadow = (proj_shadow_idx == 0) ? shd.b : shd.a; -        shadow += shadow_fade; -        shadow = clamp(shadow, 0.0, 1.0);         -    } -     -    vec3 norm = texture2DRect(normalMap, frag.xy).xyz; -     -    float envIntensity = norm.z; - -    norm = getNorm(frag.xy); -     -    norm = normalize(norm); -    float l_dist = -dot(lv, proj_n); -     -    vec4 proj_tc = (proj_mat * vec4(pos.xyz, 1.0)); -    if (proj_tc.z < 0.0) -    { -        discard; -    } -     -    proj_tc.xyz /= proj_tc.w; -     -    float fa = (falloff*0.5)+1.0; -    float dist_atten = min(1.0-(dist-1.0*(1.0-fa))/fa, 1.0); -    dist_atten *= dist_atten; -    dist_atten *= 2.0; -    if (dist_atten <= 0.0) -    { -        discard; -    } -     -    lv = proj_origin-pos.xyz; -    lv = normalize(lv); -    float da = dot(norm, lv); - -    vec3 col = vec3(0,0,0); -         -    vec3 diff_tex = srgb_to_linear(texture2DRect(diffuseRect, frag.xy).rgb); -     -    vec4 spec = texture2DRect(specularRect, frag.xy); - -    vec3 dlit = vec3(0, 0, 0); - -    float noise = texture2D(noiseMap, frag.xy/128.0).b; -    if (proj_tc.z > 0.0 && -        proj_tc.x < 1.0 && -        proj_tc.y < 1.0 && -        proj_tc.x > 0.0 && -        proj_tc.y > 0.0) -    { -        float amb_da = proj_ambiance; -        float lit = 0.0; - -        if (da > 0.0) -        { -            lit = da * dist_atten * noise; - -            float diff = clamp((l_dist-proj_focus)/proj_range, 0.0, 1.0); -            float lod = diff * proj_lod; -             -            vec4 plcol = texture2DLodDiffuse(projectionMap, proj_tc.xy, lod); -         -            dlit = color.rgb * plcol.rgb * plcol.a; -             -            col = dlit*lit*diff_tex*shadow; -            amb_da += (da*0.5)*(1.0-shadow)*proj_ambiance; -        } -         -        //float diff = clamp((proj_range-proj_focus)/proj_range, 0.0, 1.0); -        vec4 amb_plcol = texture2DLodAmbient(projectionMap, proj_tc.xy, proj_lod); -                             -        amb_da += (da*da*0.5+0.5)*(1.0-shadow)*proj_ambiance; -                 -        amb_da *= dist_atten * noise; -             -        amb_da = min(amb_da, 1.0-lit); -             -        col += amb_da*color.rgb*diff_tex.rgb*amb_plcol.rgb*amb_plcol.a; -    } -     - -    if (spec.a > 0.0) -    { -        vec3 npos = -normalize(pos); -        dlit *= min(da*6.0, 1.0) * dist_atten; - -        //vec3 ref = dot(pos+lv, norm); -        vec3 h = normalize(lv+npos); -        float nh = dot(norm, h); -        float nv = dot(norm, npos); -        float vh = dot(npos, h); -        float sa = nh; -        float fres = pow(1 - dot(h, npos), 5)*0.4+0.5; - -        float gtdenom = 2 * nh; -        float gt = max(0, min(gtdenom * nv / vh, gtdenom * da / vh)); -                                 -        if (nh > 0.0) -        { -            float scol = fres*texture2D(lightFunc, vec2(nh, spec.a)).r*gt/(nh*da); -            col += dlit*scol*spec.rgb*shadow; -            //col += spec.rgb; -        } -    }    - -    if (envIntensity > 0.0) -    { -        vec3 ref = reflect(normalize(pos), norm); -         -        //project from point pos in direction ref to plane proj_p, proj_n -        vec3 pdelta = proj_p-pos; -        float ds = dot(ref, proj_n); -         -        if (ds < 0.0) -        { -            vec3 pfinal = pos + ref * dot(pdelta, proj_n)/ds; -             -            vec4 stc = (proj_mat * vec4(pfinal.xyz, 1.0)); - -            if (stc.z > 0.0) -            { -                stc /= stc.w; -                                 -                if (stc.x < 1.0 && -                    stc.y < 1.0 && -                    stc.x > 0.0 && -                    stc.y > 0.0) -                { -                    col += color.rgb * texture2DLodSpecular(projectionMap, stc.xy, (1 - spec.a) * (proj_lod * 0.6)).rgb * shadow * envIntensity; -                } -            } -        } -    } - -    //not sure why, but this line prevents MATBUG-194 -    col = max(col, vec3(0.0)); - -    col = scaleDownLight(col); - -    //output linear space color as gamma correction happens down stream -    frag_color.rgb = col;    -    frag_color.a = 0.0; -} diff --git a/indra/newview/app_settings/shaders/class3/deferred/pointShadowBlurF.glsl b/indra/newview/app_settings/shaders/class3/deferred/pointShadowBlurF.glsl deleted file mode 100644 index ca9ce3a2e1..0000000000 --- a/indra/newview/app_settings/shaders/class3/deferred/pointShadowBlurF.glsl +++ /dev/null @@ -1,37 +0,0 @@ -/**  - * @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/reflectionProbeF.glsl b/indra/newview/app_settings/shaders/class3/deferred/reflectionProbeF.glsl new file mode 100644 index 0000000000..8c1323ba1a --- /dev/null +++ b/indra/newview/app_settings/shaders/class3/deferred/reflectionProbeF.glsl @@ -0,0 +1,476 @@ +/** + * @file class2/deferred/reflectionProbeF.glsl + * + * $LicenseInfo:firstyear=2022&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2022, 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_shader_texture_lod : enable + +#define FLT_MAX 3.402823466e+38 + +#define REFMAP_COUNT 256 +#define REF_SAMPLE_COUNT 64 //maximum number of samples to consider + +uniform samplerCubeArray   reflectionProbes; + +layout (std140, binding = 1) uniform ReflectionProbes +{ +    // list of OBBs for user override probes +    // box is a set of 3 planes outward facing planes and the depth of the box along that plane +    // for each box refBox[i]... +    /// box[0..2] - plane 0 .. 2 in [A,B,C,D] notation +    //  box[3][0..2] - plane thickness +    mat4 refBox[REFMAP_COUNT]; +    // list of bounding spheres for reflection probes sorted by distance to camera (closest first) +    vec4 refSphere[REFMAP_COUNT]; +    // index  of cube map in reflectionProbes for a corresponding reflection probe +    // e.g. cube map channel of refSphere[2] is stored in refIndex[2] +    // refIndex.x - cubemap channel in reflectionProbes +    // refIndex.y - index in refNeighbor of neighbor list (index is ivec4 index, not int index) +    // refIndex.z - number of neighbors +    // refIndex.w - priority, if negative, this probe has a box influence +    ivec4 refIndex[REFMAP_COUNT]; + +    // neighbor list data (refSphere indices, not cubemap array layer) +    ivec4 refNeighbor[1024]; + +    // number of reflection probes present in refSphere +    int refmapCount; + +    // intensity of ambient light from reflection probes +    float reflectionAmbiance; +}; + +// Inputs +uniform mat3 env_mat; + +// list of probeIndexes shader will actually use after "getRefIndex" is called +// (stores refIndex/refSphere indices, NOT rerflectionProbes layer) +int probeIndex[REF_SAMPLE_COUNT]; + +// number of probes stored in probeIndex +int probeInfluences = 0; + +bool isAbove(vec3 pos, vec4 plane) +{ +    return (dot(plane.xyz, pos) + plane.w) > 0; +} + +// return true if probe at index i influences position pos +bool shouldSampleProbe(int i, vec3 pos) +{ +    if (refIndex[i].w < 0) +    { +        vec4 v = refBox[i] * vec4(pos, 1.0); +        if (abs(v.x) > 1 ||  +            abs(v.y) > 1 || +            abs(v.z) > 1) +        { +            return false; +        } +    } +    else +    { +        vec3 delta = pos.xyz - refSphere[i].xyz; +        float d = dot(delta, delta); +        float r2 = refSphere[i].w; +        r2 *= r2; + +        if (d > r2) +        { //outside bounding sphere +            return false; +        } +    } + +    return true; +} + +// call before sampleRef +// populate "probeIndex" with N probe indices that influence pos where N is REF_SAMPLE_COUNT +// overall algorithm --  +void preProbeSample(vec3 pos) +{ +    // TODO: make some sort of structure that reduces the number of distance checks + +    for (int i = 0; i < refmapCount; ++i) +    { +        // found an influencing probe +        if (shouldSampleProbe(i, pos)) +        { +            probeIndex[probeInfluences] = i; +            ++probeInfluences; + +            int neighborIdx = refIndex[i].y; +            if (neighborIdx != -1) +            { +                int neighborCount = min(refIndex[i].z, REF_SAMPLE_COUNT-1); + +                int count = 0; +                while (count < neighborCount) +                { +                    // check up to REF_SAMPLE_COUNT-1 neighbors (neighborIdx is ivec4 index) + +                    int idx = refNeighbor[neighborIdx].x; +                    if (shouldSampleProbe(idx, pos)) +                    { +                        probeIndex[probeInfluences++] = idx; +                        if (probeInfluences == REF_SAMPLE_COUNT) +                        { +                            return; +                        } +                    } +                    count++; +                    if (count == neighborCount) +                    { +                        return; +                    } + +                    idx = refNeighbor[neighborIdx].y; +                    if (shouldSampleProbe(idx, pos)) +                    { +                        probeIndex[probeInfluences++] = idx; +                        if (probeInfluences == REF_SAMPLE_COUNT) +                        { +                            return; +                        } +                    } +                    count++; +                    if (count == neighborCount) +                    { +                        return; +                    } + +                    idx = refNeighbor[neighborIdx].z; +                    if (shouldSampleProbe(idx, pos)) +                    { +                        probeIndex[probeInfluences++] = idx; +                        if (probeInfluences == REF_SAMPLE_COUNT) +                        { +                            return; +                        } +                    } +                    count++; +                    if (count == neighborCount) +                    { +                        return; +                    } + +                    idx = refNeighbor[neighborIdx].w; +                    if (shouldSampleProbe(idx, pos)) +                    { +                        probeIndex[probeInfluences++] = idx; +                        if (probeInfluences == REF_SAMPLE_COUNT) +                        { +                            return; +                        } +                    } +                    count++; +                    if (count == neighborCount) +                    { +                        return; +                    } + +                    ++neighborIdx; +                } + +                return; +            } +        } +    } +} + +// from https://www.scratchapixel.com/lessons/3d-basic-rendering/minimal-ray-tracer-rendering-simple-shapes/ray-sphere-intersection + +// original reference implementation: +/* +bool intersect(const Ray &ray) const  +{  +        float t0, t1; // solutions for t if the ray intersects  +#if 0  +        // geometric solution +        Vec3f L = center - orig;  +        float tca = L.dotProduct(dir);  +        // if (tca < 0) return false; +        float d2 = L.dotProduct(L) - tca * tca;  +        if (d2 > radius2) return false;  +        float thc = sqrt(radius2 - d2);  +        t0 = tca - thc;  +        t1 = tca + thc;  +#else  +        // analytic solution +        Vec3f L = orig - center;  +        float a = dir.dotProduct(dir);  +        float b = 2 * dir.dotProduct(L);  +        float c = L.dotProduct(L) - radius2;  +        if (!solveQuadratic(a, b, c, t0, t1)) return false;  +#endif  +        if (t0 > t1) std::swap(t0, t1);  +  +        if (t0 < 0) {  +            t0 = t1; // if t0 is negative, let's use t1 instead  +            if (t0 < 0) return false; // both t0 and t1 are negative  +        }  +  +        t = t0;  +  +        return true;  +} */ + +// adapted -- assume that origin is inside sphere, return distance from origin to edge of sphere +vec3 sphereIntersect(vec3 origin, vec3 dir, vec3 center, float radius2) +{  +        float t0, t1; // solutions for t if the ray intersects  + +        vec3 L = center - origin;  +        float tca = dot(L,dir); + +        float d2 = dot(L,L) - tca * tca;  + +        float thc = sqrt(radius2 - d2);  +        t0 = tca - thc;  +        t1 = tca + thc;  +  +        vec3 v = origin + dir * t1; +        return v;  +}  + +// from https://seblagarde.wordpress.com/2012/09/29/image-based-lighting-approaches-and-parallax-corrected-cubemap/ +/* +vec3 DirectionWS = normalize(PositionWS - CameraWS); +vec3 ReflDirectionWS = reflect(DirectionWS, NormalWS); + +// Intersection with OBB convertto unit box space +// Transform in local unit parallax cube space (scaled and rotated) +vec3 RayLS = MulMatrix( float(3x3)WorldToLocal, ReflDirectionWS); +vec3 PositionLS = MulMatrix( WorldToLocal, PositionWS); + +vec3 Unitary = vec3(1.0f, 1.0f, 1.0f); +vec3 FirstPlaneIntersect  = (Unitary - PositionLS) / RayLS; +vec3 SecondPlaneIntersect = (-Unitary - PositionLS) / RayLS; +vec3 FurthestPlane = max(FirstPlaneIntersect, SecondPlaneIntersect); +float Distance = min(FurthestPlane.x, min(FurthestPlane.y, FurthestPlane.z)); + +// Use Distance in WS directly to recover intersection +vec3 IntersectPositionWS = PositionWS + ReflDirectionWS * Distance; +vec3 ReflDirectionWS = IntersectPositionWS - CubemapPositionWS; + +return texCUBE(envMap, ReflDirectionWS); +*/ + +// get point of intersection with given probe's box influence volume +// origin - ray origin in clip space +// dir - ray direction in clip space +// i - probe index in refBox/refSphere +vec3 boxIntersect(vec3 origin, vec3 dir, int i) +{ +    // Intersection with OBB convertto unit box space +    // Transform in local unit parallax cube space (scaled and rotated) +    mat4 clipToLocal = refBox[i]; + +    vec3 RayLS = mat3(clipToLocal) * dir; +    vec3 PositionLS = (clipToLocal * vec4(origin, 1.0)).xyz; + +    vec3 Unitary = vec3(1.0f, 1.0f, 1.0f); +    vec3 FirstPlaneIntersect  = (Unitary - PositionLS) / RayLS; +    vec3 SecondPlaneIntersect = (-Unitary - PositionLS) / RayLS; +    vec3 FurthestPlane = max(FirstPlaneIntersect, SecondPlaneIntersect); +    float Distance = min(FurthestPlane.x, min(FurthestPlane.y, FurthestPlane.z)); + +    // Use Distance in CS directly to recover intersection +    vec3 IntersectPositionCS = origin + dir * Distance; + +    return IntersectPositionCS; +} + + + +// Tap a sphere based reflection probe +// pos - position of pixel +// dir - pixel normal +// lod - which mip to bias towards (lower is higher res, sharper reflections) +// c - center of probe +// r2 - radius of probe squared +// i - index of probe  +// vi - point at which reflection vector struck the influence volume, in clip space +vec3 tapRefMap(vec3 pos, vec3 dir, float lod, vec3 c, float r2, int i) +{ +    //lod = max(lod, 1); +    // parallax adjustment + +    vec3 v; +    if (refIndex[i].w < 0) +    { +        v = boxIntersect(pos, dir, i); +    } +    else +    { +        v = sphereIntersect(pos, dir, c, r2); +    } + +    v -= c; +    v = env_mat * v; +    { +        float min_lod = textureQueryLod(reflectionProbes,v).y; // lower is higher res +        return textureLod(reflectionProbes, vec4(v.xyz, refIndex[i].x), max(min_lod, lod)).rgb; +        //return texture(reflectionProbes, vec4(v.xyz, refIndex[i].x)).rgb; +    } +} + +vec3 sampleProbes(vec3 pos, vec3 dir, float lod) +{ +    float wsum = 0.0; +    vec3 col = vec3(0,0,0); +    float vd2 = dot(pos,pos); // view distance squared + +    for (int idx = 0; idx < probeInfluences; ++idx) +    { +        int i = probeIndex[idx]; +        float r = refSphere[i].w; // radius of sphere volume +        float p = float(abs(refIndex[i].w)); // priority +        float rr = r*r; // radius squred +        float r1 = r * 0.1; // 75% of radius (outer sphere to start interpolating down) +        vec3 delta = pos.xyz-refSphere[i].xyz; +        float d2 = dot(delta,delta); +        float r2 = r1*r1;  +         +        { +            vec3 refcol = tapRefMap(pos, dir, lod, refSphere[i].xyz, rr, i); +             +            float w = 1.0/d2; + +            float atten = 1.0-max(d2-r2, 0.0)/(rr-r2); +            w *= atten; +            w *= p; // boost weight based on priority +            col += refcol*w; +             +            wsum += w; +        } +    } + +    if (probeInfluences <= 1) +    { //edge-of-scene probe or no probe influence, mix in with embiggened version of probes closest to camera  +        for (int idx = 0; idx < 8; ++idx) +        { +            if (refIndex[idx].w < 0) +            { // don't fallback to box probes, they are *very* specific +                continue; +            } +            int i = idx; +            vec3 delta = pos.xyz-refSphere[i].xyz; +            float d2 = dot(delta,delta); +             +            { +                vec3 refcol = tapRefMap(pos, dir, lod, refSphere[i].xyz, d2, i); +                 +                float w = 1.0/d2; +                w *= w; +                col += refcol*w; +                wsum += w; +            } +        } +    } + +    if (wsum > 0.0) +    { +        col *= 1.0/wsum; +    } +     +    return col; +} + +vec3 sampleProbeAmbient(vec3 pos, vec3 dir, float lod) +{ +    vec3 col = sampleProbes(pos, dir, lod); + +    //desaturate +    vec3 hcol = col *0.5; +     +    col *= 2.0; +    col = vec3( +        col.r + hcol.g + hcol.b, +        col.g + hcol.r + hcol.b, +        col.b + hcol.r + hcol.g +    ); +     +    col *= 0.333333; + +    return col*reflectionAmbiance; + +} + +// brighten a color so that at least one component is 1 +vec3 brighten(vec3 c) +{ +    float m = max(max(c.r, c.g), c.b); + +    if (m == 0) +    { +        return vec3(1,1,1); +    } + +    return c * 1.0/m; +} + + +void sampleReflectionProbes(inout vec3 ambenv, inout vec3 glossenv, inout vec3 legacyenv,  +        vec3 pos, vec3 norm, float glossiness, float envIntensity) +{ +    // TODO - don't hard code lods +    float reflection_lods = 8; +    preProbeSample(pos); + +    vec3 refnormpersp = reflect(pos.xyz, norm.xyz); + +    ambenv = sampleProbeAmbient(pos, norm, reflection_lods-1); + +    if (glossiness > 0.0) +    { +        float lod = (1.0-glossiness)*reflection_lods; +        glossenv = sampleProbes(pos, normalize(refnormpersp), lod); +    } + +    if (envIntensity > 0.0) +    { +        legacyenv = sampleProbes(pos, normalize(refnormpersp), 0.0); +    } +} + +void applyGlossEnv(inout vec3 color, vec3 glossenv, vec4 spec, vec3 pos, vec3 norm) +{ +    glossenv *= 0.35; // fudge darker +    float fresnel = 1.0+dot(normalize(pos.xyz), norm.xyz); +    float minf = spec.a * 0.1; +    fresnel = fresnel * (1.0-minf) + minf; +    glossenv *= spec.rgb*min(fresnel, 1.0); +    color.rgb += glossenv; +} + + void applyLegacyEnv(inout vec3 color, vec3 legacyenv, vec4 spec, vec3 pos, vec3 norm, float envIntensity) + { +    vec3 reflected_color = legacyenv; //*0.5; //fudge darker +    vec3 lookAt = normalize(pos); +    float fresnel = 1.0+dot(lookAt, norm.xyz); +    fresnel *= fresnel; +    fresnel = min(fresnel+envIntensity, 1.0); +    reflected_color *= (envIntensity*fresnel)*brighten(spec.rgb); +    color = mix(color.rgb, reflected_color, envIntensity); + }
\ No newline at end of file diff --git a/indra/newview/app_settings/shaders/class3/deferred/shVisF.glsl b/indra/newview/app_settings/shaders/class3/deferred/shVisF.glsl deleted file mode 100644 index c8991f7a18..0000000000 --- a/indra/newview/app_settings/shaders/class3/deferred/shVisF.glsl +++ /dev/null @@ -1,73 +0,0 @@ -/**  - * @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 deleted file mode 100644 index 8f32dfde79..0000000000 --- a/indra/newview/app_settings/shaders/class3/deferred/shVisV.glsl +++ /dev/null @@ -1,33 +0,0 @@ -/**  - * @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 deleted file mode 100644 index 345c07a354..0000000000 --- a/indra/newview/app_settings/shaders/class3/deferred/shadowAlphaBlendF.glsl +++ /dev/null @@ -1,58 +0,0 @@ -/**  - * @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 !defined(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 !defined(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 deleted file mode 100644 index af1461c297..0000000000 --- a/indra/newview/app_settings/shaders/class3/deferred/shadowAlphaBlendV.glsl +++ /dev/null @@ -1,66 +0,0 @@ -/**  - * @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 !defined(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 !defined(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 deleted file mode 100644 index 50f1ffd626..0000000000 --- a/indra/newview/app_settings/shaders/class3/deferred/shadowAlphaMaskF.glsl +++ /dev/null @@ -1,74 +0,0 @@ -/**  - * @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 !defined(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 !defined(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 deleted file mode 100644 index 6a646f5e9e..0000000000 --- a/indra/newview/app_settings/shaders/class3/deferred/shadowAlphaMaskV.glsl +++ /dev/null @@ -1,67 +0,0 @@ -/**  - * @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 !defined(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 !defined(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 deleted file mode 100644 index db8c75fb8a..0000000000 --- a/indra/newview/app_settings/shaders/class3/deferred/shadowCubeV.glsl +++ /dev/null @@ -1,50 +0,0 @@ -/**  - * @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 !defined(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 !defined(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 deleted file mode 100644 index 3350267130..0000000000 --- a/indra/newview/app_settings/shaders/class3/deferred/shadowF.glsl +++ /dev/null @@ -1,49 +0,0 @@ -/**  - * @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 !defined(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 deleted file mode 100644 index 2f69a353e8..0000000000 --- a/indra/newview/app_settings/shaders/class3/deferred/shadowUtil.glsl +++ /dev/null @@ -1,157 +0,0 @@ -/**  - * @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 deleted file mode 100644 index 6577fe0ecf..0000000000 --- a/indra/newview/app_settings/shaders/class3/deferred/shadowV.glsl +++ /dev/null @@ -1,62 +0,0 @@ -/**  - * @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 !defined(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 !defined(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/skyF.glsl b/indra/newview/app_settings/shaders/class3/deferred/skyF.glsl deleted file mode 100644 index a0b082ed7c..0000000000 --- a/indra/newview/app_settings/shaders/class3/deferred/skyF.glsl +++ /dev/null @@ -1,126 +0,0 @@ -/**  - * @file class3/deferred/skyF.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 camPosLocal; -uniform vec3 sun_dir; -uniform float sun_size; -uniform float far_z; -uniform mat4 inv_proj; -uniform mat4 inv_modelview; - -uniform sampler2D transmittance_texture; -uniform sampler3D scattering_texture; -uniform sampler3D single_mie_scattering_texture; -uniform sampler2D irradiance_texture; -uniform sampler2D rainbow_map; -uniform sampler2D halo_map; - -uniform float moisture_level; -uniform float droplet_radius; -uniform float ice_level; - -vec3 GetSolarLuminance(); -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 ColorFromRadiance(vec3 radiance); -vec3 rainbow(float d) -{ -    // d is the dot product of view and sun directions, so ranging -1.0..1.0 -    // 'interesting' values of d are the range -0.75..-0.825, when view is nearly opposite of sun vec -    // Rainbox texture mode is GL_REPEAT, so tc of -.75 is equiv to 0.25, -0.825 equiv to 0.175. - -    // SL-13629 Rainbow texture has colors within the correct .175...250 range, but order is inverted. -    // Rather than replace the texture, we mirror and translate the y tc to keep the colors within the -    // interesting range, but in reversed order:  i.e. d = (1 - d) - 1.575 -    d = clamp(-0.575 - d, 0.0, 1.0); - -    // With the colors in the lower 1/4 of the texture, inverting the coords leaves most of it inaccessible. -    // So, we can stretch the texcoord above the colors (ie > 0.25) to fill the entire remaining coordinate -    // space. This improves gradation, reduces banding within the rainbow interior. (1-0.25) / (0.425/0.25) = 4.2857 -    float interior_coord = max(0.0, d - 0.25) * 4.2857; -    d = clamp(d, 0.0, 0.25) + interior_coord; - -    float rad = (droplet_radius - 5.0f) / 1024.0f; -    return pow(texture2D(rainbow_map, vec2(rad, d)).rgb, vec3(1.8)) * moisture_level; -} - -vec3 halo22(float d) -{ -   float v = sqrt(max(0, 1 - (d*d))); -   return texture2D(halo_map, vec2(0, v)).rgb * ice_level; -} - -void main() -{ -    vec3 pos      = vec3((vary_frag * 2.0) - vec2(1.0, 1.0f), 1.0); -    vec4 view_pos = (inv_proj * vec4(pos, 1.0f)); - -    view_pos /= view_pos.w; - -    vec3 view_ray = (inv_modelview * vec4(view_pos.xyz, 0.0f)).xyz + camPosLocal; - -    vec3 view_direction = normalize(view_ray); -    vec3 sun_direction  = normalize(sun_dir); -    vec3 earth_center   = vec3(0, 0, -6360.0f); -    vec3 camPos = (camPosLocal / 1000.0f) - earth_center; - -    vec3 transmittance; -    vec3 radiance_sun  = GetSkyLuminance(camPos, view_direction, 0.0f, sun_direction, transmittance); -    vec3 solar_luminance = GetSolarLuminance(); - -    // If the view ray intersects the Sun, add the Sun radiance. -    float s = dot(view_direction, sun_direction); - -    // cheesy solar disc... -    if (s >= (sun_size * 0.999)) -    { -        radiance_sun += pow(smoothstep(0.0, 1.3, (s - (sun_size * 0.9))), 2.0) * solar_luminance * transmittance; -    } -    s = smoothstep(0.9, 1.0, s) * 16.0f; - -    vec3 color = ColorFromRadiance(radiance_sun); - -    float optic_d = dot(view_direction, sun_direction); -    vec3 halo_22 = halo22(optic_d); - -    color.rgb += rainbow(optic_d) * optic_d; -    color.rgb += halo_22; - -    color = pow(color, vec3(1.0/2.2)); - -    frag_data[0] = vec4(color, 1.0 + s); -    frag_data[1] = vec4(0.0); -    frag_data[2] = vec4(0.0, 1.0, 0.0, 1.0); -} - diff --git a/indra/newview/app_settings/shaders/class3/deferred/skyV.glsl b/indra/newview/app_settings/shaders/class3/deferred/skyV.glsl deleted file mode 100644 index 2eb222ada4..0000000000 --- a/indra/newview/app_settings/shaders/class3/deferred/skyV.glsl +++ /dev/null @@ -1,37 +0,0 @@ -/**  - * @file class3/deferred/skyV.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 at back of frustum for proper sky depth testing -	gl_Position = vec4(position.xy, 1.0f, 1.0); -    vary_frag = texcoord0; -} - diff --git a/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl index 7ed9e7b4fc..61757882bb 100644 --- a/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl +++ b/indra/newview/app_settings/shaders/class3/deferred/softenLightF.glsl @@ -1,31 +1,35 @@ -/**  - * @file class3/deferred/softenLightF.glsl +/** + * @file class2/deferred/softenLightF.glsl   *   * $LicenseInfo:firstyear=2007&license=viewerlgpl$   * Second Life Viewer Source Code   * Copyright (C) 2007, Linden Research, Inc. - *  + *   * This library is free software; you can redistribute it and/or   * modify it under the terms of the GNU Lesser General Public   * License as published by the Free Software Foundation;   * version 2.1 of the License only. - *  + *   * This library is distributed in the hope that it will be useful,   * but WITHOUT ANY WARRANTY; without even the implied warranty of   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU   * Lesser General Public License for more details. - *  + *   * You should have received a copy of the GNU Lesser General Public   * License along with this library; if not, write to the Free Software   * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA - *  + *   * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA   * $/LicenseInfo$   */ -  +  #extension GL_ARB_texture_rectangle : enable +#extension GL_ARB_shader_texture_lod : enable -/*[EXTRA_CODE_HERE]*/ +#define FLT_MAX 3.402823466e+38 + +#define REFMAP_COUNT 256 +#define REF_SAMPLE_COUNT 64 //maximum number of samples to consider  #ifdef DEFINE_GL_FRAGCOLOR  out vec4 frag_color; @@ -36,142 +40,153 @@ out vec4 frag_color;  uniform sampler2DRect diffuseRect;  uniform sampler2DRect specularRect;  uniform sampler2DRect normalMap; + +#if defined(HAS_SUN_SHADOW) || defined(HAS_SSAO)  uniform sampler2DRect lightMap; +#endif +  uniform sampler2DRect depthMap;  uniform sampler2D     lightFunc; -uniform samplerCube environmentMap;  uniform float blur_size;  uniform float blur_fidelity;  // Inputs -uniform vec4 morphFactor; -uniform vec3 camPosLocal; -uniform float cloud_shadow; -uniform float max_y; -uniform vec4 glow;  uniform mat3 env_mat; -uniform vec4 shadow_clip;  uniform vec3 sun_dir; +uniform vec3 moon_dir; +uniform int  sun_up_factor;  VARYING vec2 vary_fragcoord;  uniform mat4 inv_proj; -uniform mat4 inv_modelview; -  uniform vec2 screen_res; -uniform sampler2D transmittance_texture; -uniform sampler3D scattering_texture; -uniform sampler3D single_mie_scattering_texture; -uniform sampler2D irradiance_texture; +vec3 getNorm(vec2 pos_screen); +vec4 getPositionWithDepth(vec2 pos_screen, float depth); -uniform sampler2D sh_input_r; -uniform sampler2D sh_input_g; -uniform sampler2D sh_input_b; +void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, out vec3 sunlit, out vec3 amblit, out vec3 additive, out vec3 atten, bool use_ao); +float getAmbientClamp(); +vec3  atmosFragLighting(vec3 l, vec3 additive, vec3 atten); +vec3  scaleSoftClipFrag(vec3 l); +vec3  fullbrightAtmosTransportFrag(vec3 light, vec3 additive, vec3 atten); +vec3  fullbrightScaleSoftClip(vec3 light); -vec3 GetSunAndSkyIrradiance(vec3 camPos, vec3 norm, vec3 dir, out vec3 sky_irradiance); -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); +// reflection probe interface +void sampleReflectionProbes(inout vec3 ambenv, inout vec3 glossenv, inout vec3 legacyEnv,  +        vec3 pos, vec3 norm, float glossiness, float envIntensity); +void applyGlossEnv(inout vec3 color, vec3 glossenv, vec4 spec, vec3 pos, vec3 norm); +void applyLegacyEnv(inout vec3 color, vec3 legacyenv, vec4 spec, vec3 pos, vec3 norm, float envIntensity); -vec3 ColorFromRadiance(vec3 radiance); -vec4 getPositionWithDepth(vec2 pos_screen, float depth); -vec4 getPosition(vec2 pos_screen); -vec3 getNorm(vec2 pos_screen); +vec3 linear_to_srgb(vec3 c); +vec3 srgb_to_linear(vec3 c);  #ifdef WATER_FOG  vec4 applyWaterFogView(vec3 pos, vec4 color);  #endif -void main()  +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); +    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 = getNorm(tc); +    norm.xyz           = getNorm(tc); + +    vec3  light_dir   = (sun_up_factor == 1) ? sun_dir : moon_dir; +    float da          = clamp(dot(norm.xyz, light_dir.xyz), 0.0, 1.0); +    float light_gamma = 1.0 / 1.3; +    da                = pow(da, light_gamma); -    float da = max(dot(norm.xyz, sun_dir.xyz), 0.0); +    vec4 diffuse     = texture2DRect(diffuseRect, tc); +         diffuse.rgb = linear_to_srgb(diffuse.rgb); // SL-14025 +    vec4 spec        = texture2DRect(specularRect, vary_fragcoord.xy); -    vec4 diffuse = texture2DRect(diffuseRect, tc); // sRGB -    diffuse.rgb = srgb_to_linear(diffuse.rgb); -    vec3 col; +#if defined(HAS_SUN_SHADOW) || defined(HAS_SSAO) +    vec2 scol_ambocc = texture2DRect(lightMap, vary_fragcoord.xy).rg; +    scol_ambocc      = pow(scol_ambocc, vec2(light_gamma)); +    float scol       = max(scol_ambocc.r, diffuse.a); +    float ambocc     = scol_ambocc.g; +#else +    float scol = 1.0; +    float ambocc = 1.0; +#endif + +    vec3  color = vec3(0);      float bloom = 0.0; + +    vec3 sunlit; +    vec3 amblit; +    vec3 additive; +    vec3 atten; + +    calcAtmosphericVars(pos.xyz, light_dir, ambocc, sunlit, amblit, additive, atten, true); + +    //vec3 amb_vec = env_mat * norm.xyz; + +    vec3 ambenv; +    vec3 glossenv; +    vec3 legacyenv; +    sampleReflectionProbes(ambenv, glossenv, legacyenv, pos.xyz, norm.xyz, spec.a, envIntensity); + +    amblit = max(ambenv, amblit); +    color.rgb = amblit*ambocc; + +    //float ambient = min(abs(dot(norm.xyz, sun_dir.xyz)), 1.0); +    //ambient *= 0.5; +    //ambient *= ambient; +    //ambient = (1.0 - ambient); +    //color.rgb *= ambient; + +    vec3 sun_contrib = min(da, scol) * sunlit; +    color.rgb += sun_contrib; +    color.rgb = min(color.rgb, vec3(1,1,1)); +    color.rgb *= diffuse.rgb; + +    vec3 refnormpersp = reflect(pos.xyz, norm.xyz); + +    if (spec.a > 0.0)  // specular reflection      { -        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; - -        float scol = max(scol_ambocc.r, diffuse.a);  - -        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)); -        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)); - -        vec3 transmittance; -        vec3 sky_irradiance; -        vec3 sun_irradiance = GetSunAndSkyIrradiance(camPos, norm.xyz, sun_dir, sky_irradiance); -        vec3 inscatter = GetSkyLuminanceToPoint(camPos, (pos / 1000.f) + vec3(0, 0, 6360.0f), scol, sun_dir, transmittance); - -        vec3 radiance   = scol * (sun_irradiance + sky_irradiance) + inscatter; -        vec3 atmo_color = ColorFromRadiance(radiance); - -        col = atmo_color + indirect; -        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 * 0.25; -            bloom = dot(spec_contrib, spec_contrib); -            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 +        float sa        = dot(normalize(refnormpersp), light_dir.xyz); +        vec3  dumbshiny = sunlit * scol * (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; +        color.rgb += spec_contrib; + +        // add reflection map - EXPERIMENTAL WORK IN PROGRESS +        applyGlossEnv(color, glossenv, spec, pos.xyz, norm.xyz);      } -    //output linear since gamma correction happens down stream -    frag_color.rgb = col; +    color.rgb = mix(color.rgb, diffuse.rgb, diffuse.a); + +    if (envIntensity > 0.0) +    {  // add environmentmap +        //fudge darker +        legacyenv *= 0.5*diffuse.a+0.5;; +        applyLegacyEnv(color, legacyenv, spec, pos.xyz, norm.xyz, envIntensity); +    } + +    if (norm.w < 0.5) +    { +        color = mix(atmosFragLighting(color, additive, atten), fullbrightAtmosTransportFrag(color, additive, atten), diffuse.a); +        color = mix(scaleSoftClipFrag(color), fullbrightScaleSoftClip(color), diffuse.a); +    } + +#ifdef WATER_FOG +    vec4 fogged = applyWaterFogView(pos.xyz, vec4(color, bloom)); +    color       = fogged.rgb; +    bloom       = fogged.a; +#endif + +    // convert to linear as fullscreen lights need to sum in linear colorspace +    // and will be gamma (re)corrected downstream... +    //color = vec3(ambocc); +    //color = ambenv; +    //color.b = diffuse.a; +    frag_color.rgb = srgb_to_linear(color.rgb);      frag_color.a = bloom;  } diff --git a/indra/newview/app_settings/shaders/class3/deferred/softenLightV.glsl b/indra/newview/app_settings/shaders/class3/deferred/softenLightV.glsl deleted file mode 100644 index 9d872b8df8..0000000000 --- a/indra/newview/app_settings/shaders/class3/deferred/softenLightV.glsl +++ /dev/null @@ -1,38 +0,0 @@ -/**  - * @file class3/deferred/softenLightV.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 vec2 vary_fragcoord; - -uniform mat4 modelview_projection_matrix; -uniform vec2 screen_res; - -void main() -{ -	//transform vertex -	vec4 pos = modelview_projection_matrix * vec4(position.xyz, 1.0); -	gl_Position = pos;  -	vary_fragcoord = (pos.xy*0.5+0.5)*screen_res; -} diff --git a/indra/newview/app_settings/shaders/class3/deferred/spotLightF.glsl b/indra/newview/app_settings/shaders/class3/deferred/spotLightF.glsl deleted file mode 100644 index 56b0f4e5ce..0000000000 --- a/indra/newview/app_settings/shaders/class3/deferred/spotLightF.glsl +++ /dev/null @@ -1,287 +0,0 @@ -/**  - * @file spotLightF.glsl - * - * $LicenseInfo:firstyear=2007&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2007, Linden Research, Inc. - *  - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - *  - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU - * Lesser General Public License for more details. - *  - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA - *  - * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA - * $/LicenseInfo$ - */ -  -#extension GL_ARB_texture_rectangle : enable -#extension GL_ARB_shader_texture_lod : enable - -/*[EXTRA_CODE_HERE]*/ - -#ifdef DEFINE_GL_FRAGCOLOR -out vec4 frag_color; -#else -#define frag_color gl_FragColor -#endif - -uniform sampler2DRect diffuseRect; -uniform sampler2DRect specularRect; -uniform sampler2DRect depthMap; -uniform sampler2DRect normalMap; -uniform samplerCube environmentMap; -uniform sampler2DRect lightMap; -uniform sampler2D noiseMap; -uniform sampler2D projectionMap; -uniform sampler2D lightFunc; - -uniform mat4 proj_mat; //screen space to light space -uniform float proj_near; //near clip for projection -uniform vec3 proj_p; //plane projection is emitting from (in screen space) -uniform vec3 proj_n; -uniform float proj_focus; //distance from plane to begin blurring -uniform float proj_lod;  //(number of mips in proj map) -uniform float proj_range; //range between near clip and far clip plane of projection -uniform float proj_ambient_lod; -uniform float proj_ambiance; -uniform float near_clip; -uniform float far_clip; - -uniform vec3 proj_origin; //origin of projection to be used for angular attenuation -uniform float sun_wash; -uniform int proj_shadow_idx; -uniform float shadow_fade; - -uniform float size; -uniform vec3 color; -uniform float falloff; - -VARYING vec3 trans_center; -VARYING vec4 vary_fragcoord; -uniform vec2 screen_res; - -uniform mat4 inv_proj; - -vec3 getNorm(vec2 pos_screen); - -vec4 texture2DLodSpecular(sampler2D projectionMap, vec2 tc, float lod) -{ -    vec4 ret = texture2DLod(projectionMap, tc, lod); -     -    vec2 dist = vec2(0.5) - abs(tc-vec2(0.5)); -     -    float det = min(lod/(proj_lod*0.5), 1.0); -     -    float d = min(dist.x, dist.y); -     -    d *= min(1, d * (proj_lod - lod)); -     -    float edge = 0.25*det; -     -    ret *= clamp(d/edge, 0.0, 1.0); -     -    return ret; -} - -vec4 texture2DLodDiffuse(sampler2D projectionMap, vec2 tc, float lod) -{ -    vec4 ret = texture2DLod(projectionMap, tc, lod); -     -    vec2 dist = vec2(0.5) - abs(tc-vec2(0.5)); -     -    float det = min(lod/(proj_lod*0.5), 1.0); -     -    float d = min(dist.x, dist.y); -     -    float edge = 0.25*det; -         -    ret *= clamp(d/edge, 0.0, 1.0); -     -    return ret; -} - -vec4 texture2DLodAmbient(sampler2D projectionMap, vec2 tc, float lod) -{ -    vec4 ret = texture2DLod(projectionMap, tc, lod); -     -    vec2 dist = tc-vec2(0.5); -     -    float d = dot(dist,dist); -         -    ret *= min(clamp((0.25-d)/0.25, 0.0, 1.0), 1.0); -     -    return ret; -} - - -vec4 getPosition(vec2 pos_screen); - -void main()  -{ -    vec4 frag = vary_fragcoord; -    frag.xyz /= frag.w; -    frag.xyz = frag.xyz*0.5+0.5; -    frag.xy *= screen_res; -     -    vec3 pos = getPosition(frag.xy).xyz; -    vec3 lv = trans_center.xyz-pos.xyz; -    float dist = length(lv); -    dist /= size; -    if (dist > 1.0) -    { -        discard; -    } -     -    float shadow = 1.0; -     -    if (proj_shadow_idx >= 0) -    { -        vec4 shd = texture2DRect(lightMap, frag.xy); -        shadow = (proj_shadow_idx == 0) ? shd.b : shd.a; -        shadow += shadow_fade; -        shadow = clamp(shadow, 0.0, 1.0); -    } -     -    vec3 norm = texture2DRect(normalMap, frag.xy).xyz; -    float envIntensity = norm.z; -    norm = getNorm(frag.xy); -     -    norm = normalize(norm); -    float l_dist = -dot(lv, proj_n); -     -    vec4 proj_tc = (proj_mat * vec4(pos.xyz, 1.0)); -    if (proj_tc.z < 0.0) -    { -        discard; -    } -     -    proj_tc.xyz /= proj_tc.w; -     -    float fa = (falloff*0.5) + 1.0; -    float dist_atten = min(1.0 - (dist - 1.0 * (1.0 - fa)) / fa, 1.0); -    dist_atten *= dist_atten; -    dist_atten *= 2.0; - -    if (dist_atten <= 0.0) -    { -        discard; -    } -     -    lv = proj_origin-pos.xyz; -    lv = normalize(lv); -    float da = dot(norm, lv); -         -    vec3 col = vec3(0,0,0); -         -    vec3 diff_tex = srgb_to_linear(texture2DRect(diffuseRect, frag.xy).rgb); -         -    vec4 spec = texture2DRect(specularRect, frag.xy); - -    vec3 dlit = vec3(0, 0, 0); - -    float noise = texture2D(noiseMap, frag.xy/128.0).b; -    if (proj_tc.z > 0.0 && -        proj_tc.x < 1.0 && -        proj_tc.y < 1.0 && -        proj_tc.x > 0.0 && -        proj_tc.y > 0.0) -    { -        float amb_da = proj_ambiance; -        float lit = 0.0; -         -        if (da > 0.0) -        { -            lit = da * dist_atten * noise; - -            float diff = clamp((l_dist-proj_focus)/proj_range, 0.0, 1.0); -            float lod = diff * proj_lod; -             -            vec4 plcol = texture2DLodDiffuse(projectionMap, proj_tc.xy, lod); -         -            dlit = color.rgb * plcol.rgb * plcol.a; -             -            col = dlit*lit*diff_tex*shadow; -            amb_da += (da*0.5)*(1.0-shadow)*proj_ambiance; -        } -         -        //float diff = clamp((proj_range-proj_focus)/proj_range, 0.0, 1.0); -        vec4 amb_plcol = texture2DLodAmbient(projectionMap, proj_tc.xy, proj_lod); -                             -        amb_da += (da*da*0.5+0.5)*(1.0-shadow)*proj_ambiance; -                 -        amb_da *= dist_atten * noise; -             -        amb_da = min(amb_da, 1.0-lit); -             -        col += amb_da*color.rgb*diff_tex.rgb*amb_plcol.rgb*amb_plcol.a; -    } -     - -    if (spec.a > 0.0) -    { -        dlit *= min(da*6.0, 1.0) * dist_atten; -        vec3 npos = -normalize(pos); - -        //vec3 ref = dot(pos+lv, norm); -        vec3 h = normalize(lv+npos); -        float nh = dot(norm, h); -        float nv = dot(norm, npos); -        float vh = dot(npos, h); -        float sa = nh; -        float fres = pow(1 - dot(h, npos), 5)*0.4+0.5; - -        float gtdenom = 2 * nh; -        float gt = max(0, min(gtdenom * nv / vh, gtdenom * da / vh)); -                                 -        if (nh > 0.0) -        { -            float scol = fres*texture2D(lightFunc, vec2(nh, spec.a)).r*gt/(nh*da); -            col += dlit*scol*spec.rgb*shadow; -        } -    }    -     - -    if (envIntensity > 0.0) -    { -        vec3 ref = reflect(normalize(pos), norm); -         -        //project from point pos in direction ref to plane proj_p, proj_n -        vec3 pdelta = proj_p-pos; -        float ds = dot(ref, proj_n); -         -        if (ds < 0.0) -        { -            vec3 pfinal = pos + ref * dot(pdelta, proj_n)/ds; -             -            vec4 stc = (proj_mat * vec4(pfinal.xyz, 1.0)); - -            if (stc.z > 0.0) -            { -                stc /= stc.w; -                                 -                if (stc.x < 1.0 && -                    stc.y < 1.0 && -                    stc.x > 0.0 && -                    stc.y > 0.0) -                { -                    col += color.rgb * texture2DLodSpecular(projectionMap, stc.xy, (1 - spec.a) * (proj_lod * 0.6)).rgb * shadow * envIntensity; -                } -            } -        } -    } -     -    //not sure why, but this line prevents MATBUG-194 -    col = max(col, vec3(0.0)); - -    frag_color.rgb = col;    -    frag_color.a = 0.0; -} diff --git a/indra/newview/app_settings/shaders/class3/deferred/sunLightF.glsl b/indra/newview/app_settings/shaders/class3/deferred/sunLightF.glsl deleted file mode 100644 index 112b498c90..0000000000 --- a/indra/newview/app_settings/shaders/class3/deferred/sunLightF.glsl +++ /dev/null @@ -1,57 +0,0 @@ -/**  - * @file class3\deferred\sunLightF.glsl - * - * $LicenseInfo:firstyear=2007&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2007, Linden Research, Inc. - *  - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - *  - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU - * Lesser General Public License for more details. - *  - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA - *  - * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA - * $/LicenseInfo$ - */ - -#extension GL_ARB_texture_rectangle : enable - -/*[EXTRA_CODE_HERE]*/ - -#ifdef DEFINE_GL_FRAGCOLOR -out vec4 frag_color; -#else -#define frag_color gl_FragColor -#endif - -//class 2, shadows, no SSAO - -// Inputs -VARYING vec2 vary_fragcoord; - -vec4 getPosition(vec2 pos_screen); -vec3 getNorm(vec2 pos_screen); - -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); - -	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 deleted file mode 100644 index 342a2ff3ed..0000000000 --- a/indra/newview/app_settings/shaders/class3/deferred/sunLightSSAOF.glsl +++ /dev/null @@ -1,61 +0,0 @@ -/**  - * @file class3\deferred\sunLightSSAOF.glsl - * $LicenseInfo:firstyear=2007&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2007, Linden Research, Inc. - *  - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - *  - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU - * Lesser General Public License for more details. - *  - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA - *  - * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA - * $/LicenseInfo$ - */ -  -#extension GL_ARB_texture_rectangle : enable - -/*[EXTRA_CODE_HERE]*/ - -#ifdef DEFINE_GL_FRAGCOLOR -out vec4 frag_color; -#else -#define frag_color gl_FragColor -#endif - -//class 2 -- shadows and SSAO - -// Inputs -VARYING vec2 vary_fragcoord; - -uniform vec3 sun_dir; - -vec4 getPosition(vec2 pos_screen); -vec3 getNorm(vec2 pos_screen); - -float sampleDirectionalShadow(vec3 pos, vec3 norm, vec2 pos_screen); -float sampleSpotShadow(vec3 pos, vec3 norm, int index, vec2 pos_screen); - -//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; -	vec4 pos        = getPosition(pos_screen); -	vec3 norm       = getNorm(pos_screen); - -	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/sunLightV.glsl b/indra/newview/app_settings/shaders/class3/deferred/sunLightV.glsl deleted file mode 100644 index bc5eb5181d..0000000000 --- a/indra/newview/app_settings/shaders/class3/deferred/sunLightV.glsl +++ /dev/null @@ -1,41 +0,0 @@ -/**  - * @file sunLightV.glsl - * - * $LicenseInfo:firstyear=2007&license=viewerlgpl$ - * Second Life Viewer Source Code - * Copyright (C) 2007, Linden Research, Inc. - *  - * This library is free software; you can redistribute it and/or - * modify it under the terms of the GNU Lesser General Public - * License as published by the Free Software Foundation; - * version 2.1 of the License only. - *  - * This library is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU - * Lesser General Public License for more details. - *  - * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA - *  - * Linden Research, Inc., 945 Battery Street, San Francisco, CA  94111  USA - * $/LicenseInfo$ - */ - -uniform mat4 modelview_projection_matrix; - -ATTRIBUTE vec3 position; - -VARYING vec2 vary_fragcoord; - -uniform vec2 screen_res; - -void main() -{ -	//transform vertex -	vec4 pos = modelview_projection_matrix * vec4(position.xyz, 1.0); -	gl_Position = pos;  -	 -	vary_fragcoord = (pos.xy * 0.5 + 0.5)*screen_res;	 -} diff --git a/indra/newview/app_settings/shaders/class3/deferred/treeShadowF.glsl b/indra/newview/app_settings/shaders/class3/deferred/treeShadowF.glsl deleted file mode 100644 index 41673d1669..0000000000 --- a/indra/newview/app_settings/shaders/class3/deferred/treeShadowF.glsl +++ /dev/null @@ -1,59 +0,0 @@ -/**  - * @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 !defined(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 deleted file mode 100644 index 15e769ac10..0000000000 --- a/indra/newview/app_settings/shaders/class3/deferred/treeShadowV.glsl +++ /dev/null @@ -1,43 +0,0 @@ -/**  - * @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 deleted file mode 100644 index 540226e672..0000000000 --- a/indra/newview/app_settings/shaders/class3/deferred/underWaterF.glsl +++ /dev/null @@ -1,115 +0,0 @@ -/** - * @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; - -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 deleted file mode 100644 index c65cf48c67..0000000000 --- a/indra/newview/app_settings/shaders/class3/deferred/waterF.glsl +++ /dev/null @@ -1,174 +0,0 @@ -/**  - * @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); -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 deleted file mode 100644 index 02000d90ca..0000000000 --- a/indra/newview/app_settings/shaders/class3/deferred/waterV.glsl +++ /dev/null @@ -1,95 +0,0 @@ -/**  - * @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; -} | 
