Advertisement
StealthGlobal

pcss.frag

Aug 3rd, 2018
228
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. //----------------------------------------------------------------------------------
  2. // File:        es3aep-kepler\SoftShadows\assets\shaders/pcss.frag
  3. // SDK Version: v2.11
  4. // Email:       gameworks@nvidia.com
  5. // Site:        http://developer.nvidia.com/
  6. //
  7. // Copyright (c) 2014-2015, NVIDIA CORPORATION. All rights reserved.
  8. //
  9. // Redistribution and use in source and binary forms, with or without
  10. // modification, are permitted provided that the following conditions
  11. // are met:
  12. //  * Redistributions of source code must retain the above copyright
  13. //    notice, this list of conditions and the following disclaimer.
  14. //  * Redistributions in binary form must reproduce the above copyright
  15. //    notice, this list of conditions and the following disclaimer in the
  16. //    documentation and/or other materials provided with the distribution.
  17. //  * Neither the name of NVIDIA CORPORATION nor the names of its
  18. //    contributors may be used to endorse or promote products derived
  19. //    from this software without specific prior written permission.
  20. //
  21. // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS ``AS IS'' AND ANY
  22. // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  23. // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  24. // PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
  25. // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
  26. // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
  27. // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
  28. // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
  29. // OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  30. // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
  31. // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  32. //
  33. //----------------------------------------------------------------------------------
  34.  
  35. uniform mat4 g_lightView;
  36. uniform vec3 g_lightPos;
  37. uniform sampler2D g_rockDiffuse;
  38. uniform sampler2D g_groundDiffuse;
  39. uniform sampler2D g_groundNormal;
  40. uniform mediump sampler2D g_shadowMapDepth;
  41. uniform mediump sampler2DShadow g_shadowMapPcf;
  42. uniform bool g_useDiffuse;
  43. uniform int g_useTexture;
  44. uniform vec3 g_podiumCenterWorld;
  45. uniform int g_shadowTechnique; // 0 = none, 1 = pcss, 2 = pcf
  46. uniform int g_samplePattern;
  47. uniform vec2 g_lightRadiusUV;
  48. uniform float g_lightZNear;
  49. uniform float g_lightZFar;
  50.  
  51. in vec4 worldPosition;
  52. in vec4 lightPosition;
  53. in vec3 normal;
  54.  
  55. out vec4 fragColor;
  56.  
  57. #define POISSON_25_25   0
  58. #define POISSON_32_64   1
  59. #define POISSON_100_100 2
  60. #define POISSON_64_128  3
  61. #define REGULAR_49_225  4
  62.  
  63. const vec2 Poisson25[25] = vec2[](
  64.     vec2(-0.978698, -0.0884121),
  65.     vec2(-0.841121, 0.521165),
  66.     vec2(-0.71746, -0.50322),
  67.     vec2(-0.702933, 0.903134),
  68.     vec2(-0.663198, 0.15482),
  69.     vec2(-0.495102, -0.232887),
  70.     vec2(-0.364238, -0.961791),
  71.     vec2(-0.345866, -0.564379),
  72.     vec2(-0.325663, 0.64037),
  73.     vec2(-0.182714, 0.321329),
  74.     vec2(-0.142613, -0.0227363),
  75.     vec2(-0.0564287, -0.36729),
  76.     vec2(-0.0185858, 0.918882),
  77.     vec2(0.0381787, -0.728996),
  78.     vec2(0.16599, 0.093112),
  79.     vec2(0.253639, 0.719535),
  80.     vec2(0.369549, -0.655019),
  81.     vec2(0.423627, 0.429975),
  82.     vec2(0.530747, -0.364971),
  83.     vec2(0.566027, -0.940489),
  84.     vec2(0.639332, 0.0284127),
  85.     vec2(0.652089, 0.669668),
  86.     vec2(0.773797, 0.345012),
  87.     vec2(0.968871, 0.840449),
  88.     vec2(0.991882, -0.657338)
  89. );
  90.  
  91. const vec2 Poisson32[32] = vec2[](
  92.     vec2(-0.975402, -0.0711386),
  93.     vec2(-0.920347, -0.41142),
  94.     vec2(-0.883908, 0.217872),
  95.     vec2(-0.884518, 0.568041),
  96.     vec2(-0.811945, 0.90521),
  97.     vec2(-0.792474, -0.779962),
  98.     vec2(-0.614856, 0.386578),
  99.     vec2(-0.580859, -0.208777),
  100.     vec2(-0.53795, 0.716666),
  101.     vec2(-0.515427, 0.0899991),
  102.     vec2(-0.454634, -0.707938),
  103.     vec2(-0.420942, 0.991272),
  104.     vec2(-0.261147, 0.588488),
  105.     vec2(-0.211219, 0.114841),
  106.     vec2(-0.146336, -0.259194),
  107.     vec2(-0.139439, -0.888668),
  108.     vec2(0.0116886, 0.326395),
  109.     vec2(0.0380566, 0.625477),
  110.     vec2(0.0625935, -0.50853),
  111.     vec2(0.125584, 0.0469069),
  112.     vec2(0.169469, -0.997253),
  113.     vec2(0.320597, 0.291055),
  114.     vec2(0.359172, -0.633717),
  115.     vec2(0.435713, -0.250832),
  116.     vec2(0.507797, -0.916562),
  117.     vec2(0.545763, 0.730216),
  118.     vec2(0.56859, 0.11655),
  119.     vec2(0.743156, -0.505173),
  120.     vec2(0.736442, -0.189734),
  121.     vec2(0.843562, 0.357036),
  122.     vec2(0.865413, 0.763726),
  123.     vec2(0.872005, -0.927)
  124. );
  125.  
  126. const vec2 Poisson64[64] = vec2[](
  127.     vec2(-0.934812, 0.366741),
  128.     vec2(-0.918943, -0.0941496),
  129.     vec2(-0.873226, 0.62389),
  130.     vec2(-0.8352, 0.937803),
  131.     vec2(-0.822138, -0.281655),
  132.     vec2(-0.812983, 0.10416),
  133.     vec2(-0.786126, -0.767632),
  134.     vec2(-0.739494, -0.535813),
  135.     vec2(-0.681692, 0.284707),
  136.     vec2(-0.61742, -0.234535),
  137.     vec2(-0.601184, 0.562426),
  138.     vec2(-0.607105, 0.847591),
  139.     vec2(-0.581835, -0.00485244),
  140.     vec2(-0.554247, -0.771111),
  141.     vec2(-0.483383, -0.976928),
  142.     vec2(-0.476669, -0.395672),
  143.     vec2(-0.439802, 0.362407),
  144.     vec2(-0.409772, -0.175695),
  145.     vec2(-0.367534, 0.102451),
  146.     vec2(-0.35313, 0.58153),
  147.     vec2(-0.341594, -0.737541),
  148.     vec2(-0.275979, 0.981567),
  149.     vec2(-0.230811, 0.305094),
  150.     vec2(-0.221656, 0.751152),
  151.     vec2(-0.214393, -0.0592364),
  152.     vec2(-0.204932, -0.483566),
  153.     vec2(-0.183569, -0.266274),
  154.     vec2(-0.123936, -0.754448),
  155.     vec2(-0.0859096, 0.118625),
  156.     vec2(-0.0610675, 0.460555),
  157.     vec2(-0.0234687, -0.962523),
  158.     vec2(-0.00485244, -0.373394),
  159.     vec2(0.0213324, 0.760247),
  160.     vec2(0.0359813, -0.0834071),
  161.     vec2(0.0877407, -0.730766),
  162.     vec2(0.14597, 0.281045),
  163.     vec2(0.18186, -0.529649),
  164.     vec2(0.188208, -0.289529),
  165.     vec2(0.212928, 0.063509),
  166.     vec2(0.23661, 0.566027),
  167.     vec2(0.266579, 0.867061),
  168.     vec2(0.320597, -0.883358),
  169.     vec2(0.353557, 0.322733),
  170.     vec2(0.404157, -0.651479),
  171.     vec2(0.410443, -0.413068),
  172.     vec2(0.413556, 0.123325),
  173.     vec2(0.46556, -0.176183),
  174.     vec2(0.49266, 0.55388),
  175.     vec2(0.506333, 0.876888),
  176.     vec2(0.535875, -0.885556),
  177.     vec2(0.615894, 0.0703452),
  178.     vec2(0.637135, -0.637623),
  179.     vec2(0.677236, -0.174291),
  180.     vec2(0.67626, 0.7116),
  181.     vec2(0.686331, -0.389935),
  182.     vec2(0.691031, 0.330729),
  183.     vec2(0.715629, 0.999939),
  184.     vec2(0.8493, -0.0485549),
  185.     vec2(0.863582, -0.85229),
  186.     vec2(0.890622, 0.850581),
  187.     vec2(0.898068, 0.633778),
  188.     vec2(0.92053, -0.355693),
  189.     vec2(0.933348, -0.62981),
  190.     vec2(0.95294, 0.156896)
  191. );
  192.  
  193. const vec2 Poisson100[100] = vec2[](
  194.     vec2(-0.9891574, -0.1059512),
  195.     vec2(-0.9822294, 0.05140843),
  196.     vec2(-0.961332, 0.2562195),
  197.     vec2(-0.9149657, -0.2404464),
  198.     vec2(-0.8896608, -0.4183828),
  199.     vec2(-0.8398135, 0.3748641),
  200.     vec2(-0.8149028, 0.1989844),
  201.     vec2(-0.8046502, 0.5212684),
  202.     vec2(-0.7970151, -0.5834194),
  203.     vec2(-0.7484995, -0.3153634),
  204.     vec2(-0.738582, -0.09323367),
  205.     vec2(-0.695694, 0.08865929),
  206.     vec2(-0.6868832, 0.6336682),
  207.     vec2(-0.6751406, 0.2777427),
  208.     vec2(-0.666558, -0.6801786),
  209.     vec2(-0.631489, -0.4702293),
  210.     vec2(-0.5870083, 0.518836),
  211.     vec2(-0.5744062, -0.06333278),
  212.     vec2(-0.5667221, 0.1699501),
  213.     vec2(-0.5537653, 0.7677022),
  214.     vec2(-0.5337034, 0.3299558),
  215.     vec2(-0.5201509, -0.2033358),
  216.     vec2(-0.4873925, -0.8545401),
  217.     vec2(-0.4712743, -0.3607009),
  218.     vec2(-0.4524891, -0.5142469),
  219.     vec2(-0.4421883, -0.6830674),
  220.     vec2(-0.4293752, 0.6299667),
  221.     vec2(-0.4240644, 0.8706763),
  222.     vec2(-0.4139857, 0.1598689),
  223.     vec2(-0.3838707, 0.4078749),
  224.     vec2(-0.3688077, -0.0358762),
  225.     vec2(-0.3432877, -0.2311365),
  226.     vec2(-0.3256257, -0.9325441),
  227.     vec2(-0.2751555, 0.302412),
  228.     vec2(-0.2679778, -0.654425),
  229.     vec2(-0.2554769, -0.4441924),
  230.     vec2(-0.243476, -0.8034022),
  231.     vec2(-0.2367678, -0.108045),
  232.     vec2(-0.2196257, 0.8243803),
  233.     vec2(-0.2119443, 0.06230118),
  234.     vec2(-0.1708038, -0.9437978),
  235.     vec2(-0.1694005, 0.5692244),
  236.     vec2(-0.136494, 0.3937041),
  237.     vec2(-0.1318274, -0.2166154),
  238.     vec2(-0.09781472, -0.5743775),
  239.     vec2(-0.09480921, 0.2369129),
  240.     vec2(-0.07638182, -0.0571501),
  241.     vec2(-0.06661344, -0.7966294),
  242.     vec2(-0.06305461, -0.3521975),
  243.     vec2(-0.04525706, 0.6982157),
  244.     vec2(-0.04149697, 0.9666064),
  245.     vec2(-0.003192461, -0.9693027),
  246.     vec2(0.0104818, 0.5000805),
  247.     vec2(0.03228819, -0.1681713),
  248.     vec2(0.03715288, -0.673852),
  249.     vec2(0.08470399, -0.3922319),
  250.     vec2(0.09848712, -0.8374477),
  251.     vec2(0.09940207, 0.1117471),
  252.     vec2(0.1395643, 0.313647),
  253.     vec2(0.1565993, 0.8555924),
  254.     vec2(0.1772605, -0.5248074),
  255.     vec2(0.1899546, 0.5249656),
  256.     vec2(0.1952665, -0.9595091),
  257.     vec2(0.213078, -0.07045701),
  258.     vec2(0.2277649, -0.3361143),
  259.     vec2(0.247221, 0.7353553),
  260.     vec2(0.2493455, -0.6874771),
  261.     vec2(0.269915, 0.07673722),
  262.     vec2(0.3039587, 0.9087375),
  263.     vec2(0.3189922, 0.3008468),
  264.     vec2(0.3215453, -0.1954931),
  265.     vec2(0.3593478, 0.4527411),
  266.     vec2(0.3745022, -0.597945),
  267.     vec2(0.3879738, -0.7821383),
  268.     vec2(0.4522015, 0.6819367),
  269.     vec2(0.4591872, -0.4484442),
  270.     vec2(0.4626173, -0.03955235),
  271.     vec2(0.4751598, 0.2083394),
  272.     vec2(0.4894366, 0.8694122),
  273.     vec2(0.4896614, -0.2676601),
  274.     vec2(0.5070116, -0.6733028),
  275.     vec2(0.5525513, 0.436241),
  276.     vec2(0.5542312, -0.8262905),
  277.     vec2(0.6012187, 0.7003717),
  278.     vec2(0.6075609, -0.1610506),
  279.     vec2(0.6291932, 0.2213627),
  280.     vec2(0.6300695, -0.5324634),
  281.     vec2(0.6613995, -0.7056449),
  282.     vec2(0.6699739, -0.3828001),
  283.     vec2(0.6705787, 0.01011722),
  284.     vec2(0.6814164, 0.5618623),
  285.     vec2(0.7808329, 0.261445),
  286.     vec2(0.7830279, -0.1817809),
  287.     vec2(0.8006546, -0.5266678),
  288.     vec2(0.8030878, 0.4266291),
  289.     vec2(0.8259325, 0.08734058),
  290.     vec2(0.8621388, -0.3646038),
  291.     vec2(0.9531851, 0.3011991),
  292.     vec2(0.9578334, -0.1584408),
  293.     vec2(0.9898114, 0.1029227)
  294. );
  295.  
  296. const vec2 Poisson128[128] = vec2[](
  297.     vec2(-0.9406119, 0.2160107),
  298.     vec2(-0.920003, 0.03135762),
  299.     vec2(-0.917876, -0.2841548),
  300.     vec2(-0.9166079, -0.1372365),
  301.     vec2(-0.8978907, -0.4213504),
  302.     vec2(-0.8467999, 0.5201505),
  303.     vec2(-0.8261013, 0.3743192),
  304.     vec2(-0.7835162, 0.01432008),
  305.     vec2(-0.779963, 0.2161933),
  306.     vec2(-0.7719588, 0.6335353),
  307.     vec2(-0.7658782, -0.3316436),
  308.     vec2(-0.7341912, -0.5430729),
  309.     vec2(-0.6825727, -0.1883408),
  310.     vec2(-0.6777467, 0.3313724),
  311.     vec2(-0.662191, 0.5155144),
  312.     vec2(-0.6569989, -0.7000636),
  313.     vec2(-0.6021447, 0.7923283),
  314.     vec2(-0.5980815, -0.5529259),
  315.     vec2(-0.5867089, 0.09857152),
  316.     vec2(-0.5774597, -0.8154474),
  317.     vec2(-0.5767041, -0.2656419),
  318.     vec2(-0.575091, -0.4220052),
  319.     vec2(-0.5486979, -0.09635002),
  320.     vec2(-0.5235587, 0.6594529),
  321.     vec2(-0.5170338, -0.6636339),
  322.     vec2(-0.5114055, 0.4373561),
  323.     vec2(-0.4844725, 0.2985838),
  324.     vec2(-0.4803245, 0.8482798),
  325.     vec2(-0.4651957, -0.5392771),
  326.     vec2(-0.4529685, 0.09942394),
  327.     vec2(-0.4523471, -0.3125569),
  328.     vec2(-0.4268422, 0.5644538),
  329.     vec2(-0.4187512, -0.8636028),
  330.     vec2(-0.4160798, -0.0844868),
  331.     vec2(-0.3751733, 0.2196607),
  332.     vec2(-0.3656596, -0.7324334),
  333.     vec2(-0.3286595, -0.2012637),
  334.     vec2(-0.3147397, -0.0006635741),
  335.     vec2(-0.3135846, 0.3636878),
  336.     vec2(-0.3042951, -0.4983553),
  337.     vec2(-0.2974239, 0.7496996),
  338.     vec2(-0.2903037, 0.8890813),
  339.     vec2(-0.2878664, -0.8622097),
  340.     vec2(-0.2588971, -0.653879),
  341.     vec2(-0.2555692, 0.5041648),
  342.     vec2(-0.2553292, -0.3389159),
  343.     vec2(-0.2401368, 0.2306108),
  344.     vec2(-0.2124457, -0.09935001),
  345.     vec2(-0.1877905, 0.1098409),
  346.     vec2(-0.1559879, 0.3356432),
  347.     vec2(-0.1499449, 0.7487829),
  348.     vec2(-0.146661, -0.9256138),
  349.     vec2(-0.1342774, 0.6185387),
  350.     vec2(-0.1224529, -0.3887629),
  351.     vec2(-0.116467, 0.8827716),
  352.     vec2(-0.1157598, -0.539999),
  353.     vec2(-0.09983152, -0.2407187),
  354.     vec2(-0.09953719, -0.78346),
  355.     vec2(-0.08604223, 0.4591112),
  356.     vec2(-0.02128129, 0.1551989),
  357.     vec2(-0.01478849, 0.6969455),
  358.     vec2(-0.01231739, -0.6752576),
  359.     vec2(-0.005001599, -0.004027164),
  360.     vec2(0.00248426, 0.567932),
  361.     vec2(0.00335562, 0.3472346),
  362.     vec2(0.009554717, -0.4025437),
  363.     vec2(0.02231783, -0.1349781),
  364.     vec2(0.04694207, -0.8347212),
  365.     vec2(0.05412609, 0.9042216),
  366.     vec2(0.05812819, -0.9826952),
  367.     vec2(0.1131321, -0.619306),
  368.     vec2(0.1170737, 0.6799788),
  369.     vec2(0.1275105, 0.05326218),
  370.     vec2(0.1393405, -0.2149568),
  371.     vec2(0.1457873, 0.1991508),
  372.     vec2(0.1474208, 0.5443151),
  373.     vec2(0.1497117, -0.3899909),
  374.     vec2(0.1923773, 0.3683496),
  375.     vec2(0.2110928, -0.7888536),
  376.     vec2(0.2148235, 0.9586087),
  377.     vec2(0.2152219, -0.1084362),
  378.     vec2(0.2189204, -0.9644538),
  379.     vec2(0.2220028, -0.5058427),
  380.     vec2(0.2251696, 0.779461),
  381.     vec2(0.2585723, 0.01621339),
  382.     vec2(0.2612841, -0.2832426),
  383.     vec2(0.2665483, -0.6422054),
  384.     vec2(0.2939872, 0.1673226),
  385.     vec2(0.3235748, 0.5643662),
  386.     vec2(0.3269232, 0.6984669),
  387.     vec2(0.3425438, -0.1783788),
  388.     vec2(0.3672505, 0.4398117),
  389.     vec2(0.3755714, -0.8814359),
  390.     vec2(0.379463, 0.2842356),
  391.     vec2(0.3822978, -0.381217),
  392.     vec2(0.4057849, -0.5227674),
  393.     vec2(0.4168737, -0.6936938),
  394.     vec2(0.4202749, 0.8369391),
  395.     vec2(0.4252189, 0.03818182),
  396.     vec2(0.4445904, -0.09360636),
  397.     vec2(0.4684285, 0.5885228),
  398.     vec2(0.4952184, -0.2319764),
  399.     vec2(0.5072351, 0.3683765),
  400.     vec2(0.5136194, -0.3944138),
  401.     vec2(0.519893, 0.7157083),
  402.     vec2(0.5277841, 0.1486474),
  403.     vec2(0.5474944, -0.7618791),
  404.     vec2(0.5692734, 0.4852227),
  405.     vec2(0.582229, -0.5125455),
  406.     vec2(0.583022, 0.008507785),
  407.     vec2(0.6500257, 0.3473313),
  408.     vec2(0.6621304, -0.6280518),
  409.     vec2(0.6674218, -0.2260806),
  410.     vec2(0.6741871, 0.6734863),
  411.     vec2(0.6753459, 0.1119422),
  412.     vec2(0.7083091, -0.4393666),
  413.     vec2(0.7106963, -0.102099),
  414.     vec2(0.7606754, 0.5743545),
  415.     vec2(0.7846709, 0.2282225),
  416.     vec2(0.7871446, 0.3891495),
  417.     vec2(0.8071781, -0.5257092),
  418.     vec2(0.8230689, 0.002674922),
  419.     vec2(0.8531976, -0.3256475),
  420.     vec2(0.8758298, -0.1824844),
  421.     vec2(0.8797691, 0.1284946),
  422.     vec2(0.926309, 0.3576975),
  423.     vec2(0.9608918, -0.03495717),
  424.     vec2(0.972032, 0.2271516)
  425. );
  426.  
  427. vec2 cubeMapTexCoords(vec3 v)
  428. {
  429.     vec2 uv;
  430.     if (abs(v.x) > abs(v.y) && abs(v.x) > abs(v.z))
  431.         uv = vec2(v.y / abs(v.x), v.z / abs(v.x));
  432.     if (abs(v.y) > abs(v.x) && abs(v.y) > abs(v.z))
  433.         uv = vec2(v.x / abs(v.y), v.z / abs(v.y));
  434.     else
  435.         uv = vec2(v.x / abs(v.z), v.y / abs(v.z));
  436.     return uv * 0.5 + 0.5;
  437. }
  438.  
  439. bool isBlack(vec3 c)
  440. {
  441.     return (dot(c, c) == 0.0);
  442. }
  443.  
  444. float borderDepthTexture(sampler2D tex, vec2 uv)
  445. {
  446.     return ((uv.x <= 1.0) && (uv.y <= 1.0) &&
  447.      (uv.x >= 0.0) && (uv.y >= 0.0)) ? textureLod(tex, uv, 0.0).z : 1.0;
  448. }
  449.  
  450. float borderPCFTexture(sampler2DShadow tex, vec3 uvz)
  451. {
  452.     return ((uvz.x <= 1.0) && (uvz.y <= 1.0) &&
  453.      (uvz.x >= 0.0) && (uvz.y >= 0.0)) ? texture(tex, uvz) :
  454.      ((uvz.z <= 1.0) ? 1.0 : 0.0);
  455. }
  456.  
  457. vec4 shade(vec3 worldPos, vec3 normal)
  458. {
  459.     vec3 lightDir = normalize(g_lightPos - worldPos);
  460.     if (g_useTexture == 1)
  461.     {
  462.         vec2 uv = (worldPos.xz * 0.5 + 0.5) * 2.0;
  463.         vec3 diffuse = texture(g_groundDiffuse, uv).xyz;
  464.         normal = texture(g_groundNormal, uv).xzy * 2.0 - 1.0;
  465.         diffuse *= max(dot(lightDir, normal), 0.0);
  466.         diffuse *= pow(dot(lightDir, normalize(g_lightPos)), 40.0);
  467.         return vec4(diffuse, 1.0);
  468.     }
  469.     else if (g_useTexture == 2)
  470.     {
  471.         vec2 uv = cubeMapTexCoords(normalize(worldPos.xyz - g_podiumCenterWorld));
  472.         vec3 diffuse = texture(g_rockDiffuse, uv).xyz * 1.2;
  473.         diffuse *= max(dot(lightDir, normal), 0.0);
  474.         return vec4(diffuse, 1.0);
  475.     }
  476.     else
  477.     {
  478.         float x = max(dot(lightDir, normal), 0.0);
  479.         vec4 diffuse = vec4(x, x, x, 1.0);
  480.         return g_useDiffuse ? diffuse : vec4(1.0, 1.0, 1.0, 1.0);        
  481.     }
  482. }
  483.  
  484. // Using similar triangles from the surface point to the area light
  485. vec2 searchRegionRadiusUV(float zWorld)
  486. {
  487.     return g_lightRadiusUV * (zWorld - g_lightZNear) / zWorld;
  488. }
  489.  
  490. // Using similar triangles between the area light, the blocking plane and the surface point
  491. vec2 penumbraRadiusUV(float zReceiver, float zBlocker)
  492. {
  493.     return g_lightRadiusUV * (zReceiver - zBlocker) / zBlocker;
  494. }
  495.  
  496. // Project UV size to the near plane of the light
  497. vec2 projectToLightUV(vec2 sizeUV, float zWorld)
  498. {
  499.     return sizeUV * g_lightZNear / zWorld;
  500. }
  501.  
  502. // Derivatives of light-space depth with respect to texture2D coordinates
  503. vec2 depthGradient(vec2 uv, float z)
  504. {
  505.     vec2 dz_duv = vec2(0.0, 0.0);
  506.  
  507.     vec3 duvdist_dx = dFdx(vec3(uv,z));
  508.     vec3 duvdist_dy = dFdy(vec3(uv,z));
  509.  
  510.     dz_duv.x = duvdist_dy.y * duvdist_dx.z;
  511.     dz_duv.x -= duvdist_dx.y * duvdist_dy.z;
  512.  
  513.     dz_duv.y = duvdist_dx.x * duvdist_dy.z;
  514.     dz_duv.y -= duvdist_dy.x * duvdist_dx.z;
  515.  
  516.     float det = (duvdist_dx.x * duvdist_dy.y) - (duvdist_dx.y * duvdist_dy.x);
  517.     dz_duv /= det;
  518.  
  519.     return dz_duv;
  520. }
  521.  
  522. float biasedZ(float z0, vec2 dz_duv, vec2 offset)
  523. {
  524.     return z0 + dot(dz_duv, offset);
  525. }
  526.  
  527. float zClipToEye(float z)
  528. {
  529.     return g_lightZFar * g_lightZNear / (g_lightZFar - z * (g_lightZFar - g_lightZNear));  
  530. }
  531.  
  532. // Returns average blocker depth in the search region, as well as the number of found blockers.
  533. // Blockers are defined as shadow-map samples between the surface point and the light.
  534. void findBlocker(
  535.     out float accumBlockerDepth,
  536.     out float numBlockers,
  537.     out float maxBlockers,
  538.     vec2 uv,
  539.     float z0,
  540.     vec2 dz_duv,
  541.     vec2 searchRegionRadiusUV)
  542. {
  543.     accumBlockerDepth = 0.0;
  544.     numBlockers = 0.0;
  545.     maxBlockers = 300.0;
  546.    
  547.     switch (g_samplePattern)
  548.     {
  549.         case POISSON_25_25:
  550.         {
  551.             maxBlockers = 25.0;
  552.             for (int i = 0; i < 25; ++i)
  553.             {
  554.                 vec2 offset = Poisson25[i] * searchRegionRadiusUV;
  555.                 float shadowMapDepth = borderDepthTexture(g_shadowMapDepth, uv + offset);
  556.                 float z = biasedZ(z0, dz_duv, offset);
  557.                 if (shadowMapDepth < z)
  558.                 {
  559.                     accumBlockerDepth += shadowMapDepth;
  560.                     numBlockers++;
  561.                 }
  562.             }
  563.         }
  564.         break;
  565.  
  566.         case POISSON_32_64:
  567.         {
  568.             maxBlockers = 32.0;
  569.             for (int i = 0; i < 32; ++i)
  570.             {
  571.                 vec2 offset = Poisson32[i] * searchRegionRadiusUV;
  572.                 float shadowMapDepth = borderDepthTexture(g_shadowMapDepth, uv + offset);
  573.                 float z = biasedZ(z0, dz_duv, offset);
  574.                 if (shadowMapDepth < z)
  575.                 {
  576.                     accumBlockerDepth += shadowMapDepth;
  577.                     numBlockers++;
  578.                 }
  579.             }
  580.         }
  581.         break;
  582.  
  583.         case POISSON_100_100:
  584.         {
  585.             maxBlockers = 100.0;
  586.             for (int i = 0; i < 100; ++i)
  587.             {
  588.                 vec2 offset = Poisson100[i] * searchRegionRadiusUV;
  589.                 float shadowMapDepth = borderDepthTexture(g_shadowMapDepth, uv + offset);
  590.                 float z = biasedZ(z0, dz_duv, offset);
  591.                 if (shadowMapDepth < z)
  592.                 {
  593.                     accumBlockerDepth += shadowMapDepth;
  594.                     numBlockers++;
  595.                 }
  596.             }
  597.         }
  598.         break;
  599.  
  600.         case POISSON_64_128:
  601.         {
  602.             maxBlockers = 64.0;
  603.             for (int i = 0; i < 64; ++i)
  604.             {
  605.                 vec2 offset = Poisson64[i] * searchRegionRadiusUV;
  606.                 float shadowMapDepth = borderDepthTexture(g_shadowMapDepth, uv + offset);
  607.                 float z = biasedZ(z0, dz_duv, offset);
  608.                 if (shadowMapDepth < z)
  609.                 {
  610.                     accumBlockerDepth += shadowMapDepth;
  611.                     numBlockers++;
  612.                 }
  613.             }
  614.         }
  615.         break;
  616.  
  617.         case REGULAR_49_225:
  618.         {
  619.             maxBlockers = 49.0;
  620.             vec2 stepUV = searchRegionRadiusUV / 3.0;
  621.             for (int x = -3; x <= 3; ++x)
  622.             {
  623.                 for (int y = -3; y <= 3; ++y)
  624.                 {
  625.                     vec2 offset = vec2(x, y) * stepUV;
  626.                     float shadowMapDepth = borderDepthTexture(g_shadowMapDepth, uv + offset);
  627.                     float z = biasedZ(z0, dz_duv, offset);
  628.                     if (shadowMapDepth < z)
  629.                     {
  630.                         accumBlockerDepth += shadowMapDepth;
  631.                         numBlockers++;
  632.                     }
  633.                 }
  634.             }
  635.         }
  636.         break;
  637.     }
  638. }
  639.  
  640. // Performs PCF filtering on the shadow map using multiple taps in the filter region.
  641. float pcfFilter(vec2 uv, float z0, vec2 dz_duv, vec2 filterRadiusUV)
  642. {
  643.     float sum = 0.0;
  644.  
  645.     switch (g_samplePattern)
  646.     {
  647.         case POISSON_25_25:
  648.         {
  649.             for (int i = 0; i < 25; ++i)
  650.             {
  651.                 vec2 offset = Poisson25[i] * filterRadiusUV;
  652.                 float z = biasedZ(z0, dz_duv, offset);
  653.                 sum += borderPCFTexture(g_shadowMapPcf, vec3(uv + offset, z));
  654.             }
  655.             return sum / 25.0;
  656.         }
  657.  
  658.         case POISSON_32_64:
  659.         {
  660.             for (int i = 0; i < 64; ++i)
  661.             {
  662.                 vec2 offset = Poisson64[i] * filterRadiusUV;
  663.                 float z = biasedZ(z0, dz_duv, offset);
  664.                 sum += borderPCFTexture(g_shadowMapPcf, vec3(uv + offset, z));
  665.             }
  666.             return sum / 64.0;
  667.         }
  668.  
  669.         case POISSON_100_100:
  670.         {
  671.             for (int i = 0; i < 100; ++i)
  672.             {
  673.                 vec2 offset = Poisson100[i] * filterRadiusUV;
  674.                 float z = biasedZ(z0, dz_duv, offset);
  675.                 sum += borderPCFTexture(g_shadowMapPcf, vec3(uv + offset, z));
  676.             }
  677.             return sum / 100.0;
  678.         }
  679.  
  680.         case POISSON_64_128:
  681.         {
  682.             for (int i = 0; i < 128; ++i)
  683.             {
  684.                 vec2 offset = Poisson128[i] * filterRadiusUV;
  685.                 float z = biasedZ(z0, dz_duv, offset);
  686.                 sum += borderPCFTexture(g_shadowMapPcf, vec3(uv + offset, z));
  687.             }
  688.             return sum / 128.0;
  689.         }
  690.  
  691.         case REGULAR_49_225:
  692.         {
  693.             vec2 stepUV = filterRadiusUV / 7.0;
  694.             for (int x = -7; x <= 7; ++x)
  695.             {
  696.                 for (int y = -7; y <= 7; ++y)
  697.                 {
  698.                     vec2 offset = vec2(x, y) * stepUV;
  699.                     float z = biasedZ(z0, dz_duv, offset);
  700.                     sum += borderPCFTexture(g_shadowMapPcf, vec3(uv + offset, z));
  701.                 }                
  702.             }
  703.             float numSamples = 7.0 * 2.0 + 1.0;
  704.             return sum / (numSamples * numSamples);
  705.         }
  706.  
  707.         default:
  708.             return 1.0;
  709.     }
  710. }
  711.  
  712. float pcssShadow(vec2 uv, float z, vec2 dz_duv, float zEye)
  713. {
  714.     // ------------------------
  715.     // STEP 1: blocker search
  716.     // ------------------------
  717.     float accumBlockerDepth, numBlockers, maxBlockers;
  718.     vec2 searchRegionRadiusUV = searchRegionRadiusUV(zEye);
  719.     findBlocker(accumBlockerDepth, numBlockers, maxBlockers, uv, z, dz_duv, searchRegionRadiusUV);
  720.  
  721.     // Early out if not in the penumbra
  722.     if (numBlockers == 0.0)
  723.         return 1.0;
  724.  
  725.     // ------------------------
  726.     // STEP 2: penumbra size
  727.     // ------------------------
  728.     float avgBlockerDepth = accumBlockerDepth / numBlockers;
  729.     float avgBlockerDepthWorld = zClipToEye(avgBlockerDepth);
  730.     vec2 penumbraRadius = penumbraRadiusUV(zEye, avgBlockerDepthWorld);
  731.     vec2 filterRadius = projectToLightUV(penumbraRadius, zEye);
  732.  
  733.     // ------------------------
  734.     // STEP 3: filtering
  735.     // ------------------------
  736.     return pcfFilter(uv, z, dz_duv, filterRadius);
  737. }
  738.  
  739. float pcfShadow(vec2 uv, float z, vec2 dz_duv, float zEye)
  740. {
  741.     // Do a blocker search to enable early out
  742.     float accumBlockerDepth, numBlockers, maxBlockers;
  743.     vec2 searchRegionRadius = searchRegionRadiusUV(zEye);
  744.     findBlocker(accumBlockerDepth, numBlockers, maxBlockers, uv, z, dz_duv, searchRegionRadius);
  745.     if (numBlockers == 0.0)
  746.         return 1.0;
  747.  
  748.     vec2 filterRadius = 0.1 * g_lightRadiusUV;
  749.     return pcfFilter(uv, z, dz_duv, filterRadius);
  750. }
  751.  
  752. void main()
  753. {
  754.     vec2 uv = lightPosition.xy / lightPosition.w;
  755.     float z = lightPosition.z / lightPosition.w;
  756.  
  757.     // Compute gradient using ddx/ddy before any branching
  758.     vec2 dz_duv = depthGradient(uv, z);
  759.     vec4 color = shade(worldPosition.xyz, normal);
  760.     if (isBlack(color.rgb))
  761.     {
  762.         fragColor = color;
  763.     }
  764.     else
  765.     {
  766.         // Eye-space z from the light's point of view
  767.         float zEye = -(g_lightView * worldPosition).z;
  768.         float shadow = 1.0f;
  769.         switch (g_shadowTechnique)
  770.         {
  771.             case 1:
  772.                 shadow = pcssShadow(uv, z, dz_duv, zEye);
  773.                 break;
  774.  
  775.             case 2:
  776.                 shadow = pcfShadow(uv, z, dz_duv, zEye);
  777.                 break;
  778.         }
  779.         fragColor = color * shadow;
  780.     }
  781. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement