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("FogStartDistance", 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("FogStartDistance", 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]