DepthShadowmapReceiverFp.glsl
上传用户:xhbjoy
上传日期:2014-10-07
资源大小:38068k
文件大小:2k
源码类别:

游戏引擎

开发平台:

Visual C++

  1. uniform float inverseShadowmapSize;
  2. uniform float fixedDepthBias;
  3. uniform float gradientClamp;
  4. uniform float gradientScaleBias;
  5. uniform float shadowFuzzyWidth;
  6. uniform sampler2D shadowMap;
  7. void main()
  8. {
  9. vec4 shadowUV = gl_TexCoord[0];
  10. // point on shadowmap
  11. #if LINEAR_RANGE
  12. shadowUV.xy = shadowUV.xy / shadowUV.w;
  13. #else
  14. shadowUV = shadowUV / shadowUV.w;
  15. #endif
  16. float centerdepth = texture2D(shadowMap, shadowUV.xy).x;
  17.     
  18.     // gradient calculation
  19.    float pixeloffset = inverseShadowmapSize;
  20.     vec4 depths = vec4(
  21.      texture2D(shadowMap, shadowUV.xy + vec2(-pixeloffset, 0)).x,
  22.      texture2D(shadowMap, shadowUV.xy + vec2(+pixeloffset, 0)).x,
  23.      texture2D(shadowMap, shadowUV.xy + vec2(0, -pixeloffset)).x,
  24.      texture2D(shadowMap, shadowUV.xy + vec2(0, +pixeloffset)).x);
  25. vec2 differences = abs( depths.yw - depths.xz );
  26. float gradient = min(gradientClamp, max(differences.x, differences.y));
  27. float gradientFactor = gradient * gradientScaleBias;
  28. // visibility function
  29. float depthAdjust = gradientFactor + (fixedDepthBias * centerdepth);
  30. float finalCenterDepth = centerdepth + depthAdjust;
  31. // shadowUV.z contains lightspace position of current object
  32. #if FUZZY_TEST
  33. // fuzzy test - introduces some ghosting in result and doesn't appear to be needed?
  34. //float visibility = saturate(1 + delta_z / (gradient * shadowFuzzyWidth));
  35. float visibility = saturate(1 + (finalCenterDepth - shadowUV.z) * shadowFuzzyWidth * shadowUV.w);
  36. gl_FragColor = vertexColour * visibility;
  37. #else
  38. // hard test
  39. #if PCF
  40. // use depths from prev, calculate diff
  41. depths += depthAdjust;
  42. float final = (finalCenterDepth > shadowUV.z) ? 1.0 : 0.0;
  43. final += (depths.x > shadowUV.z) ? 1.0 : 0.0;
  44. final += (depths.y > shadowUV.z) ? 1.0 : 0.0;
  45. final += (depths.z > shadowUV.z) ? 1.0 : 0.0;
  46. final += (depths.w > shadowUV.z) ? 1.0 : 0.0;
  47. final *= 0.2;
  48. gl_FragColor = vec4(gl_Color.xyz * final, 1);
  49. #else
  50. gl_FragColor = (finalCenterDepth > shadowUV.z) ? gl_Color : vec4(0,0,0,1);
  51. #endif
  52. #endif
  53.    
  54. }