Skip to content
Snippets Groups Projects
Commit 7c7d7126 authored by David Parks's avatar David Parks
Browse files

WIP - Windlight sun lighting should happen in sRGB space, not linear space. ...

WIP - Windlight sun lighting should happen in sRGB space, not linear space.  This keeps ambient from getting overblown and better matches environment lighting with ALM on/off.
parent 90ad38db
No related branches found
No related tags found
No related merge requests found
Showing
with 53 additions and 36 deletions
...@@ -251,7 +251,7 @@ vec3 post_ambient = color.rgb; ...@@ -251,7 +251,7 @@ vec3 post_ambient = color.rgb;
vec3 post_sunlight = color.rgb; vec3 post_sunlight = color.rgb;
color.rgb *= diffuse_linear.rgb; color.rgb *= diffuse_srgb.rgb;
vec3 post_diffuse = color.rgb; vec3 post_diffuse = color.rgb;
...@@ -261,6 +261,11 @@ vec3 post_atmo = color.rgb; ...@@ -261,6 +261,11 @@ vec3 post_atmo = color.rgb;
vec4 light = vec4(0,0,0,0); vec4 light = vec4(0,0,0,0);
color.rgb = scaleSoftClipFrag(color.rgb);
//convert to linear before applying local lights
color.rgb = srgb_to_linear(color.rgb);
#define LIGHT_LOOP(i) light.rgb += calcPointLightOrSpotLight(light_diffuse[i].rgb, diffuse_linear.rgb, pos.xyz, norm, light_position[i], light_direction[i].xyz, light_attenuation[i].x, light_attenuation[i].y, light_attenuation[i].z, light_attenuation[i].w); #define LIGHT_LOOP(i) light.rgb += calcPointLightOrSpotLight(light_diffuse[i].rgb, diffuse_linear.rgb, pos.xyz, norm, light_position[i], light_direction[i].xyz, light_attenuation[i].x, light_attenuation[i].y, light_attenuation[i].z, light_attenuation[i].w);
LIGHT_LOOP(1) LIGHT_LOOP(1)
...@@ -275,9 +280,6 @@ vec3 post_atmo = color.rgb; ...@@ -275,9 +280,6 @@ vec3 post_atmo = color.rgb;
#if !defined(LOCAL_LIGHT_KILL) #if !defined(LOCAL_LIGHT_KILL)
color.rgb += light.rgb; color.rgb += light.rgb;
#endif #endif
color.rgb = scaleSoftClipFrag(color.rgb);
// back to sRGB as we're going directly to the final RT post-deferred gamma correction // back to sRGB as we're going directly to the final RT post-deferred gamma correction
color.rgb = linear_to_srgb(color.rgb); color.rgb = linear_to_srgb(color.rgb);
......
...@@ -117,7 +117,7 @@ vec3 calcPointLightOrSpotLight(vec3 light_col, vec3 npos, vec3 diffuse, vec4 spe ...@@ -117,7 +117,7 @@ vec3 calcPointLightOrSpotLight(vec3 light_col, vec3 npos, vec3 diffuse, vec4 spe
// spotlight coefficient. // spotlight coefficient.
float spot = max(dot(-ln, lv), is_pointlight); float spot = max(dot(-ln, lv), is_pointlight);
da *= spot*spot; // GL_SPOT_EXPONENT=2 da *= spot*spot; // GL_SPOT_EXPONENT=2
//angular attenuation //angular attenuation
da *= dot(n, lv); da *= dot(n, lv);
...@@ -215,8 +215,7 @@ void main() ...@@ -215,8 +215,7 @@ void main()
vec4 diffuse_tap = texture2D(diffuseMap, vary_texcoord0.xy); vec4 diffuse_tap = texture2D(diffuseMap, vary_texcoord0.xy);
diffuse_tap.rgb *= vertex_color.rgb; diffuse_tap.rgb *= vertex_color.rgb;
//diffuse_tap = vec4(1,1,1,1);
//#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND) //#if (DIFFUSE_ALPHA_MODE == DIFFUSE_ALPHA_MODE_BLEND)
vec4 diffuse_srgb = diffuse_tap; vec4 diffuse_srgb = diffuse_tap;
vec4 diffuse_linear = vec4(srgb_to_linear(diffuse_srgb.rgb), diffuse_srgb.a); vec4 diffuse_linear = vec4(srgb_to_linear(diffuse_srgb.rgb), diffuse_srgb.a);
...@@ -349,7 +348,7 @@ void main() ...@@ -349,7 +348,7 @@ void main()
color.rgb += sun_contrib; color.rgb += sun_contrib;
#endif #endif
color.rgb *= diffuse_linear.rgb; color.rgb *= diffuse_srgb.rgb;
float glare = 0.0; float glare = 0.0;
...@@ -397,11 +396,15 @@ void main() ...@@ -397,11 +396,15 @@ void main()
} }
color = atmosFragLighting(color, additive, atten); color = atmosFragLighting(color, additive, atten);
color = scaleSoftClipFrag(color);
vec3 npos = normalize(-pos.xyz); vec3 npos = normalize(-pos.xyz);
vec3 light = vec3(0,0,0); vec3 light = vec3(0,0,0);
//convert to linear before adding local lights
color.rgb = srgb_to_linear(color.rgb);
#define LIGHT_LOOP(i) light.rgb += calcPointLightOrSpotLight(light_diffuse[i].rgb, npos, diffuse_linear.rgb, final_specular, pos.xyz, norm, light_position[i], light_direction[i].xyz, light_attenuation[i].x, light_attenuation[i].y, light_attenuation[i].z, glare, light_attenuation[i].w ); #define LIGHT_LOOP(i) light.rgb += calcPointLightOrSpotLight(light_diffuse[i].rgb, npos, diffuse_linear.rgb, final_specular, pos.xyz, norm, 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(1)
...@@ -419,8 +422,9 @@ void main() ...@@ -419,8 +422,9 @@ void main()
color.rgb += light.rgb; color.rgb += light.rgb;
#endif #endif
color = scaleSoftClipFrag(color); //convert to srgb as this color is being written post gamma correction
color.rgb = linear_to_srgb(color.rgb);
#ifdef WATER_FOG #ifdef WATER_FOG
vec4 temp = applyWaterFogView(pos, vec4(color.rgb, al)); vec4 temp = applyWaterFogView(pos, vec4(color.rgb, al));
color.rgb = temp.rgb; color.rgb = temp.rgb;
...@@ -429,8 +433,6 @@ void main() ...@@ -429,8 +433,6 @@ void main()
} }
color.rgb = linear_to_srgb(color.rgb);
frag_color = vec4(color, al); frag_color = vec4(color, al);
#else // mode is not DIFFUSE_ALPHA_MODE_BLEND, encode to gbuffer #else // mode is not DIFFUSE_ALPHA_MODE_BLEND, encode to gbuffer
......
...@@ -163,15 +163,19 @@ void main() ...@@ -163,15 +163,19 @@ void main()
proj_tc.xyz /= proj_tc.w; proj_tc.xyz /= proj_tc.w;
float fa = falloff+1.0; float fa = falloff+1.0;
float dist_atten = min(1.0-(dist-1.0*(1.0-fa))/fa, 1.0); float dist_atten = clamp(1.0-(dist-1.0*(1.0-fa))/fa, 0.0, 1.0);
dist_atten *= dist_atten; dist_atten *= dist_atten;
dist_atten *= 2.0; dist_atten *= 2.0;
if (dist_atten <= 0.0) if (dist_atten <= 0.0)
{ {
discard; discard;
} }
float noise = texture2D(noiseMap, frag.xy/128.0).b;
dist_atten *= noise;
lv = proj_origin-pos.xyz; lv = proj_origin-pos.xyz;
lv = normalize(lv); lv = normalize(lv);
float da = dot(norm, lv); float da = dot(norm, lv);
...@@ -179,12 +183,13 @@ void main() ...@@ -179,12 +183,13 @@ void main()
vec3 diff_tex = texture2DRect(diffuseRect, frag.xy).rgb; vec3 diff_tex = texture2DRect(diffuseRect, frag.xy).rgb;
// SL-12005 Projector light pops as we get closer, more objectionable than being in wrong color space. // SL-12005 Projector light pops as we get closer, more objectionable than being in wrong color space.
// We can't switch to linear here unless we do it everywhere // We can't switch to linear here unless we do it everywhere*
//diff_tex.rgb = srgb_to_linear(diff_tex.rgb); // *gbuffer is sRGB, convert to linear whenever sampling from it
diff_tex.rgb = srgb_to_linear(diff_tex.rgb);
vec3 dlit = vec3(0, 0, 0); vec3 dlit = vec3(0, 0, 0);
float noise = texture2D(noiseMap, frag.xy/128.0).b;
if (proj_tc.z > 0.0 && if (proj_tc.z > 0.0 &&
proj_tc.x < 1.0 && proj_tc.x < 1.0 &&
proj_tc.y < 1.0 && proj_tc.y < 1.0 &&
...@@ -203,7 +208,7 @@ void main() ...@@ -203,7 +208,7 @@ void main()
dlit = color.rgb * plcol.rgb * plcol.a; dlit = color.rgb * plcol.rgb * plcol.a;
lit = da * dist_atten * noise; lit = da * dist_atten;
col = dlit*lit*diff_tex; col = dlit*lit*diff_tex;
amb_da += (da*0.5)*proj_ambiance; amb_da += (da*0.5)*proj_ambiance;
...@@ -245,7 +250,7 @@ void main() ...@@ -245,7 +250,7 @@ void main()
col += dlit*scol*spec.rgb; col += dlit*scol*spec.rgb;
//col += spec.rgb; //col += spec.rgb;
} }
} }
if (envIntensity > 0.0) if (envIntensity > 0.0)
{ {
...@@ -277,6 +282,7 @@ void main() ...@@ -277,6 +282,7 @@ void main()
} }
#endif #endif
//output linear, sum of lights will be gamma corrected later
frag_color.rgb = col; frag_color.rgb = col;
frag_color.a = 0.0; frag_color.a = 0.0;
} }
...@@ -43,6 +43,7 @@ vec3 linear_to_srgb(vec3 cl); ...@@ -43,6 +43,7 @@ vec3 linear_to_srgb(vec3 cl);
void main() void main()
{ {
//this is the one of the rare spots where diffuseRect contains linear color values (not sRGB)
vec4 diff = texture2DRect(diffuseRect, vary_fragcoord); vec4 diff = texture2DRect(diffuseRect, vary_fragcoord);
//diff.rgb = pow(diff.rgb, vec3(display_gamma)); //diff.rgb = pow(diff.rgb, vec3(display_gamma));
diff.rgb = linear_to_srgb(diff.rgb); diff.rgb = linear_to_srgb(diff.rgb);
......
...@@ -119,7 +119,7 @@ vec3 post_ambient = color.rgb; ...@@ -119,7 +119,7 @@ vec3 post_ambient = color.rgb;
vec3 post_sunlight = color.rgb; vec3 post_sunlight = color.rgb;
color.rgb *= diffuse_linear.rgb; color.rgb *= diffuse_srgb.rgb;
vec3 post_diffuse = color.rgb; vec3 post_diffuse = color.rgb;
...@@ -199,9 +199,6 @@ vec3 post_atmo = color.rgb; ...@@ -199,9 +199,6 @@ vec3 post_atmo = color.rgb;
//color.rgb = post_env; //color.rgb = post_env;
//color.rgb = post_atmo; //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);
} }
// linear debuggables // linear debuggables
...@@ -209,7 +206,9 @@ vec3 post_atmo = color.rgb; ...@@ -209,7 +206,9 @@ vec3 post_atmo = color.rgb;
//color.rgb = vec3(ambient); //color.rgb = vec3(ambient);
//color.rgb = vec3(scol); //color.rgb = vec3(scol);
//color.rgb = diffuse_linear.rgb; //color.rgb = diffuse_linear.rgb;
frag_color.rgb = color.rgb; // convert to linear as fullscreen lights need to sum in linear colorspace
// and will be gamma (re)corrected downstream...
frag_color.rgb = srgb_to_linear(color.rgb);
frag_color.a = 0.0; //bloom; frag_color.a = 0.0; //bloom;
} }
...@@ -46,6 +46,7 @@ float getAmbientClamp() ...@@ -46,6 +46,7 @@ float getAmbientClamp()
return 1.0f; return 1.0f;
} }
void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, out vec3 sunlit, out vec3 amblit, out vec3 additive, out vec3 atten, bool use_ao) { void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, out vec3 sunlit, out vec3 amblit, out vec3 additive, out vec3 atten, bool use_ao) {
vec3 P = inPositionEye; vec3 P = inPositionEye;
...@@ -123,7 +124,7 @@ void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, ou ...@@ -123,7 +124,7 @@ void calcAtmosphericVars(vec3 inPositionEye, vec3 light_dir, float ambFactor, ou
temp2.x *= sun_moon_glow_factor; temp2.x *= sun_moon_glow_factor;
vec4 amb_color = ambient_color; vec4 amb_color = ambient_color;
//increase ambient when there are more clouds //increase ambient when there are more clouds
vec4 tmpAmbient = amb_color + (vec4(1.) - amb_color) * cloud_shadow * 0.5; vec4 tmpAmbient = amb_color + (vec4(1.) - amb_color) * cloud_shadow * 0.5;
......
...@@ -192,8 +192,9 @@ void main() ...@@ -192,8 +192,9 @@ void main()
vec3 diff_tex = texture2DRect(diffuseRect, frag.xy).rgb; vec3 diff_tex = texture2DRect(diffuseRect, frag.xy).rgb;
// SL-12005 Projector light pops as we get closer, more objectionable than being in wrong color space. // SL-12005 Projector light pops as we get closer, more objectionable than being in wrong color space.
// We can't switch to linear here unless we do it everywhere // We can't switch to linear here unless we do it everywhere*
//diff_tex.rgb = srgb_to_linear(diff_tex.rgb); // *gbuffer IS sRGB, convert to linear since this shader outputs linear
diff_tex.rgb = srgb_to_linear(diff_tex.rgb);
vec4 spec = texture2DRect(specularRect, frag.xy); vec4 spec = texture2DRect(specularRect, frag.xy);
...@@ -296,6 +297,7 @@ void main() ...@@ -296,6 +297,7 @@ void main()
//not sure why, but this line prevents MATBUG-194 //not sure why, but this line prevents MATBUG-194
col = max(col, vec3(0.0)); col = max(col, vec3(0.0));
frag_color.rgb = col; //output linear
frag_color.rgb = col;
frag_color.a = 0.0; frag_color.a = 0.0;
} }
...@@ -106,7 +106,7 @@ void main() ...@@ -106,7 +106,7 @@ void main()
vec3 atten; vec3 atten;
calcAtmosphericVars(pos.xyz, light_dir, ambocc, sunlit, amblit, additive, atten, true); calcAtmosphericVars(pos.xyz, light_dir, ambocc, sunlit, amblit, additive, atten, true);
float ambient = da; float ambient = da;
ambient *= 0.5; ambient *= 0.5;
ambient *= ambient; ambient *= ambient;
...@@ -127,7 +127,7 @@ vec3 post_ambient = color.rgb; ...@@ -127,7 +127,7 @@ vec3 post_ambient = color.rgb;
vec3 post_sunlight = color.rgb; vec3 post_sunlight = color.rgb;
color.rgb *= diffuse_linear.rgb; color.rgb *= diffuse_srgb.rgb;
vec3 post_diffuse = color.rgb; vec3 post_diffuse = color.rgb;
...@@ -218,6 +218,6 @@ vec3 post_atmo = color.rgb; ...@@ -218,6 +218,6 @@ vec3 post_atmo = color.rgb;
//output linear RGB as lights are summed up in linear space and then gamma corrected prior to the //output linear RGB as lights are summed up in linear space and then gamma corrected prior to the
//post deferred passes //post deferred passes
frag_color.rgb = color.rgb; frag_color.rgb = srgb_to_linear(color.rgb);
frag_color.a = bloom; frag_color.a = bloom;
} }
...@@ -189,7 +189,7 @@ void main() ...@@ -189,7 +189,7 @@ void main()
lv = normalize(lv); lv = normalize(lv);
float da = dot(norm, lv); float da = dot(norm, lv);
vec3 diff_tex = texture2DRect(diffuseRect, frag.xy).rgb; vec3 diff_tex = srgb_to_linear(texture2DRect(diffuseRect, frag.xy).rgb);
vec4 spec = texture2DRect(specularRect, frag.xy); vec4 spec = texture2DRect(specularRect, frag.xy);
vec3 dlit = vec3(0, 0, 0); vec3 dlit = vec3(0, 0, 0);
...@@ -287,6 +287,7 @@ void main() ...@@ -287,6 +287,7 @@ void main()
//not sure why, but this line prevents MATBUG-194 //not sure why, but this line prevents MATBUG-194
col = max(col, vec3(0.0)); col = max(col, vec3(0.0));
//output linear colors as gamma correction happens down stream
frag_color.rgb = col; frag_color.rgb = col;
frag_color.a = 0.0; frag_color.a = 0.0;
} }
...@@ -183,7 +183,7 @@ void main() ...@@ -183,7 +183,7 @@ void main()
vec3 col = vec3(0,0,0); vec3 col = vec3(0,0,0);
vec3 diff_tex = texture2DRect(diffuseRect, frag.xy).rgb; vec3 diff_tex = srgb_to_linear(texture2DRect(diffuseRect, frag.xy).rgb);
vec4 spec = texture2DRect(specularRect, frag.xy); vec4 spec = texture2DRect(specularRect, frag.xy);
...@@ -285,6 +285,7 @@ void main() ...@@ -285,6 +285,7 @@ void main()
col = scaleDownLight(col); col = scaleDownLight(col);
//output linear space color as gamma correction happens down stream
frag_color.rgb = col; frag_color.rgb = col;
frag_color.a = 0.0; frag_color.a = 0.0;
} }
...@@ -94,7 +94,8 @@ void main() ...@@ -94,7 +94,8 @@ void main()
float da = max(dot(norm.xyz, sun_dir.xyz), 0.0); float da = max(dot(norm.xyz, sun_dir.xyz), 0.0);
vec4 diffuse = texture2DRect(diffuseRect, tc); // linear vec4 diffuse = texture2DRect(diffuseRect, tc); // sRGB
diffuse.rgb = srgb_to_linear(diffuse.rgb);
vec3 col; vec3 col;
float bloom = 0.0; float bloom = 0.0;
...@@ -169,7 +170,8 @@ void main() ...@@ -169,7 +170,8 @@ void main()
bloom = fogged.a; bloom = fogged.a;
#endif #endif
} }
//output linear since gamma correction happens down stream
frag_color.rgb = col; frag_color.rgb = col;
frag_color.a = bloom; frag_color.a = bloom;
} }
...@@ -182,7 +182,7 @@ void main() ...@@ -182,7 +182,7 @@ void main()
vec3 col = vec3(0,0,0); vec3 col = vec3(0,0,0);
vec3 diff_tex = texture2DRect(diffuseRect, frag.xy).rgb; vec3 diff_tex = srgb_to_linear(texture2DRect(diffuseRect, frag.xy).rgb);
vec4 spec = texture2DRect(specularRect, frag.xy); vec4 spec = texture2DRect(specularRect, frag.xy);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment