Selaa lähdekoodia

- Fixed the GammaCorrectionFilter so it properly works with multisampling, will be used as a fall back to upcoming Gamma Correction implementation
- Removed luma
- Passed inverse gamma instead of gamma to avoid doing a division for each pixel in the shader

Nehon 11 vuotta sitten
vanhempi
commit
0967f39b83

+ 38 - 58
jme3-effects/src/main/java/com/jme3/post/filters/GammaCorrectionFilter.java

@@ -38,72 +38,52 @@ import com.jme3.renderer.RenderManager;
 import com.jme3.renderer.ViewPort;
 
 /**
- * 
+ *
  * @author Phate666
  * @version 1.0 initial version
- * @version 1.1 added luma
+ * 
  */
-public class GammaCorrectionFilter extends Filter
-{
-	private float gamma = 2.0f;
-	private boolean computeLuma = false;
-
-	public GammaCorrectionFilter()
-	{
-		super("GammaCorrectionFilter");
-	}
+public class GammaCorrectionFilter extends Filter {
 
-	public GammaCorrectionFilter(float gamma)
-	{
-		this();
-		this.setGamma(gamma);
-	}
+    private float gamma = 2.2f;   
 
-	@Override
-	protected Material getMaterial()
-	{
-		return material;
-	}
+    public GammaCorrectionFilter() {
+        super("GammaCorrectionFilter");
+    }
 
-	@Override
-	protected void initFilter(AssetManager manager,
-			RenderManager renderManager, ViewPort vp, int w, int h)
-	{
-		material = new Material(manager,
-				"Common/MatDefs/Post/GammaCorrection.j3md");
-		material.setFloat("gamma", gamma);
-		material.setBoolean("computeLuma", computeLuma);
-	}
+    public GammaCorrectionFilter(float gamma) {
+        this();
+        this.setGamma(gamma);
+    }
 
-	public float getGamma()
-	{
-		return gamma;
-	}
+    @Override
+    protected Material getMaterial() {
+        return material;
+    }
 
-	/**
-	 * set to 0.0 to disable gamma correction
-	 * @param gamma
-	 */
-	public void setGamma(float gamma)
-	{
-		if (material != null)
-		{
-			material.setFloat("gamma", gamma);
-		}
-		this.gamma = gamma;
-	}
+    @Override
+    protected void initFilter(AssetManager manager,
+            RenderManager renderManager, ViewPort vp, int w, int h) {
+        material = new Material(manager, "Materials/Filter/GammaCorrection.j3md");
+        material.setFloat("InvGamma", 1.0f/gamma);        
+    }
 
-	public boolean isComputeLuma()
-	{
-		return computeLuma;
-	}
+    public float getGamma() {
+        return gamma;
+    }
 
-	public void setComputeLuma(boolean computeLuma)
-	{
-		if (material != null)
-		{
-			material.setBoolean("computeLuma", computeLuma);
-		}
-		this.computeLuma = computeLuma;
-	}
+    /**
+     * set to 0.0 to disable gamma correction
+     *
+     * @param gamma
+     */
+    public final void setGamma(float gamma) {
+        if(gamma<=0){
+            throw new IllegalArgumentException("Gamma value can't be below or equal 0.");
+        }
+        if (material != null) {
+            material.setFloat("InvGamma",1.0f/ gamma);
+        }
+        this.gamma = gamma;
+    }
 }

+ 5 - 12
jme3-effects/src/main/resources/Common/MatDefs/Post/GammaCorrection.frag

@@ -1,23 +1,16 @@
 uniform sampler2D m_Texture;
 varying vec2 texCoord;
 
-uniform float m_gamma;
+uniform float m_InvGamma;
 
-vec3 gamma(vec3 L,float gamma)
-{
-	return pow(L, vec3(1.0 / gamma));
+vec3 gamma(vec3 L,float invGamma){
+	return pow(L, vec3(invGamma));
 }
 
 void main() {
     vec4 texVal = texture2D(m_Texture, texCoord);
- 
- 	if(m_gamma > 0.0)
- 	{
-    	texVal.rgb = gamma(texVal.rgb , m_gamma);
- 	}
- 	#ifdef COMPUTE_LUMA
- 		texVal.a = dot(texVal.rgb, vec3(0.299, 0.587, 0.114));
- 	#endif
+
+    texVal.rgb = gamma(texVal.rgb , m_InvGamma);
  	
     gl_FragColor = texVal;
 }

+ 6 - 8
jme3-effects/src/main/resources/Common/MatDefs/Post/GammaCorrection.j3md

@@ -3,31 +3,29 @@ MaterialDef GammaCorrection {
     MaterialParameters {
         Int NumSamples
         Texture2D Texture
-        Float gamma
-        Boolean computeLuma
+        Float InvGamma       
     }
  
     Technique {
         VertexShader GLSL150:   Common/MatDefs/Post/Post15.vert
-        FragmentShader GLSL150: Common/MatDefs/Post/GammaCorrection15.frag
+        FragmentShader GLSL150: Materials/Filter/GammaCorrection15.frag
  
         WorldParameters {
         }
         
-        Defines {
-            COMPUTE_LUMA : computeLuma
+        Defines { 
+            RESOLVE_MS : NumSamples
         }
     }
  
     Technique {
         VertexShader GLSL100:   Common/MatDefs/Post/Post.vert
-        FragmentShader GLSL100: Common/MatDefs/Post/GammaCorrection.frag
+        FragmentShader GLSL100: Materials/Filter/GammaCorrection.frag
  
         WorldParameters {
         }
         
-         Defines {
-            COMPUTE_LUMA : computeLuma
+         Defines {            
         }
     }
 }

+ 9 - 15
jme3-effects/src/main/resources/Common/MatDefs/Post/GammaCorrection15.frag

@@ -3,24 +3,18 @@
 uniform COLORTEXTURE m_Texture;
 in vec2 texCoord;
  
-uniform float m_gamma;
+uniform float m_InvGamma;
 
-vec3 gamma(vec3 L,float gamma)
-{
-	return pow(L, vec3(1.0 / gamma));
+vec3 gamma(vec3 L,float invGamma){
+	return pow(L, vec3(invGamma));
 }
+
+out vec4 fragColor;
  
 void main() {
-    vec4 texVal = texture2D(m_Texture, texCoord);
- 
- 	if(m_gamma > 0.0)
- 	{
-    	texVal.rgb = gamma(texVal.rgb , m_gamma);
- 	}
- 	
- 	#ifdef COMPUTE_LUMA
- 		texVal.a = dot(texVal.rgb, vec3(0.299, 0.587, 0.114));
- 	#endif
+    vec4 texVal = getColor(m_Texture, texCoord);
+    
+    texVal.rgb = gamma(texVal.rgb , m_InvGamma);
  
-    gl_FragColor = texVal;
+    fragColor = texVal;
 }