FogFilter setFogStartDistance()

Hello.

I had a need to have the fog start some distance away from the camera. Here’s a patch for FogFilter.java + the whole modified shader files. Not sure the way i calculate it is 100% correct, but it seems to work.



FogFilter.patch

[java]

Index: FogFilter.java

===================================================================

— FogFilter.java (revision 6567)

+++ FogFilter.java (working copy)

@@ -53,6 +53,7 @@

private ColorRGBA fogColor = ColorRGBA.White.clone();

private float fogDensity = 0.7f;

private float fogDistance = 1000;

  • private float startDistance = 1f;



    public FogFilter() {

    super("FogFilter");

    @@ -76,6 +77,7 @@

    material.setColor("FogColor", fogColor);

    material.setFloat("FogDensity", fogDensity);

    material.setFloat("FogDistance", fogDistance);
  •    material.setFloat(&quot;FogStartDistance&quot;, startDistance);<br />
    

}



@Override

@@ -145,6 +147,17 @@

this.fogDistance = fogDistance;

}


  • /**
  • * how far away the fog starts. hgiher value means further away.<br />
    
  • * @param startDistance<br />
    
  • */<br />
    
  • public void setFogStartDistance(float startDistance){
  •    if (material != null) {<br />
    
  •        material.setFloat(&quot;FogStartDistance&quot;, startDistance);<br />
    
  •    }<br />
    
  •    this.startDistance = startDistance;<br />
    
  • }

    +

    @Override

    public void write(JmeExporter ex) throws IOException {

    super.write(ex);



    [/java]



    Fog.j3md:

    [java]

    MaterialDef Fade {



    MaterialParameters {

    Int NumSamples

    Int NumSamplesDepth

    Texture2D Texture

    Texture2D DepthTexture

    Vector4 FogColor;

    Float FogDensity;

    Float FogDistance;

    Float FogStartDistance;

    }



    Technique {

    VertexShader GLSL150: Common/MatDefs/Post/Post15.vert

    FragmentShader GLSL150: Common/MatDefs/Post/Fog15.frag



    WorldParameters {

    WorldViewProjectionMatrix

    }



    Defines {

    RESOLVE_MS : NumSamples

    RESOLVE_DEPTH_MS : NumSamplesDepth

    }

    }



    Technique {

    VertexShader GLSL100: Common/MatDefs/Post/Post.vert

    FragmentShader GLSL100: Common/MatDefs/Post/Fog.frag



    WorldParameters {

    WorldViewProjectionMatrix

    }

    }



    Technique FixedFunc {

    }



    }[/java]



    Fog.frag:

    [java]

    uniform sampler2D m_Texture;

    uniform sampler2D m_DepthTexture;

    varying vec2 texCoord;



    uniform vec4 m_FogColor;

    uniform float m_FogDensity;

    uniform float m_FogDistance;

    uniform float m_FogStartDistance;



    vec2 m_FrustumNearFar=vec2(1.0,m_FogDistance);

    const float LOG2 = 1.442695;



    void main() {

    vec4 texVal = texture2D(m_Texture, texCoord);

    float fogVal =texture2D(m_DepthTexture,texCoord).r;

    float depth= (2.0 * m_FrustumNearFar.x) / (m_FrustumNearFar.y + m_FrustumNearFar.x - fogVal* (m_FrustumNearFar.y-m_FrustumNearFar.x));

    if(m_FogStartDistance > 0){

    depth -= m_FogStartDistance/m_FogDistance;

    }



    float fogFactor = exp2( -m_FogDensity * m_FogDensity * depth * depth * LOG2 );

    fogFactor = clamp(fogFactor, 0.0, 1.0);

    gl_FragColor =mix(m_FogColor,texVal,fogFactor);



    }[/java]



    Fog15.frag:



    [java]#import "Common/ShaderLib/MultiSample.glsllib"



    uniform COLORTEXTURE m_Texture;

    uniform DEPTHTEXTURE m_DepthTexture;



    uniform vec4 m_FogColor;

    uniform float m_FogDensity;

    uniform float m_FogDistance;

    uniform float m_FogStartDistance;



    in vec2 texCoord;



    vec2 m_FrustumNearFar=vec2(1.0,m_FogDistance);

    const float LOG2 = 1.442695;



    void main() {

    vec4 texVal = getColor(m_Texture, texCoord);

    float fogVal = getDepth(m_DepthTexture,texCoord).r;

    float depth= (2.0 * m_FrustumNearFar.x) / (m_FrustumNearFar.y + m_FrustumNearFar.x - fogVal* (m_FrustumNearFar.y-m_FrustumNearFar.x));

    if(m_FogStartDistance > 0){

    depth -= m_FogStartDistance/m_FogDistance;

    }



    float fogFactor = exp2( -m_FogDensity * m_FogDensity * depth * depth * LOG2 );

    fogFactor = clamp(fogFactor, 0.0, 1.0);

    gl_FragColor =mix(m_FogColor,texVal,fogFactor);



    }[/java]
1 Like

Thank you!

There is no such thing as 100% correct…there is just ways to do things :stuck_out_tongue:

maybe I should rename FogDistance to FogEndDistance for more consistency…

Belated thanks - this patch has just come in extremely handy for me (I haven’t yet formally tested the start distance). It would be good to have the FogFilter updated in the code base with start and end distances!

OMG…my todo stack really has a 1 year span :frowning: ??

Too few peanuts.

http://www.youtube.com/watch?v=0-gn18jbhh0