Shadows on Android

Hello,
I am writing a simple code and try to run it on android

public void simpleInitApp() {

    cam.setLocation(new Vector3f(35f, 35f, 35f));
    cam.lookAt(new Vector3f(0, 0, 0), new Vector3f(0, 1, 0));

    DirectionalLight sun = new DirectionalLight();
    sun.setDirection(new Vector3f(10f, -10f, -20f));
    sun.setColor(ColorRGBA.White);
    rootNode.addLight(sun);

    int SHADOWMAP_SIZE = 512;
    DirectionalLightShadowRenderer dlsr = new DirectionalLightShadowRenderer(assetManager, SHADOWMAP_SIZE, 1);
    dlsr.setLight(sun);
    viewPort.addProcessor(dlsr);

    DirectionalLightShadowFilter dlsf = new DirectionalLightShadowFilter(assetManager, SHADOWMAP_SIZE, 1);
    dlsf.setLight(sun);
    dlsf.setEnabled(true);
    FilterPostProcessor fpp = new FilterPostProcessor(assetManager);
    fpp.addFilter(dlsf);
    viewPort.addProcessor(fpp);

    rootNode.setShadowMode(RenderQueue.ShadowMode.CastAndReceive);

    Box box1 = new Box(20, 0, 20);
    Geometry geom1 = new Geometry("Ground", box1);
    Material mat1 = new Material(getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md");
    mat1.setColor("Color", ColorRGBA.Blue);
    geom1.setMaterial(mat1);
    rootNode.attachChild(geom1);

    Box box2 = new Box(2, 2, 2);
    Geometry geom2 = new Geometry("Box", box2);
    Material mat2 = new Material(getAssetManager(), "Common/MatDefs/Misc/Unshaded.j3md");
    mat2.setColor("Color", ColorRGBA.Red);
    geom2.setMaterial(mat2);
    rootNode.attachChild(geom2);
}

And i got this error:

Exception thrown in Thread[GLThread 73370,5,main]
com.jme3.renderer.RendererException: compile error in:ShaderSource[name=Common/MatDefs/Shadow/PostShadow.frag, defines, type=Fragment, language=GLSL100] error:Fragment shader compilation failed.
ERROR: 0:40: ‘sampler2DShadow’ : Reserved word.
ERROR: 0:40: ‘sampler2DShadow’ : Syntax error: syntax error
ERROR: 2 compilation errors. No code generated.
at com.jme3.renderer.android.OGLESShaderRenderer.updateShaderSourceData(OGLESShaderRenderer.java:887)
at com.jme3.renderer.android.OGLESShaderRenderer.updateShaderData(OGLESShaderRenderer.java:912)
at com.jme3.renderer.android.OGLESShaderRenderer.setShader(OGLESShaderRenderer.java:970)
at com.jme3.material.Material.render(Material.java:1116)
at com.jme3.renderer.RenderManager.renderGeometry(RenderManager.java:507)
at com.jme3.renderer.queue.RenderQueue.renderGeometryList(RenderQueue.java:322)
at com.jme3.renderer.queue.RenderQueue.renderShadowQueue(RenderQueue.java:331)
at com.jme3.shadow.AbstractShadowRenderer.postFrame(AbstractShadowRenderer.java:478)
at com.jme3.renderer.RenderManager.renderViewPort(RenderManager.java:987)
at com.jme3.renderer.RenderManager.render(RenderManager.java:1029)
at com.jme3.app.SimpleApplication.update(SimpleApplication.java:252)
at com.jme3.app.AndroidHarness.update(AndroidHarness.java:467)
at com.jme3.system.android.OGLESContext.onDrawFrame(OGLESContext.java:349)
at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1535)
at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1240)

Is it any way to get shadows on adroid?

I’m pretty sure that even if you do get the shader to compile, your FPS will go into negative numbers :smile:

2 Likes

Agreed with grizeldi, In my experience it’s tough enough to get a light working without serious fps dropping. Using things like filters pushes Android phones pretty hard, though the newer phones can handle a lot.

You can get decent 3d environments working on Android but unshaded materials and low poly models are the way to go.

If someone has had success or different experience on Android I’m sure they’d share.

Thanks for answer.
Too bad that shadows does not work on android.