Android - Getting RendererException After Adding Shadow Filters

Hello Guys,
I’m getting this exception after adding DirectionalLightShadowFilter+SSAOFilter filters:

W/com.jme3.renderer.opengl.GLRenderer: WARNING Bad compile of:
    1	#version 310 es
    2	#define FRAGMENT_SHADER 1
    3	#define HARDWARE_SHADOWS 1
    4	#define FILTER_MODE 1
    5	#define PCFEDGE 1.0
    6	#define SHADOWMAP_SIZE 4096.0
    7	#define FADE 1
    8	#define PSSM 1
    9	#define BACKFACE_SHADOWS 1
    10	#extension GL_ARB_texture_multisample : enable
    11	        #extension GL_OES_gpu_shader5 : enable
    12	        #extension GL_ARB_gpu_shader5 : enable
    13	precision highp float;
    14	precision highp sampler2D;
    15	precision highp sampler3D;
    16	precision highp sampler2DShadow;
    17	precision highp sampler2DArray;
    18	precision highp sampler2DMS;
    19	// -- begin import Common/ShaderLib/GLSLCompat.glsllib --
    20	#if defined GL_ES
    21	#  define hfloat highp float
    22	#  define hvec2  highp vec2
    23	#  define hvec3  highp vec3
    24	#  define hvec4  highp vec4
    25	#  define lfloat lowp float
    26	#  define lvec2 lowp vec2
    27	#  define lvec3 lowp vec3
    28	#  define lvec4 lowp vec4
    29	#else
    30	#  define hfloat float
    31	#  define hvec2  vec2
    32	#  define hvec3  vec3
    33	#  define hvec4  vec4
    34	#  define lfloat float
    35	#  define lvec2  vec2
    36	#  define lvec3  vec3
    37	#  define lvec4  vec4
    38	#endif
    39	
    40	#if __VERSION__ >= 130
    41	#  ifdef GL_ES
    42	out highp vec4 outFragColor;
    43	#  else
    44	out vec4 outFragColor;
    45	#endif
    46	#  define texture1D texture
    47	#  define texture2D texture
    48	#  define texture3D texture
    49	#  define textureCube texture
    50	#  define texture2DLod textureLod
    51	#  define textureCubeLod textureLod
    52	#  define texture2DArray texture
    53	#  if defined VERTEX_SHADER
    54	#    define varying out
    55	#    define attribute in
    56	#  elif defined FRAGMENT_SHADER
    57	#    define varying in
    58	#    define gl_FragColor outFragColor
    59	#  endif
    60	#else
    61	#  define isnan(val) !(val<0.0||val>0.0||val==0.0)
    62	#endif
    63	
    64	#if __VERSION__ == 110
    65	mat3 mat3_sub(mat4 m) {
    66	  return mat3(m[0].xyz, m[1].xyz, m[2].xyz);
    67	}
    68	#else
    69	 #define mat3_sub mat3
    70	#endif
    71	
    72	#if __VERSION__ <= 140
    73	float determinant(mat2 m) {
    74	  return m[0][0] * m[1][1] - m[1][0] * m[0][1];
    75	}
    76	
    77	float determinant(mat3 m) {
    78	  return  + m[0][0] * (m[1][1] * m[2][2] - m[1][2] * m[2][1])
    79	          - m[0][1] * (m[1][0] * m[2][2] - m[1][2] * m[2][0])
    80	          + m[0][2] * (m[1][0] * m[2][1] - m[1][1] * m[2][0]);
    81	}
    82	#endif
    83	
    84	#if __VERSION__ <= 130
    85	mat2 inverse(mat2 m) {
    86	  return mat2(m[1][1], -m[0][1], -m[1][0], m[0][0]) / determinant(m);
    87	}
    88	
    89	mat3 inverse(mat3 m) {
    90	  return mat3(
    91	    + (m[1][1] * m[2][2] - m[2][1] * m[1][2]),
    92	    - (m[1][0] * m[2][2] - m[2][0] * m[1][2]),
    93	    + (m[1][0] * m[2][1] - m[2][0] * m[1][1]),
    94	    - (m[0][1] * m[2][2] - m[2][1] * m[0][2]),
    95	    + (m[0][0] * m[2][2] - m[2][0] * m[0][2]),
    96	    - (m[0][0] * m[2][1] - m[2][0] * m[0][1]),
    97	    + (m[0][1] * m[1][2] - m[1][1] * m[0][2]),
    98	    - (m[0][0] * m[1][2] - m[1][0] * m[0][2]),
    99	    + (m[0][0] * m[1][1] - m[1][0] * m[0][1])) / determinant(m);
    100	}
    101	#endif
    102	
    103	// -- end import Common/ShaderLib/GLSLCompat.glsllib --
    104	// -- begin import Common/ShaderLib/MultiSample.glsllib --
    105	
    106	uniform int m_NumSamples;
    107	uniform int m_NumSamplesDepth;
    108	
    109	#ifdef RESOLVE_MS
    110	    #define COLORTEXTURE sampler2DMS
    111	#else
    112	    #define COLORTEXTURE sampler2D
    113	#endif
    114	
    115	#ifdef RESOLVE_DEPTH_MS
    116	    #define DEPTHTEXTURE sampler2DMS
    117	#else
    118	    #define DEPTHTEXTURE sampler2D
    119	#endif
    120	
    121	// NOTE: Only define multisample functions if multisample is available
    122	#if defined(GL_ARB_texture_multisample) || (defined GL_ES && __VERSION__>=310)
    123	vec4 textureFetch(in sampler2DMS tex,in vec2 texC, in int numSamples){
    124	      ivec2 iTexC = ivec2(texC * vec2(textureSize(tex)));
    125	      vec4 color = vec4(0.0);
    126	      for (int i = 0; i < numSamples; i++){
    127	         color += texelFetch(tex, iTexC, i);
    128	      }
    129	      return color / float(numSamples);
    130	}
    131	
    132	vec4 fetchTextureSample(in sampler2DMS tex,in vec2 texC,in int sampleId){
    133	    ivec2 iTexC = ivec2(texC * vec2(textur
2021-05-18 21:28:25.631 16593-16716/com.abware.scenemax3dgamehub E/AndroidRuntime: FATAL EXCEPTION: GLThread 603
    Process: com.abware.scenemax3dgamehub, PID: 16593
    com.jme3.renderer.RendererException: compile error in: ShaderSource[name=Common/MatDefs/Shadow/PostShadowFilter15.frag, defines, type=Fragment, language=GLSL310]
    0(11) : error C7621: #extension directive must occur before any non-preprocessor token
    0(12) : error C7621: #extension directive must occur before any non-preprocessor token
    0(13) : error C7621: #extension directive must occur before any non-preprocessor token
    
        at com.jme3.renderer.opengl.GLRenderer.updateShaderSourceData(GLRenderer.java:1485)
        at com.jme3.renderer.opengl.GLRenderer.updateShaderData(GLRenderer.java:1512)
        at com.jme3.renderer.opengl.GLRenderer.setShader(GLRenderer.java:1576)
        at com.jme3.material.logic.DefaultTechniqueDefLogic.render(DefaultTechniqueDefLogic.java:94)
        at com.jme3.material.Technique.render(Technique.java:166)
        at com.jme3.material.Material.render(Material.java:1026)
        at com.jme3.renderer.RenderManager.renderGeometry(RenderManager.java:614)
        at com.jme3.post.FilterPostProcessor.renderProcessing(FilterPostProcessor.java:230)
        at com.jme3.post.FilterPostProcessor.renderFilterChain(FilterPostProcessor.java:314)
        at com.jme3.post.FilterPostProcessor.postFrame(FilterPostProcessor.java:334)
        at com.jme3.renderer.RenderManager.renderViewPort(RenderManager.java:1114)
        at com.jme3.renderer.RenderManager.render(RenderManager.java:1158)
        at com.jme3.app.SimpleApplication.update(SimpleApplication.java:272)
        at com.jme3.app.AndroidHarnessFragment.update(AndroidHarnessFragment.java:577)
        at com.jme3.system.android.OGLESContext.onDrawFrame(OGLESContext.java:348)
        at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1571)
        at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1270)
2021-05-18 21:28:25.635 16593-16716/com.abware.scenemax3dgamehub E/com.jme3.app.AndroidHarnessFragment: SEVERE Exception thrown in Thread[GLThread 603,5,main]
    com.jme3.renderer.RendererException: compile error in: ShaderSource[name=Common/MatDefs/Shadow/PostShadowFilter15.frag, defines, type=Fragment, language=GLSL310]
    0(11) : error C7621: #extension directive must occur before any non-preprocessor token
    0(12) : error C7621: #extension directive must occur before any non-preprocessor token
    0(13) : error C7621: #extension directive must occur before any non-preprocessor token
    
        at com.jme3.renderer.opengl.GLRenderer.updateShaderSourceData(GLRenderer.java:1485)
        at com.jme3.renderer.opengl.GLRenderer.updateShaderData(GLRenderer.java:1512)
        at com.jme3.renderer.opengl.GLRenderer.setShader(GLRenderer.java:1576)
        at com.jme3.material.logic.DefaultTechniqueDefLogic.render(DefaultTechniqueDefLogic.java:94)
        at com.jme3.material.Technique.render(Technique.java:166)
        at com.jme3.material.Material.render(Material.java:1026)
        at com.jme3.renderer.RenderManager.renderGeometry(RenderManager.java:614)
        at com.jme3.post.FilterPostProcessor.renderProcessing(FilterPostProcessor.java:230)
        at com.jme3.post.FilterPostProcessor.renderFilterChain(FilterPostProcessor.java:314)
        at com.jme3.post.FilterPostProcessor.postFrame(FilterPostProcessor.java:334)
        at com.jme3.renderer.RenderManager.renderViewPort(RenderManager.java:1114)
        at com.jme3.renderer.RenderManager.render(RenderManager.java:1158)
        at com.jme3.app.SimpleApplication.update(SimpleApplication.java:272)
        at com.jme3.app.AndroidHarnessFragment.update(AndroidHarnessFragment.java:577)
        at com.jme3.system.android.OGLESContext.onDrawFrame(OGLESContext.java:348)
        at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1571)
        at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1270)

