diff --git a/engine/src/core-data/Common/MatDefs/Post/GammaCorrection.frag b/engine/src/core-data/Common/MatDefs/Post/GammaCorrection.frag new file mode 100644 index 000000000..90b2adedc --- /dev/null +++ b/engine/src/core-data/Common/MatDefs/Post/GammaCorrection.frag @@ -0,0 +1,23 @@ +uniform sampler2D m_Texture; +varying vec2 texCoord; + +uniform float m_gamma; + +vec3 gamma(vec3 L,float gamma) +{ + return pow(L, vec3(1.0 / gamma)); +} + +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 + + gl_FragColor = texVal; +} \ No newline at end of file diff --git a/engine/src/core-data/Common/MatDefs/Post/GammaCorrection.j3md b/engine/src/core-data/Common/MatDefs/Post/GammaCorrection.j3md new file mode 100644 index 000000000..b9c94c042 --- /dev/null +++ b/engine/src/core-data/Common/MatDefs/Post/GammaCorrection.j3md @@ -0,0 +1,39 @@ +MaterialDef GammaCorrection { + + MaterialParameters { + Int NumSamples + Texture2D Texture + Float gamma + Boolean computeLuma + } + + Technique { + VertexShader GLSL150: Common/MatDefs/Post/Post15.vert + FragmentShader GLSL150: Common/MatDefs/Post/GammaCorrection15.frag + + WorldParameters { + WorldViewProjectionMatrix + } + + Defines { + COMPUTE_LUMA : computeLuma + } + } + + Technique { + VertexShader GLSL100: Common/MatDefs/Post/Post.vert + FragmentShader GLSL100: Common/MatDefs/Post/GammaCorrection.frag + + WorldParameters { + WorldViewProjectionMatrix + } + + Defines { + COMPUTE_LUMA : computeLuma + } + } + + Technique FixedFunc { + } + +} \ No newline at end of file diff --git a/engine/src/core-data/Common/MatDefs/Post/GammaCorrection15.frag b/engine/src/core-data/Common/MatDefs/Post/GammaCorrection15.frag new file mode 100644 index 000000000..b7861908a --- /dev/null +++ b/engine/src/core-data/Common/MatDefs/Post/GammaCorrection15.frag @@ -0,0 +1,26 @@ +#import "Common/ShaderLib/MultiSample.glsllib" + +uniform COLORTEXTURE m_Texture; +in vec2 texCoord; + +uniform float m_gamma; + +vec3 gamma(vec3 L,float gamma) +{ + return pow(L, vec3(1.0 / gamma)); +} + +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 + + gl_FragColor = texVal; +} \ No newline at end of file diff --git a/engine/src/desktop-fx/com/jme3/post/filters/GammaCorrectionFilter.java b/engine/src/desktop-fx/com/jme3/post/filters/GammaCorrectionFilter.java new file mode 100644 index 000000000..9e283ca13 --- /dev/null +++ b/engine/src/desktop-fx/com/jme3/post/filters/GammaCorrectionFilter.java @@ -0,0 +1,78 @@ +package com.jme3.post.filters; + +import com.jme3.asset.AssetManager; +import com.jme3.material.Material; +import com.jme3.post.Filter; +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 GammaCorrectionFilter(float gamma) + { + this(); + this.setGamma(gamma); + } + + @Override + protected Material getMaterial() + { + return material; + } + + @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 float getGamma() + { + return gamma; + } + + /** + * 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; + } + + public boolean isComputeLuma() + { + return computeLuma; + } + + public void setComputeLuma(boolean computeLuma) + { + if (material != null) + { + material.setBoolean("computeLuma", computeLuma); + } + this.computeLuma = computeLuma; + } +}