Skip to content

Commit 822cc2a

Browse files
authored
Merge pull request #3896 from williamweaver/fix/tonemap-hdr-blend
Refactor tonemap blending to preserve HDR detail during mix
2 parents d19d44c + c07817c commit 822cc2a

File tree

1 file changed

+24
-13
lines changed

1 file changed

+24
-13
lines changed

indra/newview/app_settings/shaders/class1/deferred/tonemapUtilF.glsl

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -117,27 +117,34 @@ uniform float exposure;
117117
uniform float tonemap_mix;
118118
uniform int tonemap_type;
119119

120+
120121
vec3 toneMap(vec3 color)
121122
{
122123
#ifndef NO_POST
123-
float exp_scale = texture(exposureMap, vec2(0.5,0.5)).r;
124-
125-
color *= exposure * exp_scale;
124+
vec3 linear_input_color = color;
126125

127-
vec3 clamped_color = clamp(color.rgb, vec3(0.0), vec3(1.0));
126+
float exp_scale = texture(exposureMap, vec2(0.5,0.5)).r;
127+
float final_exposure = exposure * exp_scale;
128+
vec3 exposed_color = color * final_exposure;
128129

130+
vec3 tonemapped_color = exposed_color;
129131
switch(tonemap_type)
130132
{
131133
case 0:
132-
color = PBRNeutralToneMapping(color);
134+
tonemapped_color = PBRNeutralToneMapping(exposed_color);
133135
break;
134136
case 1:
135-
color = toneMapACES_Hill(color);
137+
tonemapped_color = toneMapACES_Hill(exposed_color);
136138
break;
137139
}
138140

139-
// mix tonemapped and linear here to provide adjustment
140-
color = mix(clamped_color, color, tonemap_mix);
141+
vec3 exposed_linear_input = linear_input_color * final_exposure;
142+
color = mix(exposed_linear_input, tonemapped_color, tonemap_mix);
143+
144+
color = clamp(color, 0.0, 1.0);
145+
#else
146+
color *= exposure * texture(exposureMap, vec2(0.5,0.5)).r;
147+
color = clamp(color, 0.0, 1.0);
141148
#endif
142149

143150
return color;
@@ -147,20 +154,24 @@ vec3 toneMap(vec3 color)
147154
vec3 toneMapNoExposure(vec3 color)
148155
{
149156
#ifndef NO_POST
150-
vec3 clamped_color = clamp(color.rgb, vec3(0.0), vec3(1.0));
157+
vec3 linear_input_color = color;
151158

159+
vec3 tonemapped_color = color;
152160
switch(tonemap_type)
153161
{
154162
case 0:
155-
color = PBRNeutralToneMapping(color);
163+
tonemapped_color = PBRNeutralToneMapping(color);
156164
break;
157165
case 1:
158-
color = toneMapACES_Hill(color);
166+
tonemapped_color = toneMapACES_Hill(color);
159167
break;
160168
}
161169

162-
// mix tonemapped and linear here to provide adjustment
163-
color = mix(clamped_color, color, tonemap_mix);
170+
color = mix(linear_input_color, tonemapped_color, tonemap_mix);
171+
172+
color = clamp(color, 0.0, 1.0);
173+
#else
174+
color = clamp(color, 0.0, 1.0);
164175
#endif
165176

166177
return color;

0 commit comments

Comments
 (0)