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.