@polygonjs/polygonjs
Version:
node-based WebGL 3D engine https://polygonjs.com
2 lines (1 loc) • 1.63 kB
JavaScript
export default "/*\n * Code taken from this demo: https://n8python.github.io/goodGodRays/\n * By: https://github.com/n8python\n *\n * With cleanup and minor changes\n */\n\n#include <common>\n\nuniform sampler2D godrays;\nuniform sampler2D sceneDiffuse;\nuniform sampler2D sceneDepth;\nuniform float edgeStrength;\nuniform float edgeRadius;\nuniform vec2 resolution;\nuniform float near;\nuniform float far;\nuniform vec3 color;\nvarying vec2 vUv;\n\n#define DITHERING\n#include <dithering_pars_fragment>\n\nfloat linearize_depth (float d, float zNear, float zFar) {\n return zNear * zFar / (zFar + d * (zNear - zFar));\n}\n\nvoid main() {\n vec4 diffuse = texture2D(sceneDiffuse, vUv);\n\n float rawDepth = texture2D(sceneDepth, vUv).x;\n float correctDepth = linearize_depth(rawDepth, near, far);\n\n vec2 pushDir = vec2(0.0);\n float count = 0.0;\n for (float x = -edgeRadius; x <= edgeRadius; x++) {\n for (float y = -edgeRadius; y <= edgeRadius; y++) {\n vec2 sampleUv = (vUv * resolution + vec2(x, y)) / resolution;\n float sampleDepth = linearize_depth(texture2D(sceneDepth, sampleUv).x, near, far);\n if (abs(sampleDepth - correctDepth) < 0.05 * correctDepth) {\n pushDir += vec2(x, y);\n count += 1.0;\n }\n }\n }\n\n if (count == 0.0) {\n count = 1.0;\n }\n\n pushDir /= count;\n pushDir = normalize(pushDir);\n vec2 sampleUv = length(pushDir) > 0.0 ? vUv + edgeStrength * (pushDir / resolution) : vUv;\n float bestChoice = texture2D(godrays, sampleUv).x;\n\n gl_FragColor = vec4(mix(diffuse.rgb, color, bestChoice), 1.0);\n\n #include <dithering_fragment>\n}\n";