- 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
This commit is contained in:
parent
1a68fc9c30
commit
0967f39b83
@ -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 class GammaCorrectionFilter extends Filter {
|
||||
|
||||
public GammaCorrectionFilter()
|
||||
{
|
||||
super("GammaCorrectionFilter");
|
||||
}
|
||||
private float gamma = 2.2f;
|
||||
|
||||
public GammaCorrectionFilter(float gamma)
|
||||
{
|
||||
this();
|
||||
this.setGamma(gamma);
|
||||
}
|
||||
public GammaCorrectionFilter() {
|
||||
super("GammaCorrectionFilter");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Material getMaterial()
|
||||
{
|
||||
return material;
|
||||
}
|
||||
public GammaCorrectionFilter(float gamma) {
|
||||
this();
|
||||
this.setGamma(gamma);
|
||||
}
|
||||
|
||||
@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);
|
||||
}
|
||||
@Override
|
||||
protected Material getMaterial() {
|
||||
return material;
|
||||
}
|
||||
|
||||
public float getGamma()
|
||||
{
|
||||
return 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);
|
||||
}
|
||||
|
||||
/**
|
||||
* 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 float getGamma() {
|
||||
return gamma;
|
||||
}
|
||||
|
||||
public boolean isComputeLuma()
|
||||
{
|
||||
return computeLuma;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
@ -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 {
|
||||
}
|
||||
}
|
||||
}
|
@ -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);
|
||||
vec4 texVal = getColor(m_Texture, texCoord);
|
||||
|
||||
texVal.rgb = gamma(texVal.rgb , m_InvGamma);
|
||||
|
||||
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;
|
||||
fragColor = texVal;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user