1[vertex] 2 3#ifdef USE_GLES_OVER_GL 4#define mediump 5#define highp 6#else 7precision mediump float; 8precision mediump int; 9#endif 10 11uniform highp mat4 projection_matrix; 12uniform highp mat4 modelview_matrix; 13uniform highp mat4 extra_matrix; 14attribute highp vec3 vertex; // attrib:0 15attribute vec4 color_attrib; // attrib:3 16attribute highp vec2 uv_attrib; // attrib:4 17 18varying vec2 uv_interp; 19varying vec4 color_interp; 20 21#if defined(USE_TIME) 22uniform float time; 23#endif 24 25 26#ifdef USE_LIGHTING 27 28uniform highp mat4 light_matrix; 29uniform highp mat4 light_local_matrix; 30uniform vec2 light_pos; 31varying vec4 light_uv_interp; 32 33#if defined(NORMAL_USED) 34varying vec4 local_rot; 35uniform vec2 normal_flip; 36#endif 37 38#ifdef USE_SHADOWS 39varying highp vec2 pos; 40#endif 41 42#define at_light_pass 1 43#else 44#define at_light_pass 0 45#endif 46 47#if defined(ENABLE_VAR1_INTERP) 48varying vec4 var1_interp; 49#endif 50 51#if defined(ENABLE_VAR2_INTERP) 52varying vec4 var2_interp; 53#endif 54 55//uniform bool snap_pixels; 56 57VERTEX_SHADER_GLOBALS 58 59void main() { 60 61 color_interp = color_attrib; 62 uv_interp = uv_attrib; 63 highp vec4 outvec = vec4(vertex, 1.0); 64{ 65 vec2 src_vtx=outvec.xy; 66VERTEX_SHADER_CODE 67 68} 69#if !defined(USE_WORLD_VEC) 70 outvec = extra_matrix * outvec; 71 outvec = modelview_matrix * outvec; 72#endif 73 74 75 76#ifdef USE_PIXEL_SNAP 77 78 outvec.xy=floor(outvec.xy+0.5); 79#endif 80 81 82 gl_Position = projection_matrix * outvec; 83 84#ifdef USE_LIGHTING 85 86 light_uv_interp.xy = (light_matrix * outvec).xy; 87 light_uv_interp.zw =(light_local_matrix * outvec).xy; 88#ifdef USE_SHADOWS 89 pos=outvec.xy; 90#endif 91 92#if defined(NORMAL_USED) 93 local_rot.xy=normalize( (modelview_matrix * ( extra_matrix * vec4(1.0,0.0,0.0,0.0) )).xy )*normal_flip.x; 94 local_rot.zw=normalize( (modelview_matrix * ( extra_matrix * vec4(0.0,1.0,0.0,0.0) )).xy )*normal_flip.y; 95#endif 96 97#endif 98 99} 100 101[fragment] 102 103#ifdef USE_GLES_OVER_GL 104#define mediump 105#define highp 106#else 107precision mediump float; 108precision mediump int; 109#endif 110 111 // texunit:0 112uniform sampler2D texture; 113 114varying vec2 uv_interp; 115varying vec4 color_interp; 116 117#ifdef MOMO 118 119#endif 120 121#if defined(ENABLE_SCREEN_UV) 122 123uniform vec2 screen_uv_mult; 124 125#endif 126 127#if defined(ENABLE_TEXSCREEN) 128 129uniform vec2 texscreen_screen_mult; 130uniform vec4 texscreen_screen_clamp; 131uniform sampler2D texscreen_tex; 132 133#endif 134 135 136#if defined(ENABLE_VAR1_INTERP) 137varying vec4 var1_interp; 138#endif 139 140#if defined(ENABLE_VAR2_INTERP) 141varying vec4 var2_interp; 142#endif 143 144#if defined(USE_TIME) 145uniform float time; 146#endif 147 148#ifdef USE_MODULATE 149 150uniform vec4 modulate; 151 152#endif 153 154#ifdef USE_LIGHTING 155 156uniform sampler2D light_texture; 157uniform vec4 light_color; 158uniform vec4 light_shadow_color; 159uniform float light_height; 160varying vec4 light_uv_interp; 161uniform float light_outside_alpha; 162 163#if defined(NORMAL_USED) 164varying vec4 local_rot; 165#endif 166 167#ifdef USE_SHADOWS 168 169uniform highp sampler2D shadow_texture; 170uniform float shadow_attenuation; 171 172uniform highp mat4 shadow_matrix; 173varying highp vec2 pos; 174uniform float shadowpixel_size; 175 176#ifdef SHADOW_ESM 177uniform float shadow_esm_multiplier; 178#endif 179 180#endif 181 182#define at_light_pass 1 183#else 184#define at_light_pass 0 185#endif 186 187#if defined(USE_TEXPIXEL_SIZE) 188uniform vec2 texpixel_size; 189#endif 190 191 192FRAGMENT_SHADER_GLOBALS 193 194 195void main() { 196 197 vec4 color = color_interp; 198#if defined(NORMAL_USED) 199 vec3 normal = vec3(0.0,0.0,1.0); 200#endif 201 202#ifdef USE_DISTANCE_FIELD 203 const float smoothing = 1.0/32.0; 204 float distance = texture2D(texture, uv_interp).a; 205 color.a = smoothstep(0.5 - smoothing, 0.5 + smoothing, distance) * color.a; 206#else 207 color *= texture2D( texture, uv_interp ); 208 209#endif 210 211 212#if defined(ENABLE_SCREEN_UV) 213 vec2 screen_uv = gl_FragCoord.xy*screen_uv_mult; 214#endif 215 216 217{ 218#if defined(USE_NORMALMAP) 219 vec3 normal_map=vec3(0.0,0.0,1.0); 220 float normal_depth=1.0; 221#endif 222 223FRAGMENT_SHADER_CODE 224 225#if defined(USE_NORMALMAP) 226 normal = mix(vec3(0.0,0.0,1.0), normal_map * vec3(2.0,-2.0,1.0) - vec3( 1.0, -1.0, 0.0 ), normal_depth ); 227#endif 228 229} 230#ifdef DEBUG_ENCODED_32 231 highp float enc32 = dot( color,highp vec4(1.0 / (256.0 * 256.0 * 256.0),1.0 / (256.0 * 256.0),1.0 / 256.0,1) ); 232 color = vec4(vec3(enc32),1.0); 233#endif 234 235#ifdef USE_MODULATE 236 237 color*=modulate; 238#endif 239 240 241#ifdef USE_LIGHTING 242 243 vec2 light_vec = light_uv_interp.zw;; //for shadow and normal mapping 244 245#if defined(NORMAL_USED) 246 normal.xy = mat2(local_rot.xy,local_rot.zw) * normal.xy; 247#endif 248 249 float att=1.0; 250 251 vec2 light_uv = light_uv_interp.xy; 252 vec4 light = texture2D(light_texture,light_uv) * light_color; 253#if defined(USE_OUTPUT_SHADOW_COLOR) 254 vec4 shadow_color=vec4(0.0,0.0,0.0,0.0); 255#endif 256 257 if (any(lessThan(light_uv_interp.xy,vec2(0.0,0.0))) || any(greaterThanEqual(light_uv_interp.xy,vec2(1.0,1.0)))) { 258 color.a*=light_outside_alpha; //invisible 259 260 } else { 261 262#if defined(USE_LIGHT_SHADER_CODE) 263//light is written by the light shader 264 { 265 vec4 light_out=light*color; 266LIGHT_SHADER_CODE 267 color=light_out; 268 } 269 270#else 271 272#if defined(NORMAL_USED) 273 vec3 light_normal = normalize(vec3(light_vec,-light_height)); 274 light*=max(dot(-light_normal,normal),0.0); 275#endif 276 277 color*=light; 278/* 279#ifdef USE_NORMAL 280 color.xy=local_rot.xy;//normal.xy; 281 color.zw=vec2(0.0,1.0); 282#endif 283*/ 284 285//light shader code 286#endif 287 288 289#ifdef USE_SHADOWS 290 291 float angle_to_light = -atan(light_vec.x,light_vec.y); 292 float PI = 3.14159265358979323846264; 293 /*int i = int(mod(floor((angle_to_light+7.0*PI/6.0)/(4.0*PI/6.0))+1.0, 3.0)); // +1 pq os indices estao em ordem 2,0,1 nos arrays 294 float ang*/ 295 296 float su,sz; 297 298 float abs_angle = abs(angle_to_light); 299 vec2 point; 300 float sh; 301 if (abs_angle<45.0*PI/180.0) { 302 point = light_vec; 303 sh=0.0+(1.0/8.0); 304 } else if (abs_angle>135.0*PI/180.0) { 305 point = -light_vec; 306 sh = 0.5+(1.0/8.0); 307 } else if (angle_to_light>0.0) { 308 309 point = vec2(light_vec.y,-light_vec.x); 310 sh = 0.25+(1.0/8.0); 311 } else { 312 313 point = vec2(-light_vec.y,light_vec.x); 314 sh = 0.75+(1.0/8.0); 315 316 } 317 318 319 highp vec4 s = shadow_matrix * vec4(point,0.0,1.0); 320 s.xyz/=s.w; 321 su=s.x*0.5+0.5; 322 sz=s.z*0.5+0.5; 323 324 highp float shadow_attenuation=0.0; 325 326#ifdef USE_DEPTH_SHADOWS 327 328#define SHADOW_DEPTH(m_tex,m_uv) (texture2D((m_tex),(m_uv)).z) 329 330#else 331 332//#define SHADOW_DEPTH(m_tex,m_uv) dot(texture2D((m_tex),(m_uv)),highp vec4(1.0 / (256.0 * 256.0 * 256.0),1.0 / (256.0 * 256.0),1.0 / 256.0,1) ) 333#define SHADOW_DEPTH(m_tex,m_uv) dot(texture2D((m_tex),(m_uv)),vec4(1.0 / (256.0 * 256.0 * 256.0),1.0 / (256.0 * 256.0),1.0 / 256.0,1) ) 334 335#endif 336 337 338 339#ifdef SHADOW_PCF5 340 341 shadow_attenuation += SHADOW_DEPTH(shadow_texture,vec2(su,sh))<sz?0.0:1.0; 342 shadow_attenuation += SHADOW_DEPTH(shadow_texture,vec2(su+shadowpixel_size,sh))<sz?0.0:1.0; 343 shadow_attenuation += SHADOW_DEPTH(shadow_texture,vec2(su+shadowpixel_size*2.0,sh))<sz?0.0:1.0; 344 shadow_attenuation += SHADOW_DEPTH(shadow_texture,vec2(su-shadowpixel_size,sh))<sz?0.0:1.0; 345 shadow_attenuation += SHADOW_DEPTH(shadow_texture,vec2(su-shadowpixel_size*2.0,sh))<sz?0.0:1.0; 346 shadow_attenuation/=5.0; 347 348#endif 349 350#ifdef SHADOW_PCF13 351 352 shadow_attenuation += SHADOW_DEPTH(shadow_texture,vec2(su,sh))<sz?0.0:1.0; 353 shadow_attenuation += SHADOW_DEPTH(shadow_texture,vec2(su+shadowpixel_size,sh))<sz?0.0:1.0; 354 shadow_attenuation += SHADOW_DEPTH(shadow_texture,vec2(su+shadowpixel_size*2.0,sh))<sz?0.0:1.0; 355 shadow_attenuation += SHADOW_DEPTH(shadow_texture,vec2(su+shadowpixel_size*3.0,sh))<sz?0.0:1.0; 356 shadow_attenuation += SHADOW_DEPTH(shadow_texture,vec2(su+shadowpixel_size*4.0,sh))<sz?0.0:1.0; 357 shadow_attenuation += SHADOW_DEPTH(shadow_texture,vec2(su+shadowpixel_size*5.0,sh))<sz?0.0:1.0; 358 shadow_attenuation += SHADOW_DEPTH(shadow_texture,vec2(su+shadowpixel_size*6.0,sh))<sz?0.0:1.0; 359 shadow_attenuation += SHADOW_DEPTH(shadow_texture,vec2(su-shadowpixel_size*2.0,sh))<sz?0.0:1.0; 360 shadow_attenuation += SHADOW_DEPTH(shadow_texture,vec2(su-shadowpixel_size*3.0,sh))<sz?0.0:1.0; 361 shadow_attenuation += SHADOW_DEPTH(shadow_texture,vec2(su-shadowpixel_size*4.0,sh))<sz?0.0:1.0; 362 shadow_attenuation += SHADOW_DEPTH(shadow_texture,vec2(su-shadowpixel_size*5.0,sh))<sz?0.0:1.0; 363 shadow_attenuation += SHADOW_DEPTH(shadow_texture,vec2(su-shadowpixel_size*6.0,sh))<sz?0.0:1.0; 364 shadow_attenuation/=13.0; 365 366#endif 367 368#ifdef SHADOW_ESM 369 370 371 { 372 float unnormalized = su/shadowpixel_size; 373 float fractional = fract(unnormalized); 374 unnormalized = floor(unnormalized); 375 float zc = SHADOW_DEPTH(shadow_texture,vec2((unnormalized-0.5)*shadowpixel_size,sh)); 376 float zn = SHADOW_DEPTH(shadow_texture,vec2((unnormalized+0.5)*shadowpixel_size,sh)); 377 float z = mix(zc,zn,fractional); 378 shadow_attenuation=clamp(exp(shadow_esm_multiplier* ( z - sz )),0.0,1.0); 379 } 380 381#endif 382 383#if !defined(SHADOW_PCF5) && !defined(SHADOW_PCF13) && !defined(SHADOW_ESM) 384 385 shadow_attenuation = SHADOW_DEPTH(shadow_texture,vec2(su+shadowpixel_size,sh))<sz?0.0:1.0; 386 387#endif 388 389#if defined(USE_OUTPUT_SHADOW_COLOR) 390 color=mix(shadow_color,color,shadow_attenuation); 391#else 392 //color*=shadow_attenuation; 393 color=mix(light_shadow_color,color,shadow_attenuation); 394#endif 395//use shadows 396#endif 397 } 398 399//use lighting 400#endif 401// color.rgb*=color.a; 402 gl_FragColor = color; 403 404} 405 406