summaryrefslogtreecommitdiff
path: root/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl')
-rw-r--r--indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl104
1 files changed, 57 insertions, 47 deletions
diff --git a/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl b/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl
index bcd93d9a2d..84642b2f98 100644
--- a/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl
+++ b/indra/newview/app_settings/shaders/class1/deferred/softenLightF.glsl
@@ -36,7 +36,6 @@ out vec4 frag_color;
uniform sampler2DRect diffuseRect;
uniform sampler2DRect specularRect;
-uniform sampler2DRect positionMap;
uniform sampler2DRect normalMap;
uniform sampler2DRect lightMap;
uniform sampler2DRect depthMap;
@@ -47,13 +46,7 @@ uniform float blur_size;
uniform float blur_fidelity;
// Inputs
-uniform vec4 morphFactor;
-uniform vec3 camPosLocal;
-//uniform vec4 camPosWorld;
-uniform vec4 gamma;
-uniform float global_gamma;
uniform mat3 env_mat;
-uniform mat3 ssao_effect_mat;
uniform vec3 sun_dir;
uniform vec3 moon_dir;
@@ -63,21 +56,20 @@ VARYING vec2 vary_fragcoord;
uniform mat4 inv_proj;
uniform vec2 screen_res;
-#ifdef WATER_FOG
-vec4 applyWaterFogView(vec3 pos, vec4 color);
-#endif
-
vec3 getNorm(vec2 pos_screen);
-vec3 atmosFragLighting(vec3 l, vec3 additive, vec3 atten);
+vec4 getPositionWithDepth(vec2 pos_screen, float depth);
-float getAmbientClamp();
void calcAtmosphericVars(vec3 inPositionEye, float ambFactor, out vec3 sunlit, out vec3 amblit, out vec3 additive, out vec3 atten);
-
+float getAmbientClamp();
+vec3 atmosFragLighting(vec3 l, vec3 additive, vec3 atten);
vec3 scaleSoftClipFrag(vec3 l);
-vec3 srgb_to_linear(vec3 c);
+
vec3 linear_to_srgb(vec3 c);
+vec3 srgb_to_linear(vec3 c);
-vec4 getPositionWithDepth(vec2 pos_screen, float depth);
+#ifdef WATER_FOG
+vec4 applyWaterFogView(vec3 pos, vec4 color);
+#endif
void main()
{
@@ -88,50 +80,49 @@ void main()
float envIntensity = norm.z;
norm.xyz = getNorm(tc);
- float light_gamma = 1.0/1.3;
vec3 light_dir = (sun_up_factor == 1) ? sun_dir : moon_dir;
-
float da = dot(normalize(norm.xyz), light_dir.xyz);
da = clamp(da, -1.0, 1.0);
float final_da = da;
final_da = clamp(final_da, 0.0, 1.0);
- //final_da = pow(final_da, light_gamma);
- vec4 gamma_diff = texture2DRect(diffuseRect, tc);
- vec4 diffuse = gamma_diff;
- diffuse.rgb = srgb_to_linear(gamma_diff.rgb);
+ vec4 diffuse_linear = texture2DRect(diffuseRect, tc);
+ vec4 diffuse_srgb = vec4(linear_to_srgb(diffuse_linear.rgb), diffuse_linear.a);
vec4 spec = texture2DRect(specularRect, vary_fragcoord.xy);
- vec3 col;
+ vec3 color = vec3(0);
float bloom = 0.0;
{
+ float ambocc = 1.0; // no AO...
+
vec3 sunlit;
vec3 amblit;
vec3 additive;
vec3 atten;
-
- calcAtmosphericVars(pos.xyz, 1.0, sunlit, amblit, additive, atten);
+
+ calcAtmosphericVars(pos.xyz, ambocc, sunlit, amblit, additive, atten);
float ambient = da;
ambient *= 0.5;
ambient *= ambient;
+ ambient = max(getAmbientClamp(), ambient);
ambient = 1.0 - ambient;
vec3 sun_contrib = final_da * sunlit;
- col.rgb = amblit;
- col.rgb *= ambient;
+ color.rgb = amblit;
+ color.rgb *= ambient;
-vec3 post_ambient = col.rgb;
+vec3 post_ambient = color.rgb;
- col.rgb += sun_contrib;
+ color.rgb += sun_contrib;
-vec3 post_sunlight = col.rgb;
+vec3 post_sunlight = color.rgb;
- col.rgb *= gamma_diff.rgb;
+ color.rgb *= diffuse_linear.rgb;
-vec3 post_diffuse = col.rgb;
+vec3 post_diffuse = color.rgb;
vec3 refnormpersp = normalize(reflect(pos.xyz, norm.xyz));
@@ -152,40 +143,59 @@ vec3 post_diffuse = col.rgb;
if (nh > 0.0)
{
- float scol = fres*texture2D(lightFunc, vec2(nh, spec.a)).r*gt/(nh*da);
- vec3 speccol = sun_contrib*scol*spec.rgb;
+ float scontrib = fres*texture2D(lightFunc, vec2(nh, spec.a)).r*gt/(nh*da);
+ vec3 speccol = sun_contrib*scontrib*spec.rgb;
speccol = clamp(speccol, vec3(0), vec3(1));
- bloom = dot(speccol, speccol) / 6;
- col += speccol;
+ bloom += dot (speccol, speccol) / 6;
+ color += speccol;
}
}
- vec3 post_spec = col.rgb;
+ vec3 post_spec = color.rgb;
- col.rgb += diffuse.a * diffuse.rgb;
+ color.rgb += diffuse_srgb.a * diffuse_srgb.rgb;
if (envIntensity > 0.0)
{ //add environmentmap
vec3 env_vec = env_mat * refnormpersp;
- vec3 refcol = textureCube(environmentMap, env_vec).rgb;
- col = mix(col.rgb, refcol, envIntensity);
+ vec3 reflected_color = textureCube(environmentMap, env_vec).rgb;
+ color = mix(color.rgb, reflected_color, envIntensity);
}
-
+
+vec3 post_env = color.rgb;
+
if (norm.w < 1)
{
- col = atmosFragLighting(col, additive, atten);
- col = scaleSoftClipFrag(col);
+ color = atmosFragLighting(color, additive, atten);
+ color = scaleSoftClipFrag(color);
}
-vec3 post_atmo = col.rgb;
+vec3 post_atmo = color.rgb;
#ifdef WATER_FOG
- vec4 fogged = applyWaterFogView(pos.xyz,vec4(col, bloom));
- col = fogged.rgb;
+ vec4 fogged = applyWaterFogView(pos.xyz,vec4(color, bloom));
+ color = fogged.rgb;
bloom = fogged.a;
#endif
+
+//color.rgb = amblit;
+//color.rgb = vec3(ambient);
+//color.rgb = sunlit;
+//color.rgb = post_ambient;
+//color.rgb = vec3(final_da);
+//color.rgb = sun_contrib;
+//color.rgb = post_sunlight;
+//color.rgb = diffuse_srgb.rgb;
+//color.rgb = post_diffuse;
+//color.rgb = post_spec;
+//color.rgb = post_env;
+//color.rgb = post_atmo;
+
+// convert to linear as fullscreen lights need to sum in linear colorspace
+// and will be gamma (re)corrected downstream...
+ color.rgb = srgb_to_linear(color.rgb);
}
- frag_color.rgb = col.rgb;
+ frag_color.rgb = color.rgb;
frag_color.a = bloom;
}