소스 검색

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

* Avoid calculating whitepoint for each sample for HDR
Kirill Vainer 8 년 전
부모
커밋
b56e321218
2개의 변경된 파일32개의 추가작업 그리고 26개의 파일을 삭제
  1. 31 23
      jme3-effects/src/main/resources/Common/MatDefs/Post/ToneMap.frag
  2. 1 3
      jme3-effects/src/main/resources/Common/MatDefs/Post/ToneMap.j3md

+ 31 - 23
jme3-effects/src/main/resources/Common/MatDefs/Post/ToneMap.frag

@@ -1,12 +1,7 @@
+#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){
+vec3 FilmicCurve(in vec3 x) {
     const float A = 0.22;
     const float B = 0.30;
     const float C = 0.10;
@@ -19,27 +14,40 @@ vec3 FilmicCurve(in vec3 x){
 
 // whitePoint should be 11.2
 
-vec3 ToneMap_Filmic(vec3 color, vec3 whitePoint){
+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);
-
-    return vec4(toneMapped, texVal.a);
+uniform vec3 m_WhitePoint;
+varying vec2 texCoord;
+ 
+#ifdef NUM_SAMPLES
+
+uniform sampler2DMS m_Texture;
+
+vec4 ToneMap_TextureFilmic() {
+    ivec2 iTexC = ivec2(texCoord * vec2(textureSize(m_Texture)));
+    vec4 color = vec4(0.0);
+    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);
+    }
+    color.rgb /= FilmicCurve(m_WhitePoint);
+    return color / float(NUM_SAMPLES);
 }
 
+#else
+ 
+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() {
-    #ifdef RESOLVE_MS
-        vec4 color = vec4(0.0);
-        for (int i = 0; i < m_NumSamples; i++){
-            color += tonemap(i);
-        }
-        gl_FragColor = color / m_NumSamples;
-    #else
-        gl_FragColor = tonemap(0);
-    #endif
+    gl_FragColor = ToneMap_TextureFilmic();
 }

+ 1 - 3
jme3-effects/src/main/resources/Common/MatDefs/Post/ToneMap.j3md

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