[SOLVED] Fog Shader Filter fails on Android Samsung Galaxy S7

Hi, everybody!

I use the fog filter processor on Android as in

fpp = new FilterPostProcessor(assetManager); fog = new FogFilter(); fpp.addFilter(fog);

This works on some other Android devices I have without any glitch. On the Samsung Galaxy S7, however, I get the following Exception:

05-18 12:11:10.281 25944 25986 E com.jme3.app.AndroidHarness: SEVERE Exception thrown in Thread[GLThread 512,5,main]
05-18 12:11:10.281 25944 25986 E com.jme3.app.AndroidHarness: com.jme3.renderer.RendererException: compile error in:ShaderSource[name=Common/MatDefs/Post/Fog.frag, defines, type=Fragment, language=GLSL100] error:0:10: S0012: Global variable initializer must be a constant expression
05-18 12:11:10.281 25944 25986 E com.jme3.app.AndroidHarness:     at com.jme3.renderer.android.OGLESShaderRenderer.updateShaderSourceData(OGLESShaderRenderer.java:887)
05-18 12:11:10.281 25944 25986 E com.jme3.app.AndroidHarness:     at com.jme3.renderer.android.OGLESShaderRenderer.updateShaderData(OGLESShaderRenderer.java:912)
05-18 12:11:10.281 25944 25986 E com.jme3.app.AndroidHarness:     at com.jme3.renderer.android.OGLESShaderRenderer.setShader(OGLESShaderRenderer.java:970)
05-18 12:11:10.281 25944 25986 E com.jme3.app.AndroidHarness:     at com.jme3.material.Material.render(Material.java:1116)
05-18 12:11:10.281 25944 25986 E com.jme3.app.AndroidHarness:     at com.jme3.renderer.RenderManager.renderGeometry(RenderManager.java:523)
05-18 12:11:10.281 25944 25986 E com.jme3.app.AndroidHarness:     at com.jme3.post.FilterPostProcessor.renderProcessing(FilterPostProcessor.java:202)
05-18 12:11:10.281 25944 25986 E com.jme3.app.AndroidHarness:     at com.jme3.post.FilterPostProcessor.renderFilterChain(FilterPostProcessor.java:281)
05-18 12:11:10.281 25944 25986 E com.jme3.app.AndroidHarness:     at com.jme3.post.FilterPostProcessor.postFrame(FilterPostProcessor.java:294)
05-18 12:11:10.281 25944 25986 E com.jme3.app.AndroidHarness:     at com.jme3.renderer.RenderManager.renderViewPort(RenderManager.java:987)
05-18 12:11:10.281 25944 25986 E com.jme3.app.AndroidHarness:     at com.jme3.renderer.RenderManager.render(RenderManager.java:1029)
05-18 12:11:10.281 25944 25986 E com.jme3.app.AndroidHarness:     at com.jme3.app.SimpleApplication.update(SimpleApplication.java:252)
05-18 12:11:10.281 25944 25986 E com.jme3.app.AndroidHarness:     at com.jme3.app.AndroidHarness.update(AndroidHarness.java:467)
05-18 12:11:10.281 25944 25986 E com.jme3.app.AndroidHarness:     at com.jme3.system.android.OGLESContext.onDrawFrame(OGLESContext.java:349)
05-18 12:11:10.281 25944 25986 E com.jme3.app.AndroidHarness:     at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1649)
05-18 12:11:10.281 25944 25986 E com.jme3.app.AndroidHarness:     at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1354)
05-18 12:11:10.281 25944 25986 E com.jme3.app.AndroidHarness: 

Before this Exception, the log shows the following lines, which may be related:

