Shadow Renderer issues

Is there a tutorial for the new DirectionalLightShadowRenderer.

I previously used the PssmShadowRenderer however in RC2 it is now deprecated but the DirectionalLightShadowRenderer is not in the RC2 to be used.

I am looking into using the DirectionalLightShadowRenderer because I am having issues with the PssmShadowRenderer on mac right now with always getting bad compiles of the lwjgl, please see the error below.

[java]WARNING LwjglRenderer 4:30:41 PM Bad compile of:
1 #define FILTER_MODE 4
2 #define HARDWARE_SHADOWS 1
3 #define PCFEDGE 1.0
4 #define SHADOWMAP_SIZE 1024.0
5 #ifdef HARDWARE_SHADOWS
6 #define SHADOWMAP sampler2DShadow
7 #define SHADOWCOMPARE(tex,coord) shadow2DProj(tex, coord).r
8 #else
9 #define SHADOWMAP sampler2D
10 #define SHADOWCOMPARE(tex,coord) step(coord.z, texture2DProj(tex, coord).r)
11 #endif
12
13 #if FILTER_MODE == 0
14 #define GETSHADOW Shadow_DoShadowCompare
15 #define KERNEL 1.0
16 #elif FILTER_MODE == 1
17 #ifdef HARDWARE_SHADOWS
18 #define GETSHADOW Shadow_DoShadowCompare
19 #else
20 #define GETSHADOW Shadow_DoBilinear_2x2
21 #endif
22 #define KERNEL 1.0
23 #elif FILTER_MODE == 2
24 #define GETSHADOW Shadow_DoDither_2x2
25 #define KERNEL 1.0
26 #elif FILTER_MODE == 3
27 #define GETSHADOW Shadow_DoPCF
28 #define KERNEL 4.0
29 #elif FILTER_MODE == 4
30 #define GETSHADOW Shadow_DoPCFPoisson
31 #define KERNEL 4
32 #elif FILTER_MODE == 5
33 #define GETSHADOW Shadow_DoPCF
34 #define KERNEL 8.0
35 #endif
36
37
38 uniform SHADOWMAP m_ShadowMap0;
39 uniform SHADOWMAP m_ShadowMap1;
40 uniform SHADOWMAP m_ShadowMap2;
41 uniform SHADOWMAP m_ShadowMap3;
42
43 uniform vec4 m_Splits;
44
45 uniform float m_ShadowIntensity;
46
47 const vec2 pixSize2 = vec2(1.0 / SHADOWMAP_SIZE);
48 float shadowBorderScale = 1.0;
49
50 float Shadow_DoShadowCompareOffset(in SHADOWMAP tex, in vec4 projCoord, in vec2 offset){
51 vec4 coord = vec4(projCoord.xy + offset.xy * pixSize2 * shadowBorderScale, projCoord.zw);
52 return SHADOWCOMPARE(tex, coord);
53 }
54
55 float Shadow_DoShadowCompare(in SHADOWMAP tex, vec4 projCoord){
56 return SHADOWCOMPARE(tex, projCoord);
57 }
58
59 float Shadow_BorderCheck(in vec2 coord){
60 // Fastest, “hack” method (uses 4-5 instructions)
61 vec4 t = vec4(coord.xy, 0.0, 1.0);
62 t = step(t.wwxy, t.xyzz);
63 return dot(t,t);
64 }
65
66 float Shadow_DoDither_2x2(in SHADOWMAP tex, in vec4 projCoord){
67 float border = Shadow_BorderCheck(projCoord.xy);
68 if (border > 0.0)
69 return 1.0;
70
71
72 float shadow = 0.0;
73 vec2 o = mod(floor(gl_FragCoord.xy), 2.0);
74 shadow += Shadow_DoShadowCompareOffset(tex,projCoord,vec2(-1.5, 1.5) + o);
75 shadow += Shadow_DoShadowCompareOffset(tex,projCoord,vec2( 0.5, 1.5) + o);
76 shadow += Shadow_DoShadowCompareOffset(tex,projCoord,vec2(-1.5, -0.5) + o);
77 shadow += Shadow_DoShadowCompareOffset(tex,projCoord,vec2( 0.5, -0.5) + o);
78 shadow *= 0.25 ;
79 return shadow;
80 }
81
82 float Shadow_DoBilinear_2x2(in SHADOWMAP tex, in vec4 projCoord){
83 float border = Shadow_BorderCheck(projCoord.xy);
84 if (border > 0.0)
85 return 1.0;
86 vec4 gather = vec4(0.0);
87 gather.x = Shadow_DoShadowCompareOffset(tex, projCoord, vec2(0.0, 0.0));
88 gather.y = Shadow_DoShadowCompareOffset(tex, projCoord, vec2(1.0, 0.0));
89 gather.z = Shadow_DoShadowCompareOffset(tex, projCoord, vec2(0.0, 1.0));
90 gather.w = Shadow_DoShadowCompareOffset(tex, projCoord, vec2(1.0, 1.0));
91
92 vec2 f = fract( projCoord.xy * SHADOWMAP_SIZE );
93 vec2 mx = mix( gather.xz, gather.yw, f.x );
94 return mix( mx.x, mx.y, f.y );
95 }
96
97 float Shadow_DoPCF(in SHADOWMAP tex, in vec4 projCoord){
98 float shadow = 0.0;
99 float border = Shadow_BorderCheck(projCoord.xy);
100 if (border > 0.0)
101 return 1.0;
102 float bound = KERNEL * 0.5 - 0.5;
103 bound *= PCFEDGE;
104 for (float y = -bound; y <= bound; y += PCFEDGE){
105 for (float x = -bound; x 0.0)
135 return 1.0;
136
137 vec2 texelSize = vec2( 4.0 * PCFEDGE * shadowBorderScale);
138
139 shadow += Shadow_DoShadowCompareOffset(tex, projCoord , poissonDisk0 * texelSize);
140 shadow += Shadow_DoShadowCompareOffset(tex, projCoord , poissonDisk1 * texelSize);
141 shadow += Shadow_DoShadowCompareOffset(tex, projCoord , poissonDisk2 * texelSize);
142 shadow += Shadow_DoShadowCompareOffset(tex, projCoord , poissonDisk3 * texelSize);
143 shadow += Shadow_DoShadowCompareOffset(tex, projCoord , poissonDisk4 * texelSize);
144 shadow += Shadow_DoShadowCompareOffset(tex, projCoord , poissonDisk5 * texelSize);
145 shadow += Shadow_DoShadowCompareOffset(tex, projCoord , poissonDisk6 * texelSize);
146 shadow += Shadow_DoShadowCompareOffset(tex, projCoord , poissonDisk7 * texelSize);
147 shadow += Shadow_DoShadowCompareOffset(tex, projCoord , poissonDisk8 * texelSize);
148 shadow += Shadow_DoShadowCompareOffset(tex, projCoord , poissonDisk9 * texelSize);
149 shadow += Shadow_DoShadowCompareOffset(tex, projCoord , poissonDisk10 * texelSize);
150 shadow += Shadow_DoShadowCompareOffset(tex, projCoord , poissonDisk11 * texelSize);
151
152 shadow = shadow * 0.08333333333;//this is divided by 12
153 return shadow;
154 }
155
156
157 varying float shadowPosition;
158 varying vec4 projCoord0;
159 varying vec4 projCoord1;
160 varying vec4 projCoord2;
161 varying vec4 projCoord3;
162
163 #ifdef DISCARD_ALPHA
164 #ifdef COLOR_MAP
165 uniform sampler2D m_ColorMap;
166 #else
167 uniform sampler2D m_DiffuseMap;
168 #endif
169 uniform float m_AlphaDiscardThreshold;
170 varying vec2 texCoord;
171 #endif
172
173 void main(){
174
175 #ifdef DISCARD_ALPHA
176 #ifdef COLOR_MAP
177 float alpha = texture2D(m_ColorMap,texCoord).a;
178 #else
179 float alpha = texture2D(m_DiffuseMap,texCoord).a;
180 #endif
181 if(alpha<=m_AlphaDiscardThreshold){
182 discard;
183 }
184
185 #endif
186
187 float shadow = 0.0;
188 if(shadowPosition < m_Splits.x){
189 shadow = GETSHADOW(m_ShadowMap0, projCoord0);
190 }else if( shadowPosition < m_Splits.y){
191 shadowBorderScale = 0.5;
192 shadow = GETSHADOW(m_ShadowMap1, projCoord1);
193 }else if( shadowPosition < m_Splits.z){
194 shadowBorderScale = 0.25;
195 shadow = GETSHADOW(m_ShadowMap2, projCoord2);
196 }else if( shadowPosition < m_Splits.w){
197 shadowBorderScale = 0.125;
198 shadow = GETSHADOW(m_ShadowMap3, projCoord3);
199 }
200
201 shadow = shadow * m_ShadowIntensity + (1.0 - m_ShadowIntensity);
202
203 gl_FragColor = vec4(shadow, shadow, shadow, 1.0);
204
205 }

SEVERE Application 4:30:41 PM Uncaught exception thrown in Thread[LWJGL Renderer Thread,6,main]
com.jme3.renderer.RendererException: compile error in:ShaderSource[name=Common/MatDefs/Shadow/PostShadowPSSM.frag, defines, type=Fragment, language=GLSL100] error:ERROR: 0:102: '*' does not operate on 'int' and 'float'
ERROR: 0:103: Use of undeclared identifier 'bound'
ERROR: 0:104: Use of undeclared identifier 'bound'
ERROR: 0:104: Use of undeclared identifier 'y'
ERROR: 0:104: Use of undeclared identifier 'bound'
ERROR: 0:105: Use of undeclared identifier 'bound'
ERROR: 0:105: Use of undeclared identifier 'x'
ERROR: 0:105: Use of undeclared identifier 'bound'
ERROR: 0:106: Use of undeclared identifier 'x'
ERROR: 0:106: Use of undeclared identifier 'y'
ERROR: 0:105: Use of undeclared identifier 'x'
ERROR: 0:104: Use of undeclared identifier 'y'
ERROR: 0:112: '/' does not operate on 'float' and 'int'

at com.jme3.renderer.lwjgl.LwjglRenderer.updateShaderSourceData(LwjglRenderer.java:1009)
at com.jme3.renderer.lwjgl.LwjglRenderer.updateShaderData(LwjglRenderer.java:1032)
at com.jme3.renderer.lwjgl.LwjglRenderer.setShader(LwjglRenderer.java:1098)
at com.jme3.material.Material.render(Material.java:1058)
at com.jme3.renderer.RenderManager.renderGeometry(RenderManager.java:519)
at com.jme3.renderer.queue.RenderQueue.renderGeometryList(RenderQueue.java:301)
at com.jme3.renderer.queue.RenderQueue.renderShadowQueue(RenderQueue.java:319)
at com.jme3.shadow.PssmShadowRenderer.postFrame(PssmShadowRenderer.java:480)
at com.jme3.renderer.RenderManager.renderViewPort(RenderManager.java:989)
at com.jme3.renderer.RenderManager.render(RenderManager.java:1031)
at pyware.py3dtools.realView.RVWorld.update(RVWorld.java:888)
at com.jme3.system.lwjgl.LwjglAbstractDisplay.runLoop(LwjglAbstractDisplay.java:151)
at com.jme3.system.lwjgl.LwjglCanvas.runLoop(LwjglCanvas.java:229)
at com.jme3.system.lwjgl.LwjglAbstractDisplay.run(LwjglAbstractDisplay.java:228)
at java.lang.Thread.run(Thread.java:680)

[/java]

Either shadowing method would work for me I just need one to work properly on RC2 or on a stable Nightly Build.

Thank you for your time and wonderful product.

This issue has been fixed in nightly. to work around it don’t use the PCF poisson to filter edges.
To use the DirectionalLightShadowRenderer, you need to update to nightly for now. But it’s not really recommended unless you have no other choice.