So the question is - is it a known issue and what is the best way in Android to render shadows?

Thanks!

1 Like

I think I have tried the ambient occlusion before but it didn’t work as I remember, but I will try it again, generally using DirectionalLightShadowRenderer would be efficient for android devices, bloom filter is also good but too much filters will slow down a test case, what if it were a game then ?! Filters need optimizations on android…

1 Like

In frag & vert shaders, usually most jme files are handled against GLSL of GLES, in this case I think if there’s no visual error as its here, then those files are not handled against GLSL of GLES…that would involve writing some code in ShaderSource[name=Common/MatDefs/Shadow/PostShadowFilter15.frag & it should hopefully work…

EDIT : IN CPP/c native, preprocessor arguments are #MACRO 110 or macros, they occur before the program being compiled, so #extension directive should be the glsl version declared at the top of the file, so if we have identified the version for glsl, then that may work

NB : if the version is not specified then its by default glsl110, which may break things…

I tried the DirectionalLightShadowRenderer:

final int SHADOWMAP_SIZE=1024;
        DirectionalLightShadowRenderer dlsr = new DirectionalLightShadowRenderer(assetManager, SHADOWMAP_SIZE, 3);
        dlsr.setLight(sun);
        viewPort.addProcessor(dlsr);

It crashes the emulator but works fine on the physical device.
Good enough for now.

1 Like

Could you please send the crash in another thread ? So we can now if its a bug or something.

well… I checked again with the physical device and the DirectionalLightShadowFilter filter is also working fine BUT the performance are horrible :slight_smile:

        FilterPostProcessor fpp = new FilterPostProcessor(assetManager);

        DirectionalLightShadowFilter shadowFilter = new DirectionalLightShadowFilter(assetManager, 4096, 4);
        shadowFilter.setLight(sun);
        shadowFilter.setShadowIntensity(0.3f);
        shadowFilter.setShadowZExtend(256);
        shadowFilter.setShadowZFadeLength(128);
        // shadowFilter.setEdgeFilteringMode(EdgeFilteringMode.PCFPOISSON);
        fpp.addFilter(shadowFilter);

        SSAOFilter ssaoFilter = new SSAOFilter();
        fpp.addFilter(ssaoFilter);

        viewPort.addProcessor(fpp);
1 Like

Im not sure I understand - this thread is about the exception in the emulator. What other thread to open?

I think if so, may be the physical processes the bad compilation of the shader file…but if there’s a bad compilation or a warning, then its better be fixed

1 Like

I mean If the crash is different, you better create another thread

This crash here :

1 Like

It’s the one and only crash I have. It happens only in the emulator. So - both filters works fine on the physical device but crashes the emulator. I will try to check some more devices to get a better picture of the problem

1 Like

BTW @sgold MaVehicles lib seems to work fine on Android. I just need to figure out best practice for the input controls but that’s for another thread :slight_smile:

2 Likes

You can use my library for so, instead of doing textures, it uses android views, but you will need to use JmeSurfaceView on jme3.4.0-beta, I have sent you the demo back before but it lacks some docs in some places…

EDIT : if you have faced in a bug inside it, report at once, I will fix that bug or add docs of what was missed…

1 Like

Oh, btw that’s a good news :slightly_smiling_face:

I’ll check it out soon. Thanks!

1 Like