05-18 12:11:10.271 25944 25986 W com.jme3.renderer.android.OGLESShaderRenderer: WARNING Bad compile of:
05-18 12:11:10.271 25944 25986 W com.jme3.renderer.android.OGLESShaderRenderer: 1    m_ColorMap??
05-18 12:11:10.271 25944 25986 W com.jme3.renderer.android.OGLESShaderRenderer: 2    uniform sampler2D m_Texture;
05-18 12:11:10.271 25944 25986 W com.jme3.renderer.android.OGLESShaderRenderer: 3    uniform sampler2D m_DepthTexture;
05-18 12:11:10.271 25944 25986 W com.jme3.renderer.android.OGLESShaderRenderer: 4    varying vec2 texCoord;
05-18 12:11:10.271 25944 25986 W com.jme3.renderer.android.OGLESShaderRenderer: 5    
05-18 12:11:10.271 25944 25986 W com.jme3.renderer.android.OGLESShaderRenderer: 6    uniform vec4 m_FogColor;
05-18 12:11:10.271 25944 25986 W com.jme3.renderer.android.OGLESShaderRenderer: 7    uniform float m_FogDensity;
05-18 12:11:10.271 25944 25986 W com.jme3.renderer.android.OGLESShaderRenderer: 8    uniform float m_FogDistance;
05-18 12:11:10.271 25944 25986 W com.jme3.renderer.android.OGLESShaderRenderer: 9    
05-18 12:11:10.271 25944 25986 W com.jme3.renderer.android.OGLESShaderRenderer: 10    vec2 m_FrustumNearFar=vec2(1.0,m_FogDistance);
05-18 12:11:10.271 25944 25986 W com.jme3.renderer.android.OGLESShaderRenderer: 11    const float LOG2 = 1.442695;
05-18 12:11:10.271 25944 25986 W com.jme3.renderer.android.OGLESShaderRenderer: 12    
05-18 12:11:10.271 25944 25986 W com.jme3.renderer.android.OGLESShaderRenderer: 13    void main() {
05-18 12:11:10.271 25944 25986 W com.jme3.renderer.android.OGLESShaderRenderer: 14           vec4 texVal = texture2D(m_Texture, texCoord);      
05-18 12:11:10.271 25944 25986 W com.jme3.renderer.android.OGLESShaderRenderer: 15           float fogVal =texture2D(m_DepthTexture,texCoord).r;
05-18 12:11:10.271 25944 25986 W com.jme3.renderer.android.OGLESShaderRenderer: 16           float depth= (2.0 * m_FrustumNearFar.x) / (m_FrustumNearFar.y + m_FrustumNearFar.x - fogVal* (m_FrustumNearFar.y-m_FrustumNearFar.x));
05-18 12:11:10.271 25944 25986 W com.jme3.renderer.android.OGLESShaderRenderer: 17    
05-18 12:11:10.271 25944 25986 W com.jme3.renderer.android.OGLESShaderRenderer: 18           float fogFactor = exp2( -m_FogDensity * m_FogDensity * depth *  depth * LOG2 );
05-18 12:11:10.271 25944 25986 W com.jme3.renderer.android.OGLESShaderRenderer: 19           fogFactor = clamp(fogFactor, 0.0, 1.0);
05-18 12:11:10.271 25944 25986 W com.jme3.renderer.android.OGLESShaderRenderer: 20           gl_FragColor =mix(m_FogColor,texVal,fogFactor);
05-18 12:11:10.271 25944 25986 W com.jme3.renderer.android.OGLESShaderRenderer: 21    
05-18 12:11:10.271 25944 25986 W com.jme3.renderer.android.OGLESShaderRenderer: 22    }
05-18 12:11:10.271 25944 25986 W com.jme3.renderer.android.OGLESShaderRenderer: 

Does somebody have any idea, how I may proceed next to conquer this bug?

Well, I fixed it myself.

For all who are interested, the solution is to put the offending expression into the main function like this:

uniform sampler2D m_Texture; 
uniform sampler2D m_DepthTexture; 
varying vec2 texCoord; 
 
uniform vec4 m_FogColor; 
uniform float m_FogDensity; 
uniform float m_FogDistance; 
 
const float LOG2 = 1.442695; 
 
void main() { 
       vec2 m_FrustumNearFar=vec2(1.0,m_FogDistance); 
       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)); 
 
       float fogFactor = exp2( -m_FogDensity * m_FogDensity * depth *  depth * LOG2 ); 
       fogFactor = clamp(fogFactor, 0.0, 1.0); 
       gl_FragColor =mix(m_FogColor,texVal,fogFactor); 
 
}

Then recompile with gradle and put the effects library where jMonkey can find it.

The Gurus of jMonkey may put this into the github repo, if someone cares.

1 Like

Thank you, that’s fixed

2 Likes