Avoid calculating whitepoint for each sample for HDR (#722)

* Avoid calculating whitepoint for each sample for HDR
empirephoenix-patch-1
Kirill Vainer 7 years ago committed by GitHub
parent 6127f7eb7a
commit b56e321218
  1. 44
      jme3-effects/src/main/resources/Common/MatDefs/Post/ToneMap.frag
  2. 4
      jme3-effects/src/main/resources/Common/MatDefs/Post/ToneMap.j3md

@ -1,10 +1,5 @@
#extension GL_ARB_texture_multisample : enable
#import "Common/ShaderLib/GLSLCompat.glsllib"
#import "Common/ShaderLib/MultiSample.glsllib"
uniform COLORTEXTURE m_Texture;
uniform vec3 m_WhitePoint;
varying vec2 texCoord;
vec3 FilmicCurve(in vec3 x) {
const float A = 0.22;
@ -23,23 +18,36 @@ vec3 ToneMap_Filmic(vec3 color, vec3 whitePoint){
return FilmicCurve(color) / FilmicCurve(whitePoint);
}
vec4 tonemap(int i) {
vec4 texVal = fetchTextureSample(m_Texture, texCoord, i);
vec3 toneMapped = ToneMap_Filmic(texVal.rgb, m_WhitePoint);
uniform vec3 m_WhitePoint;
varying vec2 texCoord;
return vec4(toneMapped, texVal.a);
}
#ifdef NUM_SAMPLES
uniform sampler2DMS m_Texture;
void main() {
#ifdef RESOLVE_MS
vec4 ToneMap_TextureFilmic() {
ivec2 iTexC = ivec2(texCoord * vec2(textureSize(m_Texture)));
vec4 color = vec4(0.0);
for (int i = 0; i < m_NumSamples; i++){
color += tonemap(i);
for (int i = 0; i < NUM_SAMPLES; i++) {
vec4 hdrColor = texelFetch(m_Texture, iTexC, i);
vec3 ldrColor = FilmicCurve(hdrColor.rgb);
color += vec4(ldrColor, hdrColor.a);
}
gl_FragColor = color / m_NumSamples;
color.rgb /= FilmicCurve(m_WhitePoint);
return color / float(NUM_SAMPLES);
}
#else
gl_FragColor = tonemap(0);
uniform sampler2D m_Texture;
vec4 ToneMap_TextureFilmic() {
vec4 texVal = texture2D(m_Texture, texCoord);
return vec4(ToneMap_Filmic(texVal.rgb, m_WhitePoint), texVal.a);
}
#endif
void main() {
gl_FragColor = ToneMap_TextureFilmic();
}

@ -15,9 +15,7 @@ MaterialDef Default GUI {
}
Defines {
RESOLVE_MS : NumSamples
NUM_SAMPLES : NumSamples
}
}
}
Loading…
Cancel
Save