Advertisement
entrusc

shadowmap.glsllib

Mar 25th, 2015
27
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /**
  2.  * Library for shadow map lookup
  3.  */
  4. vec4 getLightMapValueAt(
  5.     in vec3 blockPosition,
  6.     in sampler3D lightMap0,
  7.     in sampler3D lightMap1,
  8.     in sampler3D lightMap2,
  9.     in sampler3D lightMap3,
  10.     in sampler3D lightMap4,
  11.     in sampler3D lightMap5,
  12.     in sampler3D lightMap6,
  13.     in sampler3D lightMap7,
  14.     in sampler3D lightMap8
  15. ) {
  16.     ivec3 shadowMapPosition = ivec3(modulo(blockPosition.x, 32.0), blockPosition.y, modulo(blockPosition.z, 32.0));
  17.  
  18.     if (blockPosition.x < 0.0) {
  19.         if (blockPosition.z < 0.0) {
  20.             return texelFetch(lightMap0, shadowMapPosition, 0);
  21.         } else
  22.         if (blockPosition.z < 32.0) {
  23.             return texelFetch(lightMap3, shadowMapPosition, 0);
  24.         } else {
  25.             return texelFetch(lightMap6, shadowMapPosition, 0);
  26.         }
  27.     } else
  28.     if (blockPosition.x < 32.0) {
  29.         if (blockPosition.z < 0.0) {
  30.             return texelFetch(lightMap1, shadowMapPosition, 0);
  31.         } else
  32.         if (blockPosition.z < 32.0) {
  33.             return texelFetch(lightMap4, shadowMapPosition, 0);
  34.         } else {
  35.             return texelFetch(lightMap7, shadowMapPosition, 0);
  36.         }
  37.     } else {
  38.         if (blockPosition.z < 0.0) {
  39.             return texelFetch(lightMap2, shadowMapPosition, 0);
  40.         } else
  41.         if (blockPosition.z < 32.0) {
  42.             return texelFetch(lightMap5, shadowMapPosition, 0);
  43.         } else {
  44.             return texelFetch(lightMap8, shadowMapPosition, 0);
  45.         }
  46.     }
  47. }
  48.  
  49. vec4 getLightMapValueAtBlockPosition(
  50.     in vec3 position,
  51.     in sampler3D lightMap0,
  52.     in sampler3D lightMap1,
  53.     in sampler3D lightMap2,
  54.     in sampler3D lightMap3,
  55.     in sampler3D lightMap4,
  56.     in sampler3D lightMap5,
  57.     in sampler3D lightMap6,
  58.     in sampler3D lightMap7,
  59.     in sampler3D lightMap8
  60. ) {
  61.     vec3 blockPosition = vec3(floor(position.x), floor(position.y), floor(position.z));
  62.     vec3 blockCenterPosition = blockPosition + vec3(0.5, 0.5, 0.5);
  63.  
  64.     return getLightMapValueAt(blockCenterPosition, lightMap0, lightMap1, lightMap2, lightMap3, lightMap4, lightMap5, lightMap6, lightMap7, lightMap8);
  65. }
  66.  
  67. /**
  68.  * returns the mix of the 4 closest lights (over shadow map borders!)
  69.  */
  70. vec4 getCubedMixedLightMapValueAt(
  71.     in vec3 position,
  72.     in sampler3D lightMap0,
  73.     in sampler3D lightMap1,
  74.     in sampler3D lightMap2,
  75.     in sampler3D lightMap3,
  76.     in sampler3D lightMap4,
  77.     in sampler3D lightMap5,
  78.     in sampler3D lightMap6,
  79.     in sampler3D lightMap7,
  80.     in sampler3D lightMap8
  81. ) {
  82.  
  83.     vec3 cubePosition = vec3(floor(position.x), floor(position.y), floor(position.z));
  84.     vec3 cubeCenterPosition = cubePosition + vec3(0.5, 0.5, 0.5);
  85.  
  86.     vec3 normalVector = position - cubeCenterPosition;
  87.  
  88.     vec3 directionX = vec3(sign(normalVector.x), 0, 0);
  89.     vec3 directionY = vec3(0, sign(normalVector.y), 0);
  90.     vec3 directionZ = vec3(0, 0, sign(normalVector.z));
  91.  
  92.     vec4 tmp0 = getLightMapValueAtBlockPosition(cubeCenterPosition, lightMap0, lightMap1, lightMap2, lightMap3, lightMap4, lightMap5, lightMap6, lightMap7, lightMap8);
  93.     vec4 tmp1 = getLightMapValueAtBlockPosition(cubeCenterPosition + directionX, lightMap0, lightMap1, lightMap2, lightMap3, lightMap4, lightMap5, lightMap6, lightMap7, lightMap8);
  94.     vec4 tmp2 = getLightMapValueAtBlockPosition(cubeCenterPosition + directionY, lightMap0, lightMap1, lightMap2, lightMap3, lightMap4, lightMap5, lightMap6, lightMap7, lightMap8);
  95.     vec4 tmp3 = getLightMapValueAtBlockPosition(cubeCenterPosition + directionX + directionY, lightMap0, lightMap1, lightMap2, lightMap3, lightMap4, lightMap5, lightMap6, lightMap7, lightMap8);
  96.  
  97.     float xPos = abs(position.x - cubeCenterPosition.x);
  98.     float yPos = abs(position.y - cubeCenterPosition.y);
  99.  
  100.     vec4 tmpShadow1 = mix(tmp0, tmp1, xPos);
  101.     vec4 tmpShadow2 = mix(tmp2, tmp3, xPos);
  102.     vec4 tmpShadowZ0 = mix(tmpShadow1, tmpShadow2, yPos);
  103.  
  104.     vec4 tmp4 = getLightMapValueAtBlockPosition(cubeCenterPosition + directionZ, lightMap0, lightMap1, lightMap2, lightMap3, lightMap4, lightMap5, lightMap6, lightMap7, lightMap8);
  105.     vec4 tmp5 = getLightMapValueAtBlockPosition(cubeCenterPosition + directionX + directionZ, lightMap0, lightMap1, lightMap2, lightMap3, lightMap4, lightMap5, lightMap6, lightMap7, lightMap8);
  106.     vec4 tmp6 = getLightMapValueAtBlockPosition(cubeCenterPosition + directionY + directionZ, lightMap0, lightMap1, lightMap2, lightMap3, lightMap4, lightMap5, lightMap6, lightMap7, lightMap8);
  107.     vec4 tmp7 = getLightMapValueAtBlockPosition(cubeCenterPosition + directionX + directionY + directionZ, lightMap0, lightMap1, lightMap2, lightMap3, lightMap4, lightMap5, lightMap6, lightMap7, lightMap8);
  108.  
  109.     vec4 tmpShadow3 = mix(tmp4, tmp5, xPos);
  110.     vec4 tmpShadow4 = mix(tmp6, tmp7, xPos);
  111.     vec4 tmpShadowZ1 = mix(tmpShadow3, tmpShadow4, yPos);
  112.  
  113.     float zPos = abs(position.z - cubeCenterPosition.z);
  114.     return mix(tmpShadowZ0, tmpShadowZ1, zPos);
  115. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement