{ "connections": [ { "from": "voronoi2_2", "from_port": 0, "to": "math_2", "to_port": 1 }, { "from": "math_2", "from_port": 0, "to": "math_3", "to_port": 0 }, { "from": "radial_gradient", "from_port": 0, "to": "math_3", "to_port": 1 }, { "from": "math_3", "from_port": 0, "to": "sharpen", "to_port": 0 }, { "from": "voronoi2", "from_port": 0, "to": "math_2", "to_port": 0 }, { "from": "sharpen", "from_port": 0, "to": "math", "to_port": 0 }, { "from": "math", "from_port": 0, "to": "tones_step", "to_port": 0 }, { "from": "uniform", "from_port": 0, "to": "blend2", "to_port": 0 }, { "from": "uniform_2", "from_port": 0, "to": "blend2", "to_port": 1 }, { "from": "tones_step_2", "from_port": 0, "to": "blend2", "to_port": 2 }, { "from": "blend2", "from_port": 0, "to": "blend2_2", "to_port": 0 }, { "from": "uniform_3", "from_port": 0, "to": "blend2_2", "to_port": 1 }, { "from": "normal_map2", "from_port": 0, "to": "Material", "to_port": 4 }, { "from": "math_4", "from_port": 0, "to": "normal_map2", "to_port": 0 }, { "from": "tones_step", "from_port": 0, "to": "fast_blur", "to_port": 0 }, { "from": "fast_blur", "from_port": 0, "to": "tones_step_2", "to_port": 0 }, { "from": "fast_blur", "from_port": 0, "to": "math_4", "to_port": 0 }, { "from": "fast_blur", "from_port": 0, "to": "blend2_2", "to_port": 2 }, { "from": "fast_blur", "from_port": 0, "to": "graph_6", "to_port": 0 }, { "from": "blend2_2", "from_port": 0, "to": "blend2_3", "to_port": 0 }, { "from": "graph_6", "from_port": 0, "to": "blend2_3", "to_port": 1 }, { "from": "blend2_3", "from_port": 0, "to": "Material", "to_port": 0 } ], "label": "Graph", "longdesc": "", "name": "511", "node_position": { "x": 0, "y": 0 }, "nodes": [ { "export_paths": { }, "name": "Material", "node_position": { "x": 2029, "y": -92 }, "parameters": { "albedo_color": { "a": 1, "b": 1, "g": 1, "r": 1, "type": "Color" }, "ao": 1, "depth_scale": 0.7, "emission_energy": 0, "flags_transparent": false, "metallic": 0, "normal": 1, "roughness": 1, "size": 11, "sss": 0 }, "seed_int": 0, "type": "material" }, { "name": "voronoi2", "node_position": { "x": -2174, "y": 335 }, "parameters": { "intensity": 1, "randomness": 0.85, "scale_x": 8, "scale_y": 8, "stretch_x": 1, "stretch_y": 1 }, "seed_int": 1884072448, "type": "voronoi2" }, { "name": "voronoi2_2", "node_position": { "x": -2185.340332, "y": 576.901062 }, "parameters": { "intensity": 1, "randomness": 1, "scale_x": 6, "scale_y": 6, "stretch_x": 1, "stretch_y": 1 }, "seed_int": 190614896, "type": "voronoi2" }, { "name": "math_2", "node_position": { "x": -1422.340332, "y": 488.901062 }, "parameters": { "clamp": false, "default_in1": 0, "default_in2": 0, "op": 2 }, "seed_int": 0, "type": "math" }, { "name": "sharpen", "node_position": { "x": -292.340332, "y": 358.901062 }, "parameters": { "size": 5 }, "seed_int": 0, "type": "sharpen" }, { "name": "radial_gradient", "node_position": { "x": -888.340332, "y": 141.901062 }, "parameters": { "gradient": { "interpolation": 1, "points": [ { "a": 1, "b": 1, "g": 1, "pos": 0.400481, "r": 1 }, { "a": 1, "b": 0, "g": 0, "pos": 0.718311, "r": 0 } ], "type": "Gradient" }, "repeat": 1 }, "seed_int": 0, "type": "radial_gradient" }, { "name": "math_3", "node_position": { "x": -582.340332, "y": 299.901062 }, "parameters": { "clamp": true, "default_in1": 0, "default_in2": 3, "op": 2 }, "seed_int": 0, "type": "math" }, { "name": "tones_step", "node_position": { "x": 141.659668, "y": 136.901062 }, "parameters": { "invert": false, "value": 0.15, "width": 0.28 }, "seed_int": 0, "type": "tones_step" }, { "name": "math", "node_position": { "x": -133.678223, "y": 139.390686 }, "parameters": { "clamp": false, "default_in1": 0, "default_in2": 2, "op": 6 }, "seed_int": 0, "type": "math" }, { "generic_size": 1, "name": "blend2", "node_position": { "x": 877.70166, "y": -140.297119 }, "parameters": { "amount1": 0.71, "blend_type1": 0 }, "seed_int": 0, "type": "blend2" }, { "name": "uniform", "node_position": { "x": 526.70166, "y": -241.297119 }, "parameters": { "color": { "a": 0, "b": 0.239216, "g": 0.239216, "r": 0.239216, "type": "Color" } }, "seed_int": 0, "type": "uniform" }, { "name": "uniform_2", "node_position": { "x": 521.20166, "y": -148.297119 }, "parameters": { "color": { "a": 1, "b": 0.183594, "g": 0.183594, "r": 0.183594, "type": "Color" } }, "seed_int": 0, "type": "uniform" }, { "name": "uniform_3", "node_position": { "x": 949.20166, "y": 86.702881 }, "parameters": { "color": { "a": 1, "b": 0.042969, "g": 0.042969, "r": 0.042969, "type": "Color" } }, "seed_int": 0, "type": "uniform" }, { "name": "tones_step_2", "node_position": { "x": 481.70166, "y": -53.29715 }, "parameters": { "invert": false, "value": 0.15, "width": 0.28 }, "seed_int": 0, "type": "tones_step" }, { "name": "normal_map2", "node_position": { "x": 1555.70166, "y": 264.702881 }, "parameters": { "buffer": 1, "param2": 0, "size": 11, "strength": -1 }, "seed_int": 0, "type": "normal_map2" }, { "generic_size": 1, "name": "blend2_2", "node_position": { "x": 1227.70166, "y": 97.702881 }, "parameters": { "amount1": 1, "blend_type1": 0 }, "seed_int": 0, "type": "blend2" }, { "name": "math_4", "node_position": { "x": 999.70166, "y": 342.702881 }, "parameters": { "clamp": false, "default_in1": 0, "default_in2": 0.9, "op": 6 }, "seed_int": 0, "type": "math" }, { "name": "fast_blur", "node_position": { "x": 393.70166, "y": 333.702881 }, "parameters": { "param0": 11, "param1": 4, "param2": 1, "param3": 1 }, "seed_int": 0, "type": "fast_blur" }, { "connections": [ { "from": "voronoi_3", "from_port": 0, "to": "buffer_5", "to_port": 0 }, { "from": "voronoi_2", "from_port": 0, "to": "buffer_7", "to_port": 0 }, { "from": "buffer_7", "from_port": 0, "to": "gen_outputs", "to_port": 0 }, { "from": "gen_inputs", "from_port": 0, "to": "buffer_2", "to_port": 0 }, { "from": "buffer_2", "from_port": 0, "to": "voronoi_3", "to_port": 0 }, { "from": "buffer_5", "from_port": 0, "to": "voronoi_2", "to_port": 0 } ], "label": "HBAO", "longdesc": "", "name": "graph_6", "node_position": { "x": 1400.70166, "y": -410.297119 }, "nodes": [ { "name": "voronoi_3", "node_position": { "x": -600.80072, "y": -894.601807 }, "parameters": { "angleBiasDeg": 15, "depth_scale": 0.08, "intensity": 2, "quality": 4, "radius": 0.1 }, "seed": 49449, "shader_model": { "code": "", "global": "", "inputs": [ { "default": "0.0", "function": true, "label": "", "name": "in", "type": "f" } ], "instance": "//inspired by:\n//http://developer.download.nvidia.com/presentations/2008/SIGGRAPH/HBAO_SIG08b.pdf\n//https://gist.github.com/dotModded/981206ae1f4e760b7348\n//https://github.com/scanberg/hbao/blob/master/resources/shaders/hbao_full_frag.glsl\n//radius - radius of influence in screen space\n//angleBiasDeg - ~minimum angle for AO\n//intensity - increase strength of caclulated AO\n//noiseScale - for randomization values\nfloat $(name)_hbao(vec2 uv, float radius, float angleBiasDeg, float intensity, vec2 noiseScale) {\n int samplig_directions = 8;\n int steps = int($quality);\n\n float angleBias = 0.0174532925 * angleBiasDeg;\n\n vec3 c_point = vec3(uv*2.0 - 1.0, $in(uv)*$depth_scale);\n //fun with dfdx & dfdy - https://community.khronos.org/t/getting-the-normal-with-dfdx-and-dfdy/70177\n vec3 c_normal = normalize(cross(dFdx(c_point), dFdy(c_point)));\n\n\n float cosMaxRot = cos(6.28318530718 / float(samplig_directions));\n float sinMaxROt = sin(6.28318530718 / float(samplig_directions));\n \n // it should be faster than standard rotation in each iteartion\n mat2 deltaRotationMatrix = mat2(\n\tvec2(cosMaxRot, -sinMaxROt),\n\tvec2(sinMaxROt, cosMaxRot)\n );\n \n // calculate starting offset, as the smallest step\n vec2 offset_uv = vec2(1.0, 0.0) * (radius /float(steps));\n\n //randomize angle\n vec3 sampleNoise\t= rand3(uv * noiseScale);\n sampleNoise.xy\t = sampleNoise.xy * 2.0 - vec2(1.0);\n mat2 rotationMatrix = mat2(vec2(sampleNoise.x, -sampleNoise.y), \n\t\t\t\t\t\t\t vec2(sampleNoise.y, sampleNoise.x));\n \n // apply a random rotation to the base step vector\n offset_uv = rotationMatrix * offset_uv;\n \n float jitter = sampleNoise.z;\n float occlusion = 0.0;\n \n for (int i = 0; i < samplig_directions; ++i) {\n\t// incrementally rotate sample direction\n\toffset_uv = deltaRotationMatrix * offset_uv;\n\tfloat oldAngle = angleBias;\n\tfor (int j = 0; j < steps; ++j) {\n\t //add jitter & distance to offset UV\n\t vec2 sample_uv\t = uv + (jitter + float(j)) * offset_uv;\n\t vec3 s_point\t = vec3(sample_uv*2.0 - 1.0, $in(sample_uv)*$depth_scale);\n\t vec3 sample_tan = (s_point - c_point); //not sure if correct, but looks ok\n\t // 90 deg - (angle between normal from current point & sampled tangent)\n\t //https://math.stackexchange.com/questions/654315/how-to-convert-a-dot-product-of-two-vectors-to-the-angle-between-the-vectors\n\t float gamma = 1.57079632679 - acos(dot(c_normal, normalize(sample_tan)));\n\t \n\t if (gamma > oldAngle) {\n\t\tfloat value = sin(gamma) - sin(oldAngle);\n\t\tfloat attenuation = clamp(1.0 - pow(length(sample_tan.xy)/radius, 2.0), 0.0, 1.0);\n\t\tocclusion += attenuation * value;\n\t\t//occlusion += value;\n\t\toldAngle = gamma;\n\t }\n\t}\n }\n \n occlusion = 1.0 - occlusion / float(samplig_directions);\n return clamp(pow(occlusion, 1.0 + intensity), 0.0, 1.0);\n}", "longdesc": "A node that generates several images from a tileable voronoi noise", "name": "HBAO", "outputs": [ { "f": "$(name)_hbao($uv,$radius, $angleBiasDeg, $intensity, vec2(16.0,16.0))", "longdesc": "A color pattern that assigns a random color to each cell", "shortdesc": "Random color", "type": "f" } ], "parameters": [ { "control": "None", "default": 0.01, "label": "Radius", "longdesc": "The scale along the X axis", "max": 1, "min": 0, "name": "radius", "shortdesc": "Scale.x", "step": 0.01, "type": "float" }, { "control": "None", "default": 30, "label": "Angle Bias", "longdesc": "Angle bias for AO", "max": 90, "min": 0, "name": "angleBiasDeg", "shortdesc": "Angle Bias", "step": 1, "type": "float" }, { "control": "None", "default": 0.2, "label": "Intensity", "longdesc": "Change intensity of AO", "max": 5, "min": 0, "name": "intensity", "shortdesc": "Intensity", "step": 0.01, "type": "float" }, { "control": "None", "default": 1, "label": "Depth Scale", "longdesc": "Lineary scales depth values afecting cacluated normals & tangents", "max": 1, "min": 0, "name": "depth_scale", "shortdesc": "Depth Scale", "step": 0.01, "type": "float" }, { "control": "None", "default": 4, "label": "Steps", "longdesc": "Steps in given direction per ray", "max": 12, "min": 1, "name": "quality", "shortdesc": "Quality", "step": 1, "type": "float" } ], "shortdesc": "Voronoi Noise" }, "type": "shader" }, { "name": "gen_inputs", "node_position": { "x": -1338.030762, "y": -788.080872 }, "parameters": { }, "ports": [ { "group_size": 0, "longdesc": "Greyscale heightmap", "name": "input", "shortdesc": "Input", "type": "f" } ], "seed": 43798, "type": "ios" }, { "name": "gen_outputs", "node_position": { "x": -902.684204, "y": -327.282288 }, "parameters": { }, "ports": [ { "group_size": 0, "longdesc": "", "name": "port0", "shortdesc": "AO", "type": "f" } ], "seed": 42623, "type": "ios" }, { "name": "gen_parameters", "node_position": { "x": -1488.979004, "y": -561.71167 }, "parameters": { "param0": 10, "param1": 0.1, "param2": 15, "param3": 0.08, "param4": 4, "param5": 2 }, "seed": 58911, "type": "remote", "widgets": [ { "label": "Size", "linked_widgets": [ { "node": "voronoi_2", "widget": "size" }, { "node": "buffer_2", "widget": "size" }, { "node": "buffer_5", "widget": "size" }, { "node": "buffer_7", "widget": "size" } ], "name": "param0", "shortdesc": "Size", "type": "linked_control" }, { "label": "Radius", "linked_widgets": [ { "node": "voronoi_3", "widget": "radius" } ], "longdesc": "Affected radius of point in UV size", "name": "param1", "shortdesc": "Radius", "type": "linked_control" }, { "label": "Angle Bias", "linked_widgets": [ { "node": "voronoi_3", "widget": "angleBiasDeg" } ], "longdesc": "Minimum angle on heightmap for AO to occur. Angle is calculated in UV space, where depth (grayscale input) is scaled by \"Depth Scale\" parameter", "name": "param2", "shortdesc": "Angle bias", "type": "linked_control" }, { "label": "Depth Scale", "linked_widgets": [ { "node": "voronoi_3", "widget": "depth_scale" } ], "longdesc": "Lineary scales depth values afecting cacluated normals & tangents", "name": "param3", "shortdesc": "Depth Scale", "type": "linked_control" }, { "label": "Quality", "linked_widgets": [ { "node": "voronoi_3", "widget": "quality" } ], "longdesc": "Number of steps per direction sampling", "name": "param4", "shortdesc": "Quality", "type": "linked_control" }, { "label": "Intensity", "linked_widgets": [ { "node": "voronoi_3", "widget": "intensity" } ], "longdesc": "Change intensity of calculated AO", "name": "param5", "shortdesc": "Intensity", "type": "linked_control" } ] }, { "name": "voronoi_2", "node_position": { "x": -710.111145, "y": -596.459534 }, "parameters": { "ksigma": 4, "sigma": 3, "size": 10, "threshold": 0.7 }, "seed": 38722, "shader_model": { "code": "", "global": "", "inputs": [ { "default": "0.0", "function": true, "label": "", "name": "in", "type": "rgba" } ], "instance": "//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n// Copyright (c) 2018-2019 Michele Morrone\n// All rights reserved.\n//\n// https://michelemorrone.eu - https://BrutPitt.com\n//\n// me@michelemorrone.eu - brutpitt@gmail.com\n// twitter: @BrutPitt - github: BrutPitt\n// \n// https://github.com/BrutPitt/glslSmartDeNoise/\n//\n// This software is distributed under the terms of the BSD 2-Clause license\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n// smartDeNoise - parameters\n//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n//\n// sampler2D tex\t - sampler image / texture\n// vec2 uv\t\t - actual fragment coord\n// float sigma > 0 - sigma Standard Deviation\n// float kSigma >= 0 - sigma coefficient \n//\t kSigma * sigma --> radius of the circular kernel\n// float threshold - edge sharpening threshold \nvec4 $(name)_smartDeNoise(vec2 uv, float sigma, float kSigma, float threshold)\n{\n\tfloat INV_SQRT_OF_2PI = 0.39894228040143267793994605993439; // 1.0/SQRT_OF_2PI\n\tfloat INV_PI = 0.31830988618379067153776752674503;\n\tfloat radius = round(kSigma*sigma);\n\tfloat radQ = radius * radius;\n\n\tfloat invSigmaQx2 = .5 / (sigma * sigma);\t // 1.0 / (sigma^2 * 2.0)\n\tfloat invSigmaQx2PI = INV_PI * invSigmaQx2;\t// 1/(2 * PI * sigma^2)\n\n\tfloat invThresholdSqx2 = .5 / (threshold * threshold);\t // 1.0 / (sigma^2 * 2.0)\n\tfloat invThresholdSqrt2PI = INV_SQRT_OF_2PI / threshold; // 1.0 / (sqrt(2*PI) * sigma^2)\n\n\tvec4 centrPx = $in(uv); \n\n\tfloat zBuff = 0.0;\n\tvec4 aBuff = vec4(0.0);\n\tvec2 size = vec2($size, $size);\n\n\tvec2 d;\n\tfor (d.x=-radius; d.x <= radius; d.x++) {\n\t\tfloat pt = sqrt(radQ-d.x*d.x);\t // pt = yRadius: have circular trend\n\t\tfor (d.y=-pt; d.y <= pt; d.y++) {\n\t\t\tfloat blurFactor = exp( -dot(d , d) * invSigmaQx2 ) * invSigmaQx2PI;\n\n\t\t\tvec4 walkPx = $in(uv+d/size);\n\t\t\tvec4 dC = walkPx-centrPx;\n\t\t\tfloat deltaFactor = exp( -dot(dC, dC) * invThresholdSqx2) * invThresholdSqrt2PI * blurFactor;\n\n\t\t\tzBuff += deltaFactor;\n\t\t\taBuff += deltaFactor*walkPx;\n\t\t}\n\t}\n\treturn aBuff/zBuff;\n}", "longdesc": "A node that generates several images from a tileable voronoi noise", "name": "Denoiser", "outputs": [ { "longdesc": "A color pattern that assigns a random color to each cell", "rgba": "$(name)_smartDeNoise($uv, $sigma, $ksigma, $threshold)", "shortdesc": "Random color", "type": "rgba" } ], "parameters": [ { "default": 10, "first": 0, "label": "size", "last": 12, "longdesc": "The scale along the X axis", "name": "size", "shortdesc": "Scale.x", "type": "size" }, { "control": "None", "default": 0.5, "label": "Sigma", "max": 1, "min": 0.005, "name": "sigma", "step": 0.1, "type": "float" }, { "control": "None", "default": 0.5, "label": "kSigma", "max": 1, "min": 0, "name": "ksigma", "step": 0.1, "type": "float" }, { "control": "None", "default": 0.5, "label": "threshold", "max": 1, "min": 0, "name": "threshold", "step": 0.1, "type": "float" } ], "shortdesc": "Voronoi Noise" }, "type": "shader" }, { "name": "buffer_5", "node_position": { "x": -931.449646, "y": -724.330017 }, "parameters": { "size": 10 }, "seed": 6771, "type": "buffer", "version": 1 }, { "name": "buffer_7", "node_position": { "x": -948.36377, "y": -449.796295 }, "parameters": { "size": 10 }, "seed": 16139, "type": "buffer", "version": 1 }, { "name": "buffer_2", "node_position": { "x": -976.009644, "y": -975.5 }, "parameters": { "size": 10 }, "seed": 42465, "type": "buffer", "version": 1 } ], "parameters": { "param0": 10, "param1": 0.1, "param2": 15, "param3": 0.08, "param4": 4, "param5": 2 }, "seed": 6741, "shortdesc": "", "type": "graph" }, { "generic_size": 1, "name": "blend2_3", "node_position": { "x": 1737.70166, "y": -221.297119 }, "parameters": { "amount1": 1, "blend_type1": 2 }, "seed_int": 0, "type": "blend2" } ], "parameters": { }, "seed_int": 0, "shortdesc": "", "type": "graph" }