- 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;
|
import com.jme3.renderer.ViewPort;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @author Phate666
|
* @author Phate666
|
||||||
* @version 1.0 initial version
|
* @version 1.0 initial version
|
||||||
* @version 1.1 added luma
|
*
|
||||||
*/
|
*/
|
||||||
public class GammaCorrectionFilter extends Filter
|
public class GammaCorrectionFilter extends Filter {
|
||||||
{
|
|
||||||
private float gamma = 2.0f;
|
|
||||||
private boolean computeLuma = false;
|
|
||||||
|
|
||||||
public GammaCorrectionFilter()
|
private float gamma = 2.2f;
|
||||||
{
|
|
||||||
super("GammaCorrectionFilter");
|
|
||||||
}
|
|
||||||
|
|
||||||
public GammaCorrectionFilter(float gamma)
|
public GammaCorrectionFilter() {
|
||||||
{
|
super("GammaCorrectionFilter");
|
||||||
this();
|
}
|
||||||
this.setGamma(gamma);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
public GammaCorrectionFilter(float gamma) {
|
||||||
protected Material getMaterial()
|
this();
|
||||||
{
|
this.setGamma(gamma);
|
||||||
return material;
|
}
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void initFilter(AssetManager manager,
|
protected Material getMaterial() {
|
||||||
RenderManager renderManager, ViewPort vp, int w, int h)
|
return material;
|
||||||
{
|
}
|
||||||
material = new Material(manager,
|
|
||||||
"Common/MatDefs/Post/GammaCorrection.j3md");
|
|
||||||
material.setFloat("gamma", gamma);
|
|
||||||
material.setBoolean("computeLuma", computeLuma);
|
|
||||||
}
|
|
||||||
|
|
||||||
public float getGamma()
|
@Override
|
||||||
{
|
protected void initFilter(AssetManager manager,
|
||||||
return gamma;
|
RenderManager renderManager, ViewPort vp, int w, int h) {
|
||||||
}
|
material = new Material(manager, "Materials/Filter/GammaCorrection.j3md");
|
||||||
|
material.setFloat("InvGamma", 1.0f/gamma);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
public float getGamma() {
|
||||||
* set to 0.0 to disable gamma correction
|
return gamma;
|
||||||
* @param gamma
|
}
|
||||||
*/
|
|
||||||
public void setGamma(float gamma)
|
|
||||||
{
|
|
||||||
if (material != null)
|
|
||||||
{
|
|
||||||
material.setFloat("gamma", gamma);
|
|
||||||
}
|
|
||||||
this.gamma = gamma;
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isComputeLuma()
|
/**
|
||||||
{
|
* set to 0.0 to disable gamma correction
|
||||||
return computeLuma;
|
*
|
||||||
}
|
* @param gamma
|
||||||
|
*/
|
||||||
public void setComputeLuma(boolean computeLuma)
|
public final void setGamma(float gamma) {
|
||||||
{
|
if(gamma<=0){
|
||||||
if (material != null)
|
throw new IllegalArgumentException("Gamma value can't be below or equal 0.");
|
||||||
{
|
}
|
||||||
material.setBoolean("computeLuma", computeLuma);
|
if (material != null) {
|
||||||
}
|
material.setFloat("InvGamma",1.0f/ gamma);
|
||||||
this.computeLuma = computeLuma;
|
}
|
||||||
}
|
this.gamma = gamma;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,23 +1,16 @@
|
|||||||
uniform sampler2D m_Texture;
|
uniform sampler2D m_Texture;
|
||||||
varying vec2 texCoord;
|
varying vec2 texCoord;
|
||||||
|
|
||||||
uniform float m_gamma;
|
uniform float m_InvGamma;
|
||||||
|
|
||||||
vec3 gamma(vec3 L,float gamma)
|
vec3 gamma(vec3 L,float invGamma){
|
||||||
{
|
return pow(L, vec3(invGamma));
|
||||||
return pow(L, vec3(1.0 / gamma));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void main() {
|
void main() {
|
||||||
vec4 texVal = texture2D(m_Texture, texCoord);
|
vec4 texVal = texture2D(m_Texture, texCoord);
|
||||||
|
|
||||||
if(m_gamma > 0.0)
|
texVal.rgb = gamma(texVal.rgb , m_InvGamma);
|
||||||
{
|
|
||||||
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;
|
gl_FragColor = texVal;
|
||||||
}
|
}
|
@ -3,31 +3,29 @@ MaterialDef GammaCorrection {
|
|||||||
MaterialParameters {
|
MaterialParameters {
|
||||||
Int NumSamples
|
Int NumSamples
|
||||||
Texture2D Texture
|
Texture2D Texture
|
||||||
Float gamma
|
Float InvGamma
|
||||||
Boolean computeLuma
|
|
||||||
}
|
}
|
||||||
|
|
||||||
Technique {
|
Technique {
|
||||||
VertexShader GLSL150: Common/MatDefs/Post/Post15.vert
|
VertexShader GLSL150: Common/MatDefs/Post/Post15.vert
|
||||||
FragmentShader GLSL150: Common/MatDefs/Post/GammaCorrection15.frag
|
FragmentShader GLSL150: Materials/Filter/GammaCorrection15.frag
|
||||||
|
|
||||||
WorldParameters {
|
WorldParameters {
|
||||||
}
|
}
|
||||||
|
|
||||||
Defines {
|
Defines {
|
||||||
COMPUTE_LUMA : computeLuma
|
RESOLVE_MS : NumSamples
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Technique {
|
Technique {
|
||||||
VertexShader GLSL100: Common/MatDefs/Post/Post.vert
|
VertexShader GLSL100: Common/MatDefs/Post/Post.vert
|
||||||
FragmentShader GLSL100: Common/MatDefs/Post/GammaCorrection.frag
|
FragmentShader GLSL100: Materials/Filter/GammaCorrection.frag
|
||||||
|
|
||||||
WorldParameters {
|
WorldParameters {
|
||||||
}
|
}
|
||||||
|
|
||||||
Defines {
|
Defines {
|
||||||
COMPUTE_LUMA : computeLuma
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -3,24 +3,18 @@
|
|||||||
uniform COLORTEXTURE m_Texture;
|
uniform COLORTEXTURE m_Texture;
|
||||||
in vec2 texCoord;
|
in vec2 texCoord;
|
||||||
|
|
||||||
uniform float m_gamma;
|
uniform float m_InvGamma;
|
||||||
|
|
||||||
vec3 gamma(vec3 L,float gamma)
|
vec3 gamma(vec3 L,float invGamma){
|
||||||
{
|
return pow(L, vec3(invGamma));
|
||||||
return pow(L, vec3(1.0 / gamma));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
out vec4 fragColor;
|
||||||
|
|
||||||
void main() {
|
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)
|
fragColor = texVal;
|
||||||
{
|
|
||||||
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;
|
|
||||||
}
|
}
|
Loading…
x
Reference in New Issue
Block a user