DepthShadowmapNormalMapReceiverFp.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 vec4 lightColour;
  7. uniform sampler2D shadowMap;
  8. uniform sampler2D normalMap;
  9. varying vec3 tangentLightDir;
  10. // Expand a range-compressed vector
  11. vec3 expand(vec3 v)
  12. {
  13. return (v - 0.5) * 2.0;
  14. }
  15. void main()
  16. {
  17. // get the new normal and diffuse values
  18. vec3 normal = normalize(expand(texture2D(normalMap, gl_TexCoord[1].xy).xyz));
  19. vec4 vertexColour = clamp(dot(normal, tangentLightDir),0.0,1.0) * lightColour;
  20. vec4 shadowUV = gl_TexCoord[0];
  21. // point on shadowmap
  22. #if LINEAR_RANGE
  23. shadowUV.xy = shadowUV.xy / shadowUV.w;
  24. #else
  25. shadowUV = shadowUV / shadowUV.w;
  26. #endif
  27. float centerdepth = texture2D(shadowMap, shadowUV.xy).x;
  28.     
  29.     // gradient calculation
  30.    float pixeloffset = inverseShadowmapSize;
  31.     vec4 depths = vec4(
  32.      texture2D(shadowMap, shadowUV.xy + vec2(-pixeloffset, 0)).x,
  33.      texture2D(shadowMap, shadowUV.xy + vec2(+pixeloffset, 0)).x,
  34.      texture2D(shadowMap, shadowUV.xy + vec2(0, -pixeloffset)).x,
  35.      texture2D(shadowMap, shadowUV.xy + vec2(0, +pixeloffset)).x);
  36. vec2 differences = abs( depths.yw - depths.xz );
  37. float gradient = min(gradientClamp, max(differences.x, differences.y));
  38. float gradientFactor = gradient * gradientScaleBias;
  39. // visibility function
  40. float depthAdjust = gradientFactor + (fixedDepthBias * centerdepth);
  41. float finalCenterDepth = centerdepth + depthAdjust;
  42. // shadowUV.z contains lightspace position of current object
  43. #if FUZZY_TEST
  44. // fuzzy test - introduces some ghosting in result and doesn't appear to be needed?
  45. //float visibility = saturate(1 + delta_z / (gradient * shadowFuzzyWidth));
  46. float visibility = saturate(1 + (finalCenterDepth - shadowUV.z) * shadowFuzzyWidth * shadowUV.w);
  47. gl_FragColor = vertexColour * visibility;
  48. #else
  49. // hard test
  50. #if PCF
  51. // use depths from prev, calculate diff
  52. depths += depthAdjust;
  53. float final = (finalCenterDepth > shadowUV.z) ? 1.0 : 0.0;
  54. final += (depths.x > shadowUV.z) ? 1.0 : 0.0;
  55. final += (depths.y > shadowUV.z) ? 1.0 : 0.0;
  56. final += (depths.z > shadowUV.z) ? 1.0 : 0.0;
  57. final += (depths.w > shadowUV.z) ? 1.0 : 0.0;
  58. final *= 0.2;
  59. gl_FragColor = vec4(vertexColour.xyz * final, 1);
  60. #else
  61. gl_FragColor = (finalCenterDepth > shadowUV.z) ? vertexColour : vec4(0,0,0,1);
  62. #endif
  63. #endif
  64.    
  65. }