To not spam the WIP screenshot thread more, I created a new thread for the gradient fog filter.
This is not my code, I just modified Riccardo’s gradient fog he wrote for his render pipeline to work with the current JME’s filter post-processor.
public class GradientFogFilter extends Filter {
private Texture fogGradient;
private float fogIntensity = 1f;
private float fogDistanceNear = 1f;
private float fogDistanceFar = 1000f;
@Override
protected void initFilter(AssetManager manager, RenderManager renderManager, ViewPort vp, int w, int h) {
material = new Material(manager, "MatDefs/Post/GradientFog.j3md");
if (fogGradient == null) {
fogGradient = manager.loadTexture("Textures/gradient_ramp2.png");
}
material.setTexture("FogGradient", fogGradient);
material.setFloat("FogIntensity", fogIntensity);
material.setFloat("FogDistanceNear", fogDistanceNear);
material.setFloat("FogDistanceFar", fogDistanceFar);
}
@Override
protected Material getMaterial() {
return material;
}
@Override
protected boolean isRequiresDepthTexture() {
return true;
}
public Texture getFogGradient() {
return fogGradient;
}
public void setFogGradient(Texture fogGradient) {
if (material != null) {
material.setTexture("FogGradient", fogGradient);
}
this.fogGradient = fogGradient;
}
public float getFogIntensity() {
return fogIntensity;
}
public void setFogIntensity(float fogIntensity) {
if (material != null) {
material.setFloat("FogIntensity", fogIntensity);
}
this.fogIntensity = fogIntensity;
}
public float getFogDistanceNear() {
return fogDistanceNear;
}
public void setFogDistanceNear(float fogDistanceNear) {
if (material != null) {
material.setFloat("FogDistanceNear", fogDistanceNear);
}
this.fogDistanceNear = fogDistanceNear;
}
public float getFogDistanceFar() {
return fogDistanceFar;
}
public void setFogDistanceFar(float fogDistanceFar) {
if (material != null) {
material.setFloat("FogDistanceFar", fogDistanceFar);
}
this.fogDistanceFar = fogDistanceFar;
}
}
GradientFog.j3md:
MaterialDef GradientFog {
MaterialParameters {
Int NumSamples
Int NumSamplesDepth
Texture2D Texture
Texture2D DepthTexture
Texture2D FogGradient
Float FogIntensity
Float FogDistanceNear
Float FogDistanceFar
}
Technique {
VertexShader GLSL150: Common/MatDefs/Post/Post.vert
FragmentShader GLSL150: Shaders/Post/GradientFog.frag
WorldParameters {
}
Defines {
RESOLVE_MS : NumSamples
RESOLVE_DEPTH_MS : NumSamplesDepth
}
}
}
GradientFog.frag:
#import "Common/ShaderLib/GLSLCompat.glsllib"
#import "Common/ShaderLib/MultiSample.glsllib"
#extension GL_ARB_explicit_attrib_location : enable
uniform COLORTEXTURE m_Texture;
uniform DEPTHTEXTURE m_DepthTexture;
varying vec2 texCoord;
uniform sampler2D m_FogGradient;
uniform float m_FogIntensity;
uniform float m_FogDistanceNear;
uniform float m_FogDistanceFar;
// depth is in [0, 1]
float getDistance(in float depth) {
float near = 1.0;
float far = m_FogDistanceFar;
float d = 2.0 * depth -1.0;
return (2. * near * far) / (far + near - d * (far - near));
}
float linear01Depth(in float depth) {
float distance = getDistance(depth);
float near = m_FogDistanceNear;
float far = m_FogDistanceFar;
distance = clamp(distance, near, far);
return (distance - near) / (far - near);
}
vec4 sampleWithFog(in sampler2D sceneTx, in sampler2D depthTx, in sampler2D gradientTx){
float depth = linear01Depth(texture(depthTx, texCoord).r);
vec4 fogGradient = texture(gradientTx, vec2(depth, 0));
vec4 color = texture(sceneTx, texCoord);
color.rgb = mix(color.rgb, fogGradient.rgb, fogGradient.a * m_FogIntensity);
return color;
}
void main(){
gl_FragColor = sampleWithFog(m_Texture, m_DepthTexture, m_FogGradient);
}
gradient_ramp.png: (from here)
gradient_ramp2.png: (from here)
gradient_ramp2-1.png: (from here)
gradient_ramp7.png: (I made with Gimp)
defaultGradient.bmp: (It’s from Riccardo’s repo)
Usage example:
// Setup fog
gradientFog = new GradientFogFilter();
gradientFog.setFogGradient(assets.loadTexture("Textures/gradient_ramp7.png"));
gradientFog.setFogDistanceNear(0);
gradientFog.setFogDistanceFar(400);
gradientFog.setFogIntensity(0.45f);
gradientFog.setEnabled(true);
fpp.addFilter(gradientFog);
Read More:
Some screenshots shared by @ndebruyn using this filter in their editor:
Some more (shared by me;)