Advertisement
StealthGlobal

Blockland PCSS 'r3'

Feb 10th, 2018
144
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #version 120
  2. #extension GL_EXT_texture_array : require
  3. #extension GL_EXT_texture_array : enable
  4.  
  5. // Port's Poisson Disc (Optimized) Soft Shadow Shader (2015), modified by Stealth Commander/QuadStorm
  6. // Includes an ultra graphics version, a Percentage-Closer Soft Shadows (PCSS) implementation, and other smaller configuration variables
  7.  
  8. // Revision '3' Release
  9. // TODO: searchDistance, lightSize autoAdjust?
  10.  
  11.  
  12. // Configuration: For the adventurous!
  13.  
  14. // Configuration Guide
  15. // |default - the values as released as a reference for tuning|
  16. // debug - show only shadows? |false|
  17. // ultraMode - use 2 shadow sample layers ontop of eachother for an 'ultra' graphics effect |false|
  18. // ultraRatio - ratio in size between the normal and ambient samples |5.0f|
  19. // PCSSToggle - toggles PCSS (dynamic soft shadow variance by distance) |true|
  20. // depthLoopNumber - sampling loop amount around each distance point: 1 = 3x3, 2 = 5x5, 3 = 7x7, etc. |2|
  21. // lightSize - how large the light source is -- the larger the softer shadows get faster. larger values can get messy |0.2f|
  22. // searchDistance - the shadow depth search distance -- higher values don't 'bleed' enough and lower values are less precise with shadow depths; /decrease/ for smaller lightsizes, /increase/ for larger ones |1.0f / 1536.0f|
  23. // superGlow - Off-like glow effect; works correctly for transparent glowing bricks |true|
  24. // shadowOpacity - allows for changing how transparent/opaque shadows are -- see https://forum.blockland.us/index.php?topic=289446.0; this toggles the fix |true|
  25. // occlusionBlend - strength of above effect, where 1.0f is no effect (default opaque), and 0.0f is the same as minimum shaders (no shadows) |0.925f|
  26.  
  27. // Ultra Mode
  28.  
  29. bool ultraMode = false;
  30. float ultraRatio = 5.0f;
  31.  
  32. // PCSS
  33.  
  34. bool PCSSToggle = true;
  35.  
  36. int depthLoopNumber = 2;
  37. float lightSize = 0.2f;
  38. float searchDistance = 1.0f / 1536.0f;
  39.  
  40. // Superglow
  41.  
  42. bool superGlow = true;
  43.  
  44. // Shadow Opacity
  45.  
  46. bool shadowOpacity = true;
  47. float occlusionBlend = 0.95f;
  48.  
  49. // This is blending. Shadows are rendered to separate layers based on distance.
  50. // This may cause shadows to suddenly change appearance. Use this to change
  51. // how long a distance they will "fade" between the two versions over.
  52. // Blending only works with ultra mode off, since I (not port) can not figure this out
  53.  
  54. float blendAlpha = 0.7f; // bl default is 0.9f
  55. float blendBeta = 1.0f - blendAlpha;
  56.  
  57. // These values are very important. If they're too low, you will see weird
  58. // patterns and waves everywhere. If they're too high, shadows will be
  59. // disconnected from their objects. They need to be adjusted carefully.
  60. // These are set specifically for Max quality with max drawing distance.
  61. // You'll need to change them based on your shader quality (and if you changed
  62. // the Poisson disk below.. probably).
  63.  
  64. //const float fudgeFactor1 = 0.1f; //0.1f //0.3f ultra
  65. //const float fudgeFactor2 = 0.15f; //0.25f
  66. //const float fudgeFactor3 = 1.0f; //0.7f
  67. //const float fudgeFactor4 = 1.5f; //2.66f
  68.  
  69. // this becomes quite interesting with PCSS; consider pulling up to depth for the fudgeFactors?
  70. const float fudgeFactor1 = 0.2f; //0.1f
  71. const float fudgeFactor2 = 0.6f; //0.25f
  72. const float fudgeFactor3 = 1.4f; //0.7f
  73. const float fudgeFactor4 = 3.4f; //2.66f
  74.  
  75. // How soft should the shadows be? (how far out does the edge go)
  76. // Change this or the magic numbers below to improve your "softness" quality
  77. // note that fancy powers of two aren't needed, but they're a good starting point
  78.  
  79. float sampleDistance = 1.0f / 1024.0f;
  80.  
  81. // Magic numbers below
  82. // this is a mess; simply added the commented out set of points; another disk will be added sometime
  83. // meanwhile, you can change the diskcount as another quality/performance tradeoff
  84. int poissonDiskCount = 64;
  85. vec2 poissonDisk[209] = vec2[](vec2(-0.2951207, -0.9343002),
  86.                                      vec2(-0.2025318, -0.9754835),
  87.                                      vec2(-0.2322741, -0.8530075),
  88.                                      vec2(-0.3794108, -0.808288),
  89.                                      vec2(-0.1266675, -0.8319663),
  90.                                      vec2(-0.01863114, -0.9015568),
  91.                                      vec2(-0.06881609, -0.9916408),
  92.                                      vec2(0.03625919, -0.7313007),
  93.                                      vec2(0.1704073, -0.9132792),
  94.                                      vec2(0.06686038, -0.9772661),
  95.                                      vec2(0.09106962, -0.8339218),
  96.                                      vec2(-0.5294375, -0.6967739),
  97.                                      vec2(-0.2751279, -0.6392725),
  98.                                      vec2(-0.4152002, -0.7020897),
  99.                                      vec2(-0.4876193, -0.8177729),
  100.                                      vec2(-0.2497744, -0.7448697),
  101.                                      vec2(0.1904383, -0.7381635),
  102.                                      vec2(0.292437, -0.7663944),
  103.                                      vec2(0.2319807, -0.5449511),
  104.                                      vec2(0.3131237, -0.6188368),
  105.                                      vec2(0.1012786, -0.6236167),
  106.                                      vec2(0.3063431, -0.8718672),
  107.                                      vec2(-0.1224333, -0.7319462),
  108.                                      vec2(-0.1830873, -0.5771251),
  109.                                      vec2(-0.4526199, -0.573145),
  110.                                      vec2(-0.6663784, -0.5719544),
  111.                                      vec2(-0.6240153, -0.7563403),
  112.                                      vec2(-0.5676227, -0.5281325),
  113.                                      vec2(-0.7336679, -0.6760617),
  114.                                      vec2(-0.2204783, -0.4727042),
  115.                                      vec2(-0.3604262, -0.5088236),
  116.                                      vec2(-0.345663, -0.3854073),
  117.                                      vec2(-0.4836178, -0.466314),
  118.                                      vec2(0.4347835, -0.5267625),
  119.                                      vec2(0.4727078, -0.6380735),
  120.                                      vec2(0.3495106, -0.4735118),
  121.                                      vec2(0.4267418, -0.7299356),
  122.                                      vec2(0.06361873, -0.5081617),
  123.                                      vec2(-0.05319137, -0.6068379),
  124.                                      vec2(0.4675181, -0.8565386),
  125.                                      vec2(-0.5446453, -0.3261547),
  126.                                      vec2(-0.6121671, -0.4217853),
  127.                                      vec2(-0.6014596, -0.2247451),
  128.                                      vec2(-0.7746953, -0.351309),
  129.                                      vec2(-0.7700586, -0.4808465),
  130.                                      vec2(0.560814, -0.7782227),
  131.                                      vec2(0.6570461, -0.6358915),
  132.                                      vec2(0.612024, -0.5289025),
  133.                                      vec2(0.221402, -0.4027204),
  134.                                      vec2(-0.1189165, -0.4975309),
  135.                                      vec2(-0.03218988, -0.4472675),
  136.                                      vec2(0.1034018, -0.3736421),
  137.                                      vec2(-0.4445997, -0.2955676),
  138.                                      vec2(0.4332047, -0.3436776),
  139.                                      vec2(0.5157568, -0.4210246),
  140.                                      vec2(-0.5416557, -0.09817578),
  141.                                      vec2(-0.6972253, -0.06088046),
  142.                                      vec2(-0.7723264, -0.2307226),
  143.                                      vec2(-0.6773526, -0.2991687),
  144.                                      vec2(-0.4917368, -0.2020922),
  145.                                      vec2(-0.2759185, -0.3109736),
  146.                                      vec2(-0.3560376, -0.23443),
  147.                                      vec2(0.7187951, -0.4469753),
  148.                                      vec2(0.6253875, -0.356856),
  149.                                      vec2(0.808909, -0.5171595),
  150.                                      vec2(0.765902, -0.6339371),
  151.                                      vec2(-0.05865182, -0.3482775),
  152.                                      vec2(0.1496793, -0.2736927),
  153.                                      vec2(0.04774111, -0.2691925),
  154.                                      vec2(-0.8177214, -0.09871018),
  155.                                      vec2(-0.9031715, -0.279608),
  156.                                      vec2(-0.8882925, -0.4114621),
  157.                                      vec2(-0.6868188, -0.1717954),
  158.                                      vec2(-0.1557365, -0.310805),
  159.                                      vec2(-0.08686204, -0.2269464),
  160.                                      vec2(-0.222485, -0.2247291),
  161.                                      vec2(-0.7836896, -0.5882354),
  162.                                      vec2(-0.2810118, -0.1376855),
  163.                                      vec2(-0.9514924, -0.1214282),
  164.                                      vec2(0.2808019, -0.2283967),
  165.                                      vec2(0.1059831, -0.1517286),
  166.                                      vec2(0.301801, -0.3296285),
  167.                                      vec2(-0.2445912, -0.03123893),
  168.                                      vec2(-0.161938, -0.09983041),
  169.                                      vec2(0.4451636, -0.2420286),
  170.                                      vec2(0.6177441, -0.2494904),
  171.                                      vec2(0.7318987, -0.3284208),
  172.                                      vec2(0.7867696, -0.2420232),
  173.                                      vec2(0.8153236, -0.4052573),
  174.                                      vec2(0.8843613, -0.264329),
  175.                                      vec2(-0.00229197, -0.05696198),
  176.                                      vec2(-0.09635602, 0.08454991),
  177.                                      vec2(-0.9292479, 0.05352603),
  178.                                      vec2(-0.8321502, 0.01495203),
  179.                                      vec2(-0.7348551, 0.07829034),
  180.                                      vec2(-0.193631, 0.05622597),
  181.                                      vec2(-0.3817181, -0.1070937),
  182.                                      vec2(-0.3595598, 0.05719875),
  183.                                      vec2(0.712276, -0.1465105),
  184.                                      vec2(0.5674382, -0.06977327),
  185.                                      vec2(0.03386426, 0.1189729),
  186.                                      vec2(0.1788138, -0.04723169),
  187.                                      vec2(0.1040713, 0.03609258),
  188.                                      vec2(-0.569949, 0.1214637),
  189.                                      vec2(-0.721159, 0.1974564),
  190.                                      vec2(-0.7973312, 0.2668945),
  191.                                      vec2(-0.5474234, 0.0109362),
  192.                                      vec2(0.2180393, 0.1414685),
  193.                                      vec2(0.1579315, 0.228581),
  194.                                      vec2(-0.04424897, 0.23032),
  195.                                      vec2(0.4300061, -0.09265975),
  196.                                      vec2(0.5289854, -0.184935),
  197.                                      vec2(0.3245598, -0.1305346),
  198.                                      vec2(0.2996997, -0.00080162),
  199.                                      vec2(0.3287827, 0.2064073),
  200.                                      vec2(0.209101, 0.4146921),
  201.                                      vec2(0.04156134, 0.3408165),
  202.                                      vec2(0.28958, 0.3264798),
  203.                                      vec2(-0.9228035, 0.187646),
  204.                                      vec2(-0.6615269, 0.2966316),
  205.                                      vec2(-0.7703046, 0.3749933),
  206.                                      vec2(-0.8844319, 0.3460503),
  207.                                      vec2(-0.08957069, 0.3777975),
  208.                                      vec2(-0.1437021, 0.2932427),
  209.                                      vec2(0.07078929, 0.4923054),
  210.                                      vec2(-0.2759329, 0.1167137),
  211.                                      vec2(0.5923803, 0.101566),
  212.                                      vec2(0.457482, 0.08178765),
  213.                                      vec2(0.6891469, -0.00306648),
  214.                                      vec2(-0.8147062, 0.1424928),
  215.                                      vec2(0.2488723, 0.5964142),
  216.                                      vec2(0.3650027, 0.5276645),
  217.                                      vec2(0.3942295, 0.4274891),
  218.                                      vec2(0.1791255, 0.5138983),
  219.                                      vec2(0.1131059, 0.6167271),
  220.                                      vec2(0.7146797, 0.1158792),
  221.                                      vec2(0.8086658, 0.02043193),
  222.                                      vec2(-0.03414515, 0.4668858),
  223.                                      vec2(-0.8571717, 0.4855226),
  224.                                      vec2(-0.707948, 0.509567),
  225.                                      vec2(-0.7782653, 0.6083164),
  226.                                      vec2(0.6008161, 0.275326),
  227.                                      vec2(0.8689805, 0.1892055),
  228.                                      vec2(0.7013124, 0.2158892),
  229.                                      vec2(0.7479842, 0.3057784),
  230.                                      vec2(-0.6196709, 0.5650395),
  231.                                      vec2(-0.5717591, 0.4584886),
  232.                                      vec2(-0.6682162, 0.7286317),
  233.                                      vec2(0.837853, -0.1029543),
  234.                                      vec2(0.96546, -0.1640923),
  235.                                      vec2(0.3526091, 0.09202164),
  236.                                      vec2(-0.5646175, 0.6842291),
  237.                                      vec2(-0.4719306, 0.7294176),
  238.                                      vec2(-0.4208826, 0.175825),
  239.                                      vec2(-0.4139594, -0.9041284),
  240.                                      vec2(-0.5723238, 0.2394826),
  241.                                      vec2(-0.5077325, 0.3716691),
  242.                                      vec2(0.9620602, 0.1209726),
  243.                                      vec2(0.9259917, 0.2845874),
  244.                                      vec2(0.8684493, 0.3833033),
  245.                                      vec2(0.01760844, 0.7894553),
  246.                                      vec2(-0.00332467, 0.5757815),
  247.                                      vec2(0.1388087, 0.767468),
  248.                                      vec2(0.02823113, 0.6725987),
  249.                                      vec2(-0.5564942, 0.8044108),
  250.                                      vec2(-0.4678927, 0.6241901),
  251.                                      vec2(0.5093907, 0.5000951),
  252.                                      vec2(0.3889523, 0.6970169),
  253.                                      vec2(0.4996837, 0.6017337),
  254.                                      vec2(0.4321092, 0.2044095),
  255.                                      vec2(-0.2734853, 0.5783554),
  256.                                      vec2(-0.4053446, 0.5245019),
  257.                                      vec2(-0.3688903, 0.6702062),
  258.                                      vec2(-0.655607, 0.3998039),
  259.                                      vec2(0.9495975, 0.01584288),
  260.                                      vec2(0.8231404, 0.47525),
  261.                                      vec2(0.6992897, 0.4347586),
  262.                                      vec2(-0.3959191, 0.309792),
  263.                                      vec2(-0.3130451, 0.2349889),
  264.                                      vec2(0.147981, 0.3291484),
  265.                                      vec2(-0.4310413, 0.8357656),
  266.                                      vec2(-0.3203937, 0.8269374),
  267.                                      vec2(-0.3844733, 0.4126593),
  268.                                      vec2(-0.2666597, 0.4527372),
  269.                                      vec2(-0.2879404, 0.3341098),
  270.                                      vec2(0.01346299, 0.9064359),
  271.                                      vec2(0.2652203, 0.8813863),
  272.                                      vec2(0.2897554, 0.7522234),
  273.                                      vec2(0.1488808, 0.9288996),
  274.                                      vec2(0.6455848, 0.5683564),
  275.                                      vec2(0.5777688, 0.6928319),
  276.                                      vec2(-0.1872719, 0.191142),
  277.                                      vec2(-0.09118005, 0.8416157),
  278.                                      vec2(-0.131365, 0.656777),
  279.                                      vec2(0.527427, 0.3719428),
  280.                                      vec2(0.3832047, 0.8435738),
  281.                                      vec2(-0.1792916, 0.8916299),
  282.                                      vec2(-0.2196967, 0.7723015),
  283.                                      vec2(0.4897658, 0.7962251),
  284.                                      vec2(0.7464077, 0.5564684),
  285.                                      vec2(0.7181923, 0.6609709),
  286.                                      vec2(-0.4721335, 0.08780513),
  287.                                      vec2(-0.1142876, 0.5412015),
  288.                                      vec2(-0.02930278, 0.9983991),
  289.                                      vec2(-0.0766276, 0.742333),
  290.                                      vec2(0.91249, -0.3635237),
  291.                                      vec2(0.4179139, 0.3147621),
  292.                                      vec2(-0.3020974, 0.9318075),
  293.                                      vec2(-0.1900815, 0.3859279));
  294.  
  295. // This has way too much acne
  296. // int poissonDiskCount = 35;
  297. // vec2 poissonDisk[35] = vec2[](
  298. //   vec2(-0.05151585f, 0.3436534f),
  299. //   vec2(0.3648908f, 0.2827295f),
  300. //   vec2(-0.2478754f, 0.186921f),
  301. //   vec2(0.1171809f, 0.1482293f),
  302. //   vec2(-0.1496224f, 0.6990415f),
  303. //   vec2(-0.456594f, 0.378567f),
  304. //   vec2(-0.4242465f, -0.001935145f),
  305. //   vec2(-0.1889321f, -0.2015685f),
  306. //   vec2(0.1480272f, 0.6432338f),
  307. //   vec2(-0.5046303f, 0.8245607f),
  308. //   vec2(0.001617888f, 0.9789896f),
  309. //   vec2(-0.6228038f, 0.5963655f),
  310. //   vec2(0.4185582f, 0.7959766f),
  311. //   vec2(0.06965782f, -0.1184023f),
  312. //   vec2(-0.8310863f, 0.2197417f),
  313. //   vec2(-0.869589f, 0.4893173f),
  314. //   vec2(-0.6366982f, -0.357598f),
  315. //   vec2(-0.2509329f, -0.5531961f),
  316. //   vec2(-0.03994134f, -0.4170877f),
  317. //   vec2(-0.675245f, -0.0009701257f),
  318. //   vec2(0.3373009f, -0.4531572f),
  319. //   vec2(0.3022793f, -0.02336982f),
  320. //   vec2(0.6078352f, 0.5235748f),
  321. //   vec2(-0.9277961f, -0.05385896f),
  322. //   vec2(0.3847639f, -0.7718652f),
  323. //   vec2(0.5278201f, -0.168486f),
  324. //   vec2(0.1269102f, -0.8461399f),
  325. //   vec2(0.7260014f, -0.4588331f),
  326. //   vec2(-0.8775687f, -0.450681f),
  327. //   vec2(-0.574103f, -0.7766181f),
  328. //   vec2(0.6930821f, 0.2592674f),
  329. //   vec2(-0.3360346f, -0.8594083f),
  330. //   vec2(-0.2591985f, 0.9300818f),
  331. //   vec2(0.939391f, -0.2374034f),
  332. //   vec2(0.8332635f, 0.01952092f)
  333. // );
  334.  
  335. bool debug = false;
  336.  
  337. // Varying.
  338. varying vec4 vPos;
  339. varying vec3 worldNormal;
  340. varying vec3 worldPos;
  341.  
  342. // Global directional light uniforms.
  343. uniform vec4 dirLightDir;
  344. uniform vec4 dirLightColor;
  345. uniform vec4 dirLightAmbient;
  346. uniform vec4 dirShadowColor;
  347.  
  348. // Misc uniforms.
  349. uniform vec3 camPos;
  350. uniform mat4 obj2World;
  351. uniform mat4 world2Cam;
  352.  
  353. uniform int isParticle;
  354. uniform int doColorMultiply;
  355. uniform int glow;
  356.  
  357. uniform sampler2DArray stex;
  358. uniform sampler2D tex;
  359.  
  360. // Surface calculations, including specular power.
  361. varying vec2 texCoord;
  362. vec4 viewDelta;
  363. float specular;
  364. float NdotL;
  365. vec3 reflectVec;
  366.  
  367. void calculateSurface(vec4 color, inout vec4 albedo)
  368. {
  369.    viewDelta.xyz = worldPos - camPos;
  370.    viewDelta.w   = length(viewDelta.xyz);
  371.    viewDelta.xyz = -normalize(viewDelta.xyz);
  372.  
  373.    vec4 texAlbedo = texture2D(tex, texCoord);
  374.    albedo.rgb = mix(color.rgb, texAlbedo.rgb, texAlbedo.a);
  375.  
  376.    if(doColorMultiply == 1)
  377.       albedo *= gl_Color;
  378.  
  379.    albedo.a = color.a;
  380.  
  381.    NdotL = max(dot(worldNormal, dirLightDir.xyz), 0.0f);
  382.    reflectVec = normalize(reflect(-dirLightDir.xyz, worldNormal));
  383.    specular = pow(max(dot(reflectVec, viewDelta.xyz), 0.0f), 12.0f) * length(texAlbedo.rgb); //change this to change the size of the sun specular reflection
  384.  
  385.    //Uncomment below line for a neat rainbow color effect on everything
  386.    //albedo.rgb = normalize(viewDelta.xyz);
  387. }
  388.  
  389. // Fogging.
  390. uniform vec4 fogBaseColor;
  391. uniform vec4 fogConsts;
  392. uniform sampler2D fogTex;
  393. varying vec2 fogCoords;
  394. void applyFog(inout vec4 albedo)
  395. {
  396.    // Calculate fog.
  397.    vec4 fogColor = texture2D(fogTex, fogCoords) * fogBaseColor;
  398.  
  399.    // Blend it.
  400.    albedo = mix(albedo, fogColor, fogColor.a);
  401. }
  402.  
  403. // Shadowing
  404. uniform vec4 far_d;
  405. uniform vec2 texSize; // x - size, y - 1/size
  406. uniform vec4 zScale;
  407. uniform int shadowSplitCount;
  408. void calculateShadowCoords(inout vec4 shadow_coordA, inout vec4 shadow_coordB, out float blend)
  409. {
  410.    int index = 3;
  411.    float fudgeFactorA = 0.0f;
  412.    float fudgeFactorB = 0.0f;
  413.    fudgeFactorA = fudgeFactor4 / zScale.w;
  414.    fudgeFactorB = fudgeFactor4 / zScale.w;
  415.    blend = 0.0f;
  416.  
  417.    // find the appropriate depth map to look up in based on the depth of this fragment
  418.    if(vPos.y < far_d.x)
  419.    {
  420.       index = 0;
  421.       if(shadowSplitCount > 1)
  422.          blend = clamp( (vPos.y - (far_d.x * blendAlpha)) / (far_d.x * blendBeta), 0.0f, 1.0f);
  423.       fudgeFactorA = fudgeFactor1 / zScale.x;
  424.       fudgeFactorB = fudgeFactor2 / zScale.y;
  425.    }
  426.    else if(vPos.y < far_d.y)
  427.    {
  428.       index = 1;
  429.       if(shadowSplitCount > 2)
  430.          blend = clamp( (vPos.y - (far_d.y * blendAlpha)) / (far_d.x * blendBeta), 0.0f, 1.0f);
  431.       fudgeFactorA = fudgeFactor2 / zScale.y;
  432.       fudgeFactorB = fudgeFactor3 / zScale.z;
  433.    }
  434.    else if(vPos.y < far_d.z)
  435.    {
  436.       index = 2;
  437.       if(shadowSplitCount > 3)
  438.          blend = clamp( (vPos.y - (far_d.z * blendAlpha)) / (far_d.x * blendBeta), 0.0f, 1.0f);
  439.       fudgeFactorA = fudgeFactor3 / zScale.z;
  440.       fudgeFactorB = fudgeFactor4 / zScale.w;
  441.    }
  442.  
  443.    // transform this fragment's position from view space to scaled light clip space
  444.    // such that the xy coordinates are in [0;1]
  445.    // note there is no need to divide by w for orthogonal light sources
  446.    shadow_coordA   = gl_TextureMatrix[index]*vPos;
  447.    shadow_coordA.w = shadow_coordA.z - fudgeFactorA; // Figure the input coordinate for PCF sampling if appropriate.
  448.    shadow_coordA.z = float(index);                   // Encode the layer to sample.
  449.  
  450.    //don't have to set second shadow coord if we're not blending
  451.    if(blend > 0.0f)
  452.    {
  453.       shadow_coordB   = gl_TextureMatrix[index + 1]*vPos;
  454.       shadow_coordB.w = shadow_coordB.z - fudgeFactorB;
  455.       shadow_coordB.z = float(index + 1);
  456.    }
  457. }
  458.  
  459. // Point lighting
  460. uniform vec4     pointLightPos0;
  461. uniform vec4   pointLightColor0;
  462. uniform float pointLightRadius0;
  463.  
  464. uniform vec4     pointLightPos1;
  465. uniform vec4   pointLightColor1;
  466. uniform float pointLightRadius1;
  467.  
  468. uniform vec4     pointLightPos2;
  469. uniform vec4   pointLightColor2;
  470. uniform float pointLightRadius2;
  471.  
  472. uniform vec4     pointLightPos3;
  473. uniform vec4   pointLightColor3;
  474. uniform float pointLightRadius3;
  475.  
  476. uniform vec4     pointLightPos4;
  477. uniform vec4   pointLightColor4;
  478. uniform float pointLightRadius4;
  479.  
  480. uniform vec4     pointLightPos5;
  481. uniform vec4   pointLightColor5;
  482. uniform float pointLightRadius5;
  483.  
  484. uniform vec4     pointLightPos6;
  485. uniform vec4   pointLightColor6;
  486. uniform float pointLightRadius6;
  487.  
  488. uniform vec4     pointLightPos7;
  489. uniform vec4   pointLightColor7;
  490. uniform float pointLightRadius7;
  491.  
  492. vec4 accumulatePointLights()
  493. {
  494.    vec4 pointLightTotal = vec4(0.0f, 0.0f, 0.0f, 0.0f);
  495.    vec3 lightDelta = vec3(0.0f, 0.0f, 0.0f);
  496.    float lightDot = 0.0f;
  497.    float ratio = 0.0f;
  498.  
  499.    // Calculate effects of the 8 point lights.
  500.  
  501.    lightDelta = worldPos.xyz - pointLightPos0.xyz;
  502.    lightDot = max(dot(-normalize(lightDelta), worldNormal), 0.0f);
  503.    ratio = 1.0f - (length(lightDelta) / pointLightRadius0);
  504.    ratio = ratio * ratio * ratio * 0.4f;
  505.    ratio = max(ratio, 0.0f);
  506.    pointLightTotal.xyz += ratio * lightDot * pointLightColor0.xyz;
  507.  
  508.    lightDelta = worldPos.xyz - pointLightPos1.xyz;
  509.    lightDot = max(dot(-normalize(lightDelta), worldNormal), 0.0f);
  510.    ratio = 1.0f - (length(lightDelta) / pointLightRadius1);
  511.    ratio = ratio * ratio * ratio * 0.4f;
  512.    ratio = max(ratio, 0.0f);
  513.    pointLightTotal.xyz += ratio * lightDot * pointLightColor1.xyz;
  514.  
  515.    lightDelta = worldPos.xyz - pointLightPos2.xyz;
  516.    lightDot = max(dot(-normalize(lightDelta), worldNormal), 0.0f);
  517.    ratio = 1.0f - (length(lightDelta) / pointLightRadius2);
  518.    ratio = ratio * ratio * ratio * 0.4f;
  519.    ratio = max(ratio, 0.0f);
  520.    pointLightTotal.xyz += ratio * lightDot * pointLightColor2.xyz;
  521.  
  522.    lightDelta = worldPos.xyz - pointLightPos3.xyz;
  523.    lightDot = max(dot(-normalize(lightDelta), worldNormal), 0.0f);
  524.    ratio = 1.0f - (length(lightDelta) / pointLightRadius3);
  525.    ratio = ratio * ratio * ratio * 0.4f;
  526.    ratio = max(ratio, 0.0f);
  527.    pointLightTotal.xyz += ratio * lightDot * pointLightColor3.xyz;
  528.  
  529.    lightDelta = worldPos.xyz - pointLightPos4.xyz;
  530.    lightDot = max(dot(-normalize(lightDelta), worldNormal), 0.0f);
  531.    ratio = 1.0f - (length(lightDelta) / pointLightRadius4);
  532.    ratio = ratio * ratio * ratio * 0.4f;
  533.    ratio = max(ratio, 0.0f);
  534.    pointLightTotal.xyz += ratio * lightDot * pointLightColor4.xyz;
  535.  
  536.    lightDelta = worldPos.xyz - pointLightPos5.xyz;
  537.    lightDot = max(dot(-normalize(lightDelta), worldNormal), 0.0f);
  538.    ratio = 1.0f - (length(lightDelta) / pointLightRadius5);
  539.    ratio = ratio * ratio * ratio * 0.4f;
  540.    ratio = max(ratio, 0.0f);
  541.    pointLightTotal.xyz += ratio * lightDot * pointLightColor5.xyz;
  542.  
  543.    lightDelta = worldPos.xyz - pointLightPos6.xyz;
  544.    lightDot = max(dot(-normalize(lightDelta), worldNormal), 0.0f);
  545.    ratio = 1.0f - (length(lightDelta) / pointLightRadius6);
  546.    ratio = ratio * ratio * ratio * 0.4f;
  547.    ratio = max(ratio, 0.0f);
  548.    pointLightTotal.xyz += ratio * lightDot * pointLightColor6.xyz;
  549.  
  550.    lightDelta = worldPos.xyz - pointLightPos7.xyz;
  551.    lightDot = max(dot(-normalize(lightDelta), worldNormal), 0.0f);
  552.    ratio = 1.0f - (length(lightDelta) / pointLightRadius7);
  553.    ratio = ratio * ratio * ratio * 0.4f;
  554.    ratio = max(ratio, 0.0f);
  555.    pointLightTotal.xyz += ratio * lightDot * pointLightColor7.xyz;
  556.  
  557.    return pointLightTotal;
  558. }
  559.  
  560. vec4 accumulateParticlePointLights()
  561. {
  562.    vec4 pointLightTotal = vec4(0.0f, 0.0f, 0.0f, 0.0f);
  563.    vec3 lightDelta = vec3(0.0f, 0.0f, 0.0f);
  564.    float ratio = 0.0f;
  565.  
  566.    // Calculate effects of the 8 point lights.
  567.  
  568.    lightDelta = worldPos.xyz - pointLightPos0.xyz;
  569.    ratio = 1.0f - (length(lightDelta) / pointLightRadius0);
  570.    ratio = ratio * ratio * ratio * 0.4f;
  571.    ratio = max(ratio, 0.0f);
  572.    pointLightTotal.xyz += ratio * pointLightColor0.xyz;
  573.  
  574.    lightDelta = worldPos.xyz - pointLightPos1.xyz;
  575.    ratio = 1.0f - (length(lightDelta) / pointLightRadius1);
  576.    ratio = ratio * ratio * ratio * 0.4f;
  577.    ratio = max(ratio, 0.0f);
  578.    pointLightTotal.xyz += ratio * pointLightColor1.xyz;
  579.  
  580.    return pointLightTotal;
  581. }
  582.  
  583. // Combine specular and direct lighting terms.
  584. // note: if we make combinedColor "out" only, it throws a potentially uninitialized value warning, so we've made it inout
  585. void applyLighting(inout vec4 combinedColor, vec4 albedo, float occlusionFactor)
  586. {
  587.    //large normal means glowing object
  588.    if(glow == 1 || (worldNormal.x + worldNormal.y + worldNormal.z) > 2.0f)
  589.    {
  590.       combinedColor = superGlow ? vec4(albedo.xyz * 1.5f, albedo.a) : albedo;
  591.       return;
  592.    }
  593.  
  594.    vec4 dirLightSpecular = occlusionFactor * specular * dirLightColor;
  595.    dirLightSpecular *= 0.5f; //arbitrary adjustment
  596.    vec4 dirLightDirect = ((NdotL * dirLightColor) * occlusionFactor) + (dirLightAmbient * occlusionFactor) + (dirShadowColor * (1.0f - occlusionFactor));
  597.  
  598.    if(NdotL <= 0.04f)
  599.    {
  600.       dirLightDirect = dirShadowColor;
  601.       dirLightSpecular = vec4(0.0f, 0.0f, 0.0f, 0.0f);
  602.    }
  603.    else if(NdotL <= 0.1)
  604.    {
  605.       float val = (NdotL - 0.04f) / (0.1f - 0.04f);
  606.       dirLightDirect = (dirLightDirect * val) + (dirShadowColor * (1.0f - val));
  607.       dirLightSpecular = dirLightSpecular * val;
  608.    }
  609.  
  610.    dirLightDirect += accumulatePointLights();
  611.  
  612.    dirLightSpecular.a = length(dirLightSpecular.rgb);
  613.    dirLightDirect.a *= min(occlusionFactor + 0.75f, 1.0f);
  614.    combinedColor.rgb = dirLightDirect.rgb * albedo.rgb;
  615.    combinedColor.a = albedo.a;
  616.    combinedColor += dirLightSpecular;
  617. }
  618.  
  619. float poissonSample(vec4 shadow_coord, float spread)
  620. {
  621.   int hit = 0;
  622.  
  623.   for (int i = 0; i < poissonDiskCount; i++) {
  624.     float dist = texture2DArray(stex, vec3(shadow_coord.xy + poissonDisk[i] * spread, shadow_coord.z)).x;
  625.  
  626.     if (dist - shadow_coord.w > 0.0f)
  627.       hit++;
  628.   }
  629.  
  630.   return float(hit) / poissonDiskCount;
  631. }
  632.  
  633. float distanceCalc(vec4 shadow_coord, int loopNumber, float searchDistance, float lightSize)
  634. {
  635.     //if (!PCSSToggle)
  636.         //return 1.0f;
  637.     //return 1.0f / 4096.0f;
  638.     //if (!PCSSToggle)
  639.         //return sampleDistance;
  640.     float pcfDepth;
  641.     int loop; // 3x3, 5x5, 7x7...
  642.     // no loop..
  643.     //for (int = 0; i < 9; i++)
  644.     for (int x = -loopNumber; x <= loopNumber; x++)
  645.     {
  646.         for (int y = -loopNumber; y <= loopNumber; y++)
  647.         {
  648.             pcfDepth += texture2DArray(stex, vec3(shadow_coord.xy + vec2(x, y)  * searchDistance, shadow_coord.z)).x - shadow_coord.w;
  649.             //pcfDepth += texture2DArray(stex, vec3(shadow_coord.xy + vec2(x, y) * texSize.y * 4.0f * shadow_coord.xy, shadow_coord.z)).x - shadow_coord.w;
  650.             //pcfDepth += texture2DArray(stex, vec3(shadow_coord.xy + vec2(x, y) * texSize.y * 4.0f * shadow_coord.w, shadow_coord.z)).x - shadow_coord.w;
  651.             //pcfDepth += texture2DArray(stex, vec3(shadow_coord.xy + vec2(x, y) * texSize.y * 1.0f, shadow_coord.z)).x - shadow_coord.w;
  652.             loop++;
  653.         }
  654.     }
  655.    
  656.     pcfDepth /= loop;
  657.    
  658.     return pcfDepth * lightSize;
  659.     //return =
  660.     // lol
  661. }
  662.  
  663. // not having parenthesis around the ultra mode samples looks bad thanks to order of operations; the code could probably be put back into (PCSSToggle) ? ((ultraMode) ? (true) : (false)) : ((ultraMode) ? (true) : (false)) form but this looks better
  664. float shadowCoef()
  665. {
  666.     vec4 shadow_coordA = vec4(0.0f, 0.0f, 0.0f, 0.0f);
  667.     vec4 shadow_coordB = vec4(0.0f, 0.0f, 0.0f, 0.0f);
  668.  
  669.     float blend = 0.0f;
  670.  
  671.     calculateShadowCoords(shadow_coordA, shadow_coordB, blend);
  672.  
  673.     float sampleA;
  674.  
  675.     //sampleA = ultraMode ? (poissonSample(shadow_coordA, normalSampleDistance) + poissonSample(shadow_coordA, ambientSampleDistance)) / 2 : poissonSample(shadow_coordA, normalSampleDistance * distanceCalc(shadow_coordA, lightSize));
  676.     //if (PCSSToggle)
  677.         //sampleA = PCSSToggle ? (ultraMode && PCSSToggle ?  :  : (ultraMode && !PCSSToggle ? ( : );
  678.     //if (!PCSSToggle)
  679.         //sampleA = ultraMode ? (poissonSample(shadow_coordA, sampleDistance) + poissonSample(shadow_coordA, sampleDistance * ultraRatio)) / 2 : poissonSample(shadow_coordA, sampleDistance);
  680.     if (PCSSToggle == ultraMode == true)
  681.     {
  682.         sampleA = (poissonSample(shadow_coordA, pow(distanceCalc(shadow_coordA, depthLoopNumber, searchDistance, lightSize), 1)) + poissonSample(shadow_coordA, pow(distanceCalc(shadow_coordA, depthLoopNumber, searchDistance * ultraRatio, lightSize * ultraRatio), 1))) / 2;
  683.     }
  684.     else if (PCSSToggle == true && ultraMode == false)
  685.     {
  686.         sampleA = poissonSample(shadow_coordA, pow(distanceCalc(shadow_coordA, depthLoopNumber, searchDistance, lightSize), 1));
  687.     }
  688.     else if (PCSSToggle == false && ultraMode == true)
  689.     {
  690.         sampleA = (poissonSample(shadow_coordA, sampleDistance) + poissonSample(shadow_coordA, sampleDistance * ultraRatio)) / 2;
  691.     }
  692.     else if (PCSSToggle == ultraMode == false)
  693.     {
  694.         sampleA = poissonSample(shadow_coordA, sampleDistance);
  695.     }
  696.    
  697.     if (blend > 0.0f)
  698.     {
  699.         float sampleB;
  700.  
  701.         //sampleB = ultraMode ? (poissonSample(shadow_coordB, normalSampleDistance) + poissonSample(shadow_coordB, ambientSampleDistance)) / 2 : poissonSample(shadow_coordB, normalSampleDistance * distanceCalc(shadow_coordA, lightSize));
  702.         //sampleB = ultraMode ? (poissonSample(shadow_coordB, normalSampleDistance) + poissonSample(shadow_coordB, ambientSampleDistance)) / 2 : poissonSample(shadow_coordB, distanceCalc(shadow_coordB, depthLoopNumber, lightSize)) * distanceScale;
  703.         //if (PCSSToggle)
  704.         //  sampleB = PCSSToggle ? (ultraMode && PCSSToggle ? (poissonSample(shadow_coordB, pow(distanceCalc(shadow_coordB, depthLoopNumber, searchDistance, lightSize), 1)) + poissonSample(shadow_coordB, pow(distanceCalc(shadow_coordB, depthLoopNumber, searchDistance * ultraRatio, lightSize * ultraRatio), 1)) / 2) : poissonSample(shadow_coordB, pow(distanceCalc(shadow_coordB, depthLoopNumber, searchDistance, lightSize), 1))) : (ultraMode && !PCSSToggle ? (poissonSample(shadow_coordB, sampleDistance) + poissonSample(shadow_coordB, sampleDistance * ultraRatio) / 2) : poissonSample(shadow_coordB, sampleDistance));
  705.         //if (!PCSSToggle)
  706.         if (PCSSToggle == ultraMode == true)
  707.         {
  708.         sampleB = (poissonSample(shadow_coordB, pow(distanceCalc(shadow_coordB, depthLoopNumber, searchDistance, lightSize), 1)) + poissonSample(shadow_coordB, pow(distanceCalc(shadow_coordB, depthLoopNumber, searchDistance * ultraRatio, lightSize * ultraRatio), 1))) / 2;
  709.         }
  710.         else if (PCSSToggle == true && ultraMode == false)
  711.         {
  712.             sampleB = poissonSample(shadow_coordB, pow(distanceCalc(shadow_coordB, depthLoopNumber, searchDistance, lightSize), 1));
  713.         }
  714.         else if (PCSSToggle == false && ultraMode == true)
  715.         {
  716.             sampleB = (poissonSample(shadow_coordB, sampleDistance) + poissonSample(shadow_coordB, sampleDistance * ultraRatio)) / 2;
  717.         }
  718.         else if (PCSSToggle == ultraMode == false)
  719.         {
  720.             sampleB = poissonSample(shadow_coordB, sampleDistance);
  721.         }
  722.    
  723.         return clamp((sampleB * blend) + (sampleA * (1.0f - blend)), 0.0f, 1.0f);
  724.     }
  725.  
  726.     return sampleA;
  727. }
  728.  
  729. void main()
  730. {
  731.    vec4 albedo = vec4(0.0f, 0.0f, 0.0f, 0.0f);
  732.    calculateSurface(gl_Color, albedo);
  733.  
  734.    float occlusionFactor = 0.0f;
  735.    if(NdotL > -0.01f)
  736.    {
  737.       if(shadowSplitCount <= 0)
  738.          occlusionFactor = 1.0f;
  739.       else
  740.          occlusionFactor = shadowCoef();
  741.    }
  742.  
  743.    // Apply lighting and fog.
  744.    vec4 fragColor = vec4(0.0f, 0.0f, 0.0f, 0.0f);
  745.    if(isParticle == 1)
  746.    {
  747.       vec4 texAlbedo = texture2D(tex, texCoord);
  748.  
  749.       vec4 dirLightDirect = (dirLightColor * occlusionFactor) + (dirLightAmbient * occlusionFactor) + (dirShadowColor * (1.0f - occlusionFactor));
  750.       vec4 plt = accumulateParticlePointLights();
  751.  
  752.       vec4 lightTotal = dirLightDirect + plt;
  753.       lightTotal.x = clamp(lightTotal.x, 0.0f, 1.2f);
  754.       lightTotal.y = clamp(lightTotal.y, 0.0f, 1.2f);
  755.       lightTotal.z = clamp(lightTotal.z, 0.0f, 1.2f);
  756.  
  757.       fragColor = texAlbedo * gl_Color * lightTotal;
  758.  
  759.       applyFog(fragColor);
  760.       fragColor.a = texAlbedo.a * gl_Color.a;
  761.    }
  762.    else
  763.    {
  764.         if (shadowOpacity)
  765.             applyLighting(fragColor, albedo, 1 - (1 - occlusionFactor) * occlusionBlend);
  766.         else
  767.             applyLighting(fragColor, albedo, occlusionFactor);
  768.         applyFog(fragColor);
  769.    }
  770.  
  771.    // Uncomment to viz depth in B.
  772.    //fragColor.z = vPos.y * 0.01f;
  773.  
  774.    gl_FragColor = fragColor;
  775.    
  776.    // Uncomment to show shadows only  
  777.    if (debug)
  778.         gl_FragColor = vec4(occlusionFactor, occlusionFactor, occlusionFactor, 1);
  779. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement