diff --git a/engine/src/core-data/Common/MatDefs/Shadow/PostShadowFilter.frag b/engine/src/core-data/Common/MatDefs/Shadow/PostShadowFilter.frag index c2666fcc8..f22a93af2 100644 --- a/engine/src/core-data/Common/MatDefs/Shadow/PostShadowFilter.frag +++ b/engine/src/core-data/Common/MatDefs/Shadow/PostShadowFilter.frag @@ -35,6 +35,10 @@ vec3 getPosition(in float depth, in vec2 uv){ } void main(){ + #if !defined( RENDER_SHADOWS ) + gl_FragColor = texture2D(m_Texture,texCoord); + return; + #endif float depth = texture2D(m_DepthTexture,texCoord).r; vec4 color = texture2D(m_Texture,texCoord); diff --git a/engine/src/core-data/Common/MatDefs/Shadow/PostShadowFilter.j3md b/engine/src/core-data/Common/MatDefs/Shadow/PostShadowFilter.j3md index 8fd8b82f0..c97f0a323 100644 --- a/engine/src/core-data/Common/MatDefs/Shadow/PostShadowFilter.j3md +++ b/engine/src/core-data/Common/MatDefs/Shadow/PostShadowFilter.j3md @@ -56,6 +56,9 @@ MaterialDef Post Shadow { FADE : FadeInfo PSSM : Splits POINTLIGHT : LightViewProjectionMatrix5 + //if no shadow map don't render shadows + RENDER_SHADOWS : ShadowMap0 + } } diff --git a/engine/src/core-data/Common/MatDefs/Shadow/PostShadowFilter15.frag b/engine/src/core-data/Common/MatDefs/Shadow/PostShadowFilter15.frag index a8280ea1c..c4579fdf8 100644 --- a/engine/src/core-data/Common/MatDefs/Shadow/PostShadowFilter15.frag +++ b/engine/src/core-data/Common/MatDefs/Shadow/PostShadowFilter15.frag @@ -87,6 +87,11 @@ vec4 main_multiSample(in int numSample){ void main(){ + #if !defined( RENDER_SHADOWS ) + outFragColor = fetchTextureSample(m_Texture,texCoord,0); + return; + #endif + #ifdef RESOLVE_MS vec4 color = vec4(0.0); for (int i = 0; i < m_NumSamples; i++){ diff --git a/engine/src/core/com/jme3/shadow/AbstractShadowFilter.java b/engine/src/core/com/jme3/shadow/AbstractShadowFilter.java index a10775458..ce7e35bc5 100644 --- a/engine/src/core/com/jme3/shadow/AbstractShadowFilter.java +++ b/engine/src/core/com/jme3/shadow/AbstractShadowFilter.java @@ -71,7 +71,7 @@ public abstract class AbstractShadowFilter ext @SuppressWarnings("all") protected AbstractShadowFilter(AssetManager manager, int shadowMapSize, T shadowRenderer) { super("Post Shadow"); - material = new Material(manager, "Common/MatDefs/Shadow/PostShadowFilter.j3md"); + material = new Material(manager, "Common/MatDefs/Shadow/PostShadowFilter.j3md"); this.shadowRenderer = shadowRenderer; this.shadowRenderer.setPostShadowMaterial(material); } @@ -86,7 +86,7 @@ public abstract class AbstractShadowFilter ext return true; } - public Material getShadowMaterial() { + public Material getShadowMaterial() { return material; } Vector4f tmpv = new Vector4f(); @@ -103,11 +103,17 @@ public abstract class AbstractShadowFilter ext @Override protected void postQueue(RenderQueue queue) { shadowRenderer.postQueue(queue); + if(shadowRenderer.skipPostPass){ + //removing the shadow map so that the post pass is skipped + material.setTexture("ShadowMap0", null); + } } @Override protected void postFrame(RenderManager renderManager, ViewPort viewPort, FrameBuffer prevFilterBuffer, FrameBuffer sceneBuffer) { - shadowRenderer.setPostShadowParams(); + if(!shadowRenderer.skipPostPass){ + shadowRenderer.setPostShadowParams(); + } } @Override diff --git a/engine/src/core/com/jme3/shadow/AbstractShadowRenderer.java b/engine/src/core/com/jme3/shadow/AbstractShadowRenderer.java index d3fb58034..094291a95 100644 --- a/engine/src/core/com/jme3/shadow/AbstractShadowRenderer.java +++ b/engine/src/core/com/jme3/shadow/AbstractShadowRenderer.java @@ -104,6 +104,8 @@ public abstract class AbstractShadowRenderer implements SceneProcessor, Savable protected GeometryList shadowMapOccluders = new GeometryList(new OpaqueComparator()); private String[] shadowMapStringCache; private String[] lightViewStringCache; + //used to skip the post pass when there are no shadow casters. + protected boolean skipPostPass; /** @@ -350,7 +352,9 @@ public abstract class AbstractShadowRenderer implements SceneProcessor, Savable public void postQueue(RenderQueue rq) { GeometryList occluders = rq.getShadowQueueContent(ShadowMode.Cast); sceneReceivers = rq.getShadowQueueContent(ShadowMode.Receive); + skipPostPass = false; if (sceneReceivers.size() == 0 || occluders.size() == 0) { + skipPostPass = true; return; } @@ -427,7 +431,9 @@ public abstract class AbstractShadowRenderer implements SceneProcessor, Savable abstract GeometryList getReceivers(GeometryList sceneReceivers, GeometryList lightReceivers); public void postFrame(FrameBuffer out) { - + if (skipPostPass) { + return; + } if (debug) { displayShadowMap(renderManager.getRenderer()); }