Shadow rendering from the inside of objects

Hi, I am having a problem with shadow rendering. Please see the attached image:

It seems, the shadows are rendered to the inside of the object. Strange enough, that they can be seen from the outside through a no transparent texture.

Does anyone have a clue what this could be? Here is the code I apply it with:

DirectionalLightShadowRenderer dlsr = new DirectionalLightShadowRenderer(assetManager, shadowMapSize, 1);
dlsr.setLight(sun);
dlsr.setEdgeFilteringMode(EdgeFilteringMode.PCFPOISSON);
viewPort.addProcessor(dlsr);

and I also set the shadow Mode of the objects to “CastAndReceive”

Thanks for any help

I found out, the shadow map seems to be in front of everything. on the attached image, you can see, the car being in front of the gas station, but the shadow of the gas station being in front of the car :

This loks for me like either a filter order or a Bucket based problem.

How right you are :slight_smile: Thanks! I rendered FogFilter before the shadow. Changing the order solved the problem. Thanks :slight_smile:

BTW: Do you know a way to make the SSAOFilter work on Os X Macbook? I get the following error when rendering the Ambient Occlusiuon:
com.jme3.renderer.RendererException: compile error in:ShaderSource[name=Common/MatDefs/SSAO/ssao.frag, defines, type=Fragment, language=GLSL120] error:ERROR: 0:38: Swizzle component ‘z’ indexes beyond end of input vector (length 2)
ERROR: 0:39: Use of undeclared identifier ‘rand’

at com.jme3.renderer.lwjgl.LwjglRenderer.updateShaderSourceData(LwjglRenderer.java:1026)
at com.jme3.renderer.lwjgl.LwjglRenderer.updateShaderData(LwjglRenderer.java:1049)
at com.jme3.renderer.lwjgl.LwjglRenderer.setShader(LwjglRenderer.java:1115)
at com.jme3.material.Material.render(Material.java:1116)
at com.jme3.renderer.RenderManager.renderGeometry(RenderManager.java:523)
at com.jme3.post.FilterPostProcessor.renderProcessing(FilterPostProcessor.java:202)
at com.jme3.post.FilterPostProcessor.renderFilterChain(FilterPostProcessor.java:254)
at com.jme3.post.FilterPostProcessor.postFrame(FilterPostProcessor.java:293)
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.system.lwjgl.LwjglAbstractDisplay.runLoop(LwjglAbstractDisplay.java:151)
at com.jme3.system.lwjgl.LwjglDisplay.runLoop(LwjglDisplay.java:185)
at com.jme3.system.lwjgl.LwjglAbstractDisplay.run(LwjglAbstractDisplay.java:228)
at java.lang.Thread.run(Thread.java:744)

Googled it and it seems to be a problem with the Grafic Card. Is there another AO Filter for jMonkey?

what’s on line 38? usually the code is output in the console before that error with line numbers.

Found this.

36: vec2 getRandom(in vec2 uv){
37: vec4 rand=texture2D(m_RandomMap,g_Resolution.zw * uv / 128.0 * 3.0)*2.0 -1.0;
38: return normalize(rand.xy);
39:}

the whole file is here: https://code.google.com/p/jmonkeyengine/source/browse/trunk/engine/src/core-effects/Common/MatDefs/SSAO/ssao.frag?r=10750

seems its looking for a 3D Vector? But how to solve it?

Also: I get the same Error when trying the TestSSAO.java from jMonkey …

This is the error when using the TestSSAO.java:

