Shader compile error in Postshadow

Hi,

I get the following error on my craptop

17:30:31.668 [LWJGL Renderer Thread] ERROR d.v.jme.RendererApplication - Error loading {}
com.jme3.renderer.RendererException: compile error in:ShaderSource[name=Common/MatDefs/Shadow/PostShadowFilter.frag, defines, type=Fragment, language=GLSL100] error:0:296(15): error: could not implicitly convert operands to relational operator
0:296(15): error: if-statement condition must be scalar boolean

The offending line is:
if( dot(m_LightDir,lightDir)<0){
If i understand right the mesa driver has a point here, correctly it should be 0.0 as there is a implicit cast from 0(int) to 0.0(float)

Aug 17, 2014 5:30:31 PM com.jme3.renderer.lwjgl.LwjglRenderer updateShaderSourceData
WARNING: Bad compile of:
1	#define FILTER_MODE 1
2	#define HARDWARE_SHADOWS 1
3	#define PCFEDGE 1.0
4	#define SHADOWMAP_SIZE 2048.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.0
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	#ifdef POINTLIGHT
43	uniform SHADOWMAP m_ShadowMap4;
44	uniform SHADOWMAP m_ShadowMap5;
45	#endif
46	
47	#ifdef PSSM
48	uniform vec4 m_Splits;
49	#endif
50	
51	uniform float m_ShadowIntensity;
52	
53	const vec2 pixSize2 = vec2(1.0 / SHADOWMAP_SIZE);
54	float shadowBorderScale = 1.0;
55	
56	float Shadow_DoShadowCompareOffset(SHADOWMAP tex, vec4 projCoord, vec2 offset){
57	    vec4 coord = vec4(projCoord.xy + offset.xy * pixSize2 * shadowBorderScale, projCoord.zw);
58	    return SHADOWCOMPARE(tex, coord);
59	}
60	
61	float Shadow_DoShadowCompare(SHADOWMAP tex, vec4 projCoord){
62	    return SHADOWCOMPARE(tex, projCoord);
63	}
64	
65	float Shadow_BorderCheck(vec2 coord){
66	    // Fastest, "hack" method (uses 4-5 instructions)
67	    vec4 t = vec4(coord.xy, 0.0, 1.0);
68	    t = step(t.wwxy, t.xyzz);
69	    return dot(t,t);
70	}
71	
72	float Shadow_Nearest(SHADOWMAP tex, vec4 projCoord){
73	    float border = Shadow_BorderCheck(projCoord.xy);
74	    if (border &gt; 0.0){
75	        return 1.0;
76	    }
77	    return Shadow_DoShadowCompare(tex,projCoord);
78	}
79	
80	float Shadow_DoDither_2x2(SHADOWMAP tex, vec4 projCoord){
81	    float border = Shadow_BorderCheck(projCoord.xy);
82	    if (border &gt; 0.0)
83	        return 1.0;
84	  
85	
86	    float shadow = 0.0;
87	    vec2 o = mod(floor(gl_FragCoord.xy), 2.0);
88	    shadow += Shadow_DoShadowCompareOffset(tex,projCoord,vec2(-1.5,  1.5) + o);
89	    shadow += Shadow_DoShadowCompareOffset(tex,projCoord,vec2( 0.5,  1.5) + o);
90	    shadow += Shadow_DoShadowCompareOffset(tex,projCoord,vec2(-1.5, -0.5) + o);
91	    shadow += Shadow_DoShadowCompareOffset(tex,projCoord,vec2( 0.5, -0.5) + o);
92	    shadow *= 0.25 ;
93	    return shadow;
94	}
95	
96	float Shadow_DoBilinear_2x2(SHADOWMAP tex, vec4 projCoord){
97	    float border = Shadow_BorderCheck(projCoord.xy);
98	    if (border &gt; 0.0)
99	        return 1.0;
100	    vec4 gather = vec4(0.0);
101	    gather.x = Shadow_DoShadowCompareOffset(tex, projCoord, vec2(0.0, 0.0));
102	    gather.y = Shadow_DoShadowCompareOffset(tex, projCoord, vec2(1.0, 0.0));
103	    gather.z = Shadow_DoShadowCompareOffset(tex, projCoord, vec2(0.0, 1.0));
104	    gather.w = Shadow_DoShadowCompareOffset(tex, projCoord, vec2(1.0, 1.0));
105	
106	    vec2 f = fract( projCoord.xy * SHADOWMAP_SIZE );
107	    vec2 mx = mix( gather.xz, gather.yw, f.x );
108	    return mix( mx.x, mx.y, f.y );
109	}
110	
111	float Shadow_DoPCF(SHADOWMAP tex, vec4 projCoord){
112	    float shadow = 0.0;
113	    float border = Shadow_BorderCheck(projCoord.xy);
114	    if (border &gt; 0.0)
115	        return 1.0;
116	    float bound = KERNEL * 0.5 - 0.5;
117	    bound *= PCFEDGE;
118	    for (float y = -bound; y &lt;= bound; y += PCFEDGE){
119	        for (float x = -bound; x &lt;= bound; x += PCFEDGE){
120	            shadow += clamp(Shadow_DoShadowCompareOffset(tex,projCoord,vec2(x,y)) +
121	                            border,
122	                            0.0, 1.0);
123	        }
124	    }
125	
126	    shadow = shadow / (KERNEL * KERNEL);
127	    return shadow;
128	}
129	
130	
131	//12 tap poisson disk
132	    const vec2 poissonDisk0 =  vec2(-0.1711046, -0.425016);
133	    const vec2 poissonDisk1 =  vec2(-0.7829809, 0.2162201);
134	    const vec2 poissonDisk2 =  vec2(-0.2380269, -0.8835521);
135	    const vec2 poissonDisk3 =  vec2(0.4198045, 0.1687819);
136	    const vec2 poissonDisk4 =  vec2(-0.684418, -0.3186957);
137	    const vec2 poissonDisk5 =  vec2(0.6026866, -0.2587841);
138	    const vec2 poissonDisk6 =  vec2(-0.2412762, 0.3913516);
139	    const vec2 poissonDisk7 =  vec2(0.4720655, -0.7664126);
140	    const vec2 poissonDisk8 =  vec2(0.9571564, 0.2680693);
141	    const vec2 poissonDisk9 =  vec2(-0.5238616, 0.802707);
142	    const vec2 poissonDisk10 = vec2(0.5653144, 0.60262);
143	    const vec2 poissonDisk11 = vec2(0.0123658, 0.8627419);
144	
145	float Shadow_DoPCFPoisson(SHADOWMAP tex, vec4 projCoord){   
146	    float shadow = 0.0;
147	    float border = Shadow_BorderCheck(projCoord.xy);
148	    if (border &gt; 0.0)
149	        return 1.0;
150	
151	    vec2 texelSize = vec2( 4.0 * PCFEDGE * shadowBorderScale);        
152	    
153	     shadow += Shadow_DoShadowCompareOffset(tex, projCoord , poissonDisk0 * texelSize);
154	     shadow += Shadow_DoShadowCompareOffset(tex, projCoord , poissonDisk1 * texelSize);
155	     shadow += Shadow_DoShadowCompareOffset(tex, projCoord , poissonDisk2 * texelSize);
156	     shadow += Shadow_DoShadowCompareOffset(tex, projCoord , poissonDisk3 * texelSize);
157	     shadow += Shadow_DoShadowCompareOffset(tex, projCoord , poissonDisk4 * texelSize);
158	     shadow += Shadow_DoShadowCompareOffset(tex, projCoord , poissonDisk5 * texelSize);
159	     shadow += Shadow_DoShadowCompareOffset(tex, projCoord , poissonDisk6 * texelSize);
160	     shadow += Shadow_DoShadowCompareOffset(tex, projCoord , poissonDisk7 * texelSize);
161	     shadow += Shadow_DoShadowCompareOffset(tex, projCoord , poissonDisk8 * texelSize);
162	     shadow += Shadow_DoShadowCompareOffset(tex, projCoord , poissonDisk9 * texelSize);
163	     shadow += Shadow_DoShadowCompareOffset(tex, projCoord , poissonDisk10 * texelSize);
164	     shadow += Shadow_DoShadowCompareOffset(tex, projCoord , poissonDisk11 * texelSize);
165	
166	    shadow = shadow * 0.08333333333;//this is divided by 12
167	    return shadow;
168	}
169	
170	
171	#ifdef POINTLIGHT       
172	    float getPointLightShadows(vec4 worldPos,vec3 lightPos,
173	                           SHADOWMAP shadowMap0,SHADOWMAP shadowMap1,SHADOWMAP shadowMap2,SHADOWMAP shadowMap3,SHADOWMAP shadowMap4,SHADOWMAP shadowMap5,
174	                           vec4 projCoord0,vec4 projCoord1,vec4 projCoord2,vec4 projCoord3,vec4 projCoord4,vec4 projCoord5){
175	        float shadow = 1.0;
176	        vec3 vect = worldPos.xyz - lightPos;
177	        vec3 absv= abs(vect);
178	        float maxComp = max(absv.x,max(absv.y,absv.z));
179	        if(maxComp == absv.y){
180	           if(vect.y &lt; 0.0){
181	               shadow = GETSHADOW(shadowMap0, projCoord0 / projCoord0.w);
182	           }else{
183	               shadow = GETSHADOW(shadowMap1, projCoord1 / projCoord1.w);
184	           }
185	        }else if(maxComp == absv.z){
186	           if(vect.z &lt; 0.0){
187	               shadow = GETSHADOW(shadowMap2, projCoord2 / projCoord2.w);
188	           }else{
189	               shadow = GETSHADOW(shadowMap3, projCoord3 / projCoord3.w);
190	           }
191	        }else if(maxComp == absv.x){
192	           if(vect.x &lt; 0.0){
193	               shadow = GETSHADOW(shadowMap4, projCoord4 / projCoord4.w);
194	           }else{
195	               shadow = GETSHADOW(shadowMap5, projCoord5 / projCoord5.w);
196	           }
197	        }  
198	        return shadow;
199	    }
200	#else
201	 #ifdef PSSM
202	    float getDirectionalLightShadows(vec4 splits,float shadowPosition,
203	                                    SHADOWMAP shadowMap0,SHADOWMAP shadowMap1,SHADOWMAP shadowMap2,SHADOWMAP shadowMap3,
204	                                    vec4 projCoord0,vec4 projCoord1,vec4 projCoord2,vec4 projCoord3){    
205	        float shadow = 1.0;   
206	        if(shadowPosition &lt; splits.x){
207	            shadow = GETSHADOW(shadowMap0, projCoord0 );   
208	        }else if( shadowPosition &lt;  splits.y){
209	            shadowBorderScale = 0.5;
210	            shadow = GETSHADOW(shadowMap1, projCoord1);  
211	        }else if( shadowPosition &lt;  splits.z){
212	            shadowBorderScale = 0.25;
213	            shadow = GETSHADOW(shadowMap2, projCoord2); 
214	        }else if( shadowPosition &lt;  splits.w){
215	            shadowBorderScale = 0.125;
216	            shadow = GETSHADOW(shadowMap3, projCoord3); 
217	        }
218	        return shadow;
219	    }
220	 #else
221	    float getSpotLightShadows(SHADOWMAP shadowMap, vec4 projCoord){
222	        float shadow = 1.0;         
223	        projCoord /= projCoord.w;
224	        shadow = GETSHADOW(shadowMap, projCoord);
225	        
226	        //a small falloff to make the shadow blend nicely into the not lighten
227	        //we translate the texture coordinate value to a -1,1 range so the length 
228	        //of the texture coordinate vector is actually the radius of the lighten area on the ground
229	        projCoord = projCoord * 2.0 - 1.0;
230	        float fallOff = ( length(projCoord.xy) - 0.9 ) / 0.1;
231	        return mix(shadow,1.0,clamp(fallOff,0.0,1.0));
232	
233	    }
234	 #endif
235	#endif
236	
237	uniform sampler2D m_Texture;
238	uniform sampler2D m_DepthTexture;
239	uniform mat4 m_ViewProjectionMatrixInverse;
240	uniform vec4 m_ViewProjectionMatrixRow2;
241	
242	varying vec2 texCoord;
243	
244	
245	const mat4 biasMat = mat4(0.5, 0.0, 0.0, 0.0,
246	                          0.0, 0.5, 0.0, 0.0,
247	                          0.0, 0.0, 0.5, 0.0,
248	                          0.5, 0.5, 0.5, 1.0);
249	
250	uniform mat4 m_LightViewProjectionMatrix0;
251	uniform mat4 m_LightViewProjectionMatrix1;
252	uniform mat4 m_LightViewProjectionMatrix2;
253	uniform mat4 m_LightViewProjectionMatrix3;
254	
255	#ifdef POINTLIGHT
256	    uniform vec3 m_LightPos;
257	    uniform mat4 m_LightViewProjectionMatrix4;
258	    uniform mat4 m_LightViewProjectionMatrix5;
259	#else
260	    #ifndef PSSM    
261	        uniform vec3 m_LightPos;    
262	        uniform vec3 m_LightDir;       
263	    #endif
264	#endif
265	
266	#ifdef FADE
267	uniform vec2 m_FadeInfo;
268	#endif
269	
270	vec3 getPosition(in float depth, in vec2 uv){
271	    vec4 pos = vec4(uv, depth, 1.0) * 2.0 - 1.0;
272	    pos = m_ViewProjectionMatrixInverse * pos;
273	    return pos.xyz / pos.w;
274	}
275	
276	void main(){    
277	    #if !defined( RENDER_SHADOWS )
278	          gl_FragColor = texture2D(m_Texture,texCoord);
279	          return;
280	    #endif
281	    
282	    float depth = texture2D(m_DepthTexture,texCoord).r;
283	    vec4 color = texture2D(m_Texture,texCoord);
284	
285	    //Discard shadow computation on the sky
286	    if(depth == 1.0){
287	        gl_FragColor = color;
288	        return;
289	    }
290	
291	    // get the vertex in world space
292	    vec4 worldPos = vec4(getPosition(depth,texCoord),1.0);
293	   
294	     #if (!defined(POINTLIGHT) &amp;&amp; !defined(PSSM))
295	          vec3 lightDir = worldPos.xyz - m_LightPos;
296	          if( dot(m_LightDir,lightDir)&lt;0){
297	            gl_FragColor = color;
298	            return;
299	          }         
300	    #endif
301	
302	    // populate the light view matrices array and convert vertex to light viewProj space
303	    vec4 projCoord0 = biasMat * m_LightViewProjectionMatrix0 * worldPos;
304	    vec4 projCoord1 = biasMat * m_LightViewProjectionMatrix1 * worldPos;
305	    vec4 projCoord2 = biasMat * m_LightViewProjectionMatrix2 * worldPos;
306	    vec4 projCoord3 = biasMat * m_LightViewProjectionMatrix3 * worldPos;
307	    #ifdef POINTLIGHT
308	       vec4 projCoord4 = biasMat * m_LightViewProjectionMatrix4 * worldPos;
309	       vec4 projCoord5 = biasMat * m_LightViewProjectionMatrix5 * worldPos;
310	    #endif
311	
312	    float shadow = 1.0;
313	    
314	    #ifdef POINTLIGHT         
315	            shadow = getPointLightShadows(worldPos, m_LightPos,
316	                           m_ShadowMap0,m_ShadowMap1,m_ShadowMap2,m_ShadowMap3,m_ShadowMap4,m_ShadowMap5,
317	                           projCoord0, projCoord1, projCoord2, projCoord3, projCoord4, projCoord5);
318	    #else
319	       #ifdef PSSM
320	            float shadowPosition = m_ViewProjectionMatrixRow2.x * worldPos.x +  m_ViewProjectionMatrixRow2.y * worldPos.y +  m_ViewProjectionMatrixRow2.z * worldPos.z +  m_ViewProjectionMatrixRow2.w;
321	            shadow = getDirectionalLightShadows(m_Splits, shadowPosition,
322	                           m_ShadowMap0,m_ShadowMap1,m_ShadowMap2,m_ShadowMap3,
323	                           projCoord0, projCoord1, projCoord2, projCoord3);
324	       #else 
325	            //spotlight
326	            shadow = getSpotLightShadows(m_ShadowMap0,projCoord0);
327	       #endif
328	    #endif   
329	
330	    #ifdef FADE
331	      shadow = max(0.0,mix(shadow,1.0,(shadowPosition - m_FadeInfo.x) * m_FadeInfo.y));    
332	    #endif    
333	    shadow= shadow * m_ShadowIntensity + (1.0 - m_ShadowIntensity);
334	    gl_FragColor = color * vec4(shadow, shadow, shadow, 1.0);
335	
336	}


1 Like

hehe the good old 0 instead of 0.0…I thought we got rid of them all. I’ll fix this thanks.