Mai 13, 2014 8:57:20 PM com.jme3.system.JmeDesktopSystem initialize
Information: Running on jMonkeyEngine 3.0.0 RC2
Mai 13, 2014 8:57:21 PM com.jme3.system.Natives extractNativeLibs
Information: Extraction Directory: /Users/paulhoepner/Studium/Master-Arbeit/OpenDS/Source/opends_2.0_src
Mai 13, 2014 8:57:21 PM com.jme3.system.lwjgl.LwjglContext printContextInitInfo
Information: Lwjgl 2.9.0 context running on thread LWJGL Renderer Thread
Mai 13, 2014 8:57:21 PM com.jme3.system.lwjgl.LwjglContext printContextInitInfo
Information: Adapter: null
Mai 13, 2014 8:57:21 PM com.jme3.system.lwjgl.LwjglContext printContextInitInfo
Information: Driver Version: null
Mai 13, 2014 8:57:21 PM com.jme3.system.lwjgl.LwjglContext printContextInitInfo
Information: Vendor: NVIDIA Corporation
Mai 13, 2014 8:57:21 PM com.jme3.system.lwjgl.LwjglContext printContextInitInfo
Information: OpenGL Version: 2.1 NVIDIA-8.24.9 310.40.25f01
Mai 13, 2014 8:57:21 PM com.jme3.system.lwjgl.LwjglContext printContextInitInfo
Information: Renderer: NVIDIA GeForce GT 650M OpenGL Engine
Mai 13, 2014 8:57:21 PM com.jme3.system.lwjgl.LwjglContext printContextInitInfo
Information: GLSL Ver: 1.20
Mai 13, 2014 8:57:21 PM com.jme3.audio.lwjgl.LwjglAudioRenderer initInThread
Information: Audio Device: OpenAL Soft
Mai 13, 2014 8:57:21 PM com.jme3.audio.lwjgl.LwjglAudioRenderer initInThread
Information: Audio Vendor: OpenAL Community
Mai 13, 2014 8:57:21 PM com.jme3.audio.lwjgl.LwjglAudioRenderer initInThread
Information: Audio Renderer: OpenAL Soft
Mai 13, 2014 8:57:21 PM com.jme3.audio.lwjgl.LwjglAudioRenderer initInThread
Information: Audio Version: 1.1 ALSOFT 1.15.1
Mai 13, 2014 8:57:21 PM com.jme3.audio.lwjgl.LwjglAudioRenderer initInThread
Information: AudioRenderer supports 64 channels
Mai 13, 2014 8:57:21 PM com.jme3.audio.lwjgl.LwjglAudioRenderer initInThread
Information: Audio effect extension version: 1.0
Mai 13, 2014 8:57:21 PM com.jme3.audio.lwjgl.LwjglAudioRenderer initInThread
Information: Audio max auxilary sends: 4
Mai 13, 2014 8:57:22 PM com.jme3.renderer.lwjgl.LwjglRenderer updateShaderSourceData
Warnung: Bad compile of:
1 #version 120
2 uniform vec2 g_Resolution;
3 uniform vec2 m_FrustumNearFar;
4 uniform sampler2D m_Texture;
5 uniform sampler2D m_Normals;
6 uniform sampler2D m_RandomMap;
7 uniform sampler2D m_DepthTexture;
8 uniform vec3 m_FrustumCorner;
9 uniform float m_SampleRadius;
10 uniform float m_Intensity;
11 uniform float m_Scale;
12 uniform float m_Bias;
13 uniform bool m_UseOnlyAo;
14 uniform bool m_UseAo;
15 uniform vec2[4] m_Samples;
16
17 varying vec2 texCoord;
18
19 float depthv;
20
21 vec3 getPosition(in vec2 uv){
22 //Reconstruction from depth
23 depthv =texture2D(m_DepthTexture,uv).r;
24 float depth= (2.0 * m_FrustumNearFar.x) / (m_FrustumNearFar.y + m_FrustumNearFar.x - depthv* (m_FrustumNearFar.y-m_FrustumNearFar.x));
25
26 //one frustum corner method
27 float x = mix(-m_FrustumCorner.x, m_FrustumCorner.x, uv.x);
28 float y = mix(-m_FrustumCorner.y, m_FrustumCorner.y, uv.y);
29
30 return depth* vec3(x, y, m_FrustumCorner.z);
31 }
32
33 vec3 getNormal(in vec2 uv){
34 return normalize(texture2D(m_Normals, uv).xyz * 2.0 - 1.0);
35 }
36
37 vec2 getRandom(in vec2 uv){
38 vec4 rand=texture2D(m_RandomMap,g_Resolution.zw * uv / 128.0 * 3.0)2.0 -1.0;
39 return normalize(rand.xy);
40 }
41
42 float doAmbientOcclusion(in vec2 tc, in vec3 pos, in vec3 norm){
43 vec3 diff = getPosition(tc)- pos;
44 vec3 v = normalize(diff);
45 float d = length(diff) * m_Scale;
46
47 return max(0.0, dot(norm, v) - m_Bias) * ( 1.0/(1.0 + d) ) * m_Intensity;
48 }
49
50 vec2 reflection(in vec2 v1,in vec2 v2){
51 vec2 result= 2.0 * dot(v2, v1) * v2;
52 result=v1-result;
53 return result;
54 }
55
56
57 //const vec2 vec[4] = vec2[4](vec2(1.0,0.0), vec2(-1.0,0.0), vec2(0.0,1.0), vec2(0.0,-1.0));
58 void main(){
59
60 float result;
61
62 //vec2 vec[4] = { vec2(1.0, 0.0), vec2(-1.0, 0.0), vec2(0.0, 1.0), vec2(0.0, -1.0) };
63 vec3 position = getPosition(texCoord);
64 //optimization, do not calculate AO if depth is 1
65 if(depthv==1.0){
66 gl_FragColor=vec4(1.0);
67 return;
68 }
69 vec3 normal = getNormal(texCoord);
70 vec2 rand = getRandom(texCoord);
71
72 float ao = 0.0;
73 float rad =m_SampleRadius / position.z;
74
75
76 int iterations = 4;
77 for (int j = 0; j < iterations; ++j){
78 vec2 coord1 = reflection(vec2(m_Samples[j]), vec2(rand)) * vec2(rad,rad);
79 vec2 coord2 = vec2(coord1.x
0.707 - coord1.y* 0.707, coord1.x* 0.707 + coord1.y* 0.707) ;
80
81 ao += doAmbientOcclusion(texCoord + coord1.xy * 0.25, position, normal);
82 ao += doAmbientOcclusion(texCoord + coord2 * 0.50, position, normal);
83 ao += doAmbientOcclusion(texCoord + coord1.xy * 0.75, position, normal);
84 ao += doAmbientOcclusion(texCoord + coord2 * 1.00, position, normal);
85 }
86 ao /= float(iterations) * 4.0;
87 result = 1.0 - ao;
88
89 gl_FragColor=vec4(result);
90 }

Mai 13, 2014 8:57:22 PM com.jme3.app.Application handleError
Schwerwiegend: Uncaught exception thrown in Thread[LWJGL Renderer Thread,5,main]
com.jme3.renderer.RendererException: compile error in:ShaderSource[name=Common/MatDefs/SSAO/ssao.frag, defines, type=Fragment, language=GLSL120] error:ERROR: 0:38: Swizzle component ‘z’ indexes beyond end of input vector (length 2)
ERROR: 0:39: Use of undeclared identifier ‘rand’

at com.jme3.renderer.lwjgl.LwjglRenderer.updateShaderSourceData(LwjglRenderer.java:1026)
at com.jme3.renderer.lwjgl.LwjglRenderer.updateShaderData(LwjglRenderer.java:1049)
at com.jme3.renderer.lwjgl.LwjglRenderer.setShader(LwjglRenderer.java:1115)
at com.jme3.material.Material.render(Material.java:1116)
at com.jme3.renderer.RenderManager.renderGeometry(RenderManager.java:523)
at com.jme3.post.FilterPostProcessor.renderProcessing(FilterPostProcessor.java:202)
at com.jme3.post.FilterPostProcessor.renderFilterChain(FilterPostProcessor.java:254)
at com.jme3.post.FilterPostProcessor.postFrame(FilterPostProcessor.java:293)
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.system.lwjgl.LwjglAbstractDisplay.runLoop(LwjglAbstractDisplay.java:151)
at com.jme3.system.lwjgl.LwjglDisplay.runLoop(LwjglDisplay.java:185)
at com.jme3.system.lwjgl.LwjglAbstractDisplay.run(LwjglAbstractDisplay.java:228)
at java.lang.Thread.run(Thread.java:744)

oh ok.
I fixed that issue some time ago.

It will be pushed to next stable

Wow, cool, thanks :slight_smile:

Is there by any chance a place to download the patched changed JME3-effects.jar :slight_smile:

just clone the git and compile it yourself, works mostly fine. “gradle clean jar” Should work fine.

already did, thanks :slight_smile: