From cbb7c103df3bb235c0219bda01c467102608b095 Mon Sep 17 00:00:00 2001 From: LMW Date: Fri, 31 Jul 2026 00:10:33 +0800 Subject: [PATCH] Added Gaussian Blur HQ by Wojtekpil --- .../material_maker/nodes/gaussian_blur_hq.mmg | 396 ++++++++++++++++++ .../nodes/gaussian_blur_x_hq.mmg | 96 +++++ .../nodes/gaussian_blur_y_hq.mmg | 97 +++++ .../doc/images/node_filter_blur_hq.png | Bin 0 -> 22159 bytes material_maker/doc/node_filter_blur_hq.rst | 46 ++ material_maker/library/base.json | 13 + 6 files changed, 648 insertions(+) create mode 100644 addons/material_maker/nodes/gaussian_blur_hq.mmg create mode 100644 addons/material_maker/nodes/gaussian_blur_x_hq.mmg create mode 100644 addons/material_maker/nodes/gaussian_blur_y_hq.mmg create mode 100644 material_maker/doc/images/node_filter_blur_hq.png create mode 100644 material_maker/doc/node_filter_blur_hq.rst diff --git a/addons/material_maker/nodes/gaussian_blur_hq.mmg b/addons/material_maker/nodes/gaussian_blur_hq.mmg new file mode 100644 index 000000000..f82b1ca6e --- /dev/null +++ b/addons/material_maker/nodes/gaussian_blur_hq.mmg @@ -0,0 +1,396 @@ +{ + "connections": [ + { + "from": "switch", + "from_port": 0, + "to": "switch_2", + "to_port": 1 + }, + { + "from": "gen_inputs", + "from_port": 0, + "to": "switch", + "to_port": 1 + }, + { + "from": "gen_inputs", + "from_port": 0, + "to": "buffer_4", + "to_port": 0 + }, + { + "from": "switch_2", + "from_port": 0, + "to": "buffer_5", + "to_port": 0 + }, + { + "from": "buffer_5", + "from_port": 0, + "to": "gen_outputs", + "to_port": 0 + }, + { + "from": "switch", + "from_port": 0, + "to": "buffer_3", + "to_port": 0 + }, + { + "from": "buffer_4", + "from_port": 0, + "to": "gaussian_blur_x_hq", + "to_port": 0 + }, + { + "from": "gen_inputs", + "from_port": 1, + "to": "gaussian_blur_x_hq", + "to_port": 1 + }, + { + "from": "gaussian_blur_x_hq", + "from_port": 0, + "to": "switch", + "to_port": 0 + }, + { + "from": "buffer_3", + "from_port": 0, + "to": "gaussian_blur_y_hq", + "to_port": 0 + }, + { + "from": "gen_inputs", + "from_port": 1, + "to": "gaussian_blur_y_hq", + "to_port": 1 + }, + { + "from": "gaussian_blur_y_hq", + "from_port": 0, + "to": "switch_2", + "to_port": 0 + } + ], + "label": "Gaussian Blur HQ", + "longdesc": "Applys a gaussian blur on its input", + "name": "gaussian_blur_hq", + "node_position": { + "x": 0, + "y": 0 + }, + "nodes": [ + { + "name": "switch", + "node_position": { + "x": -529.452392578125, + "y": -15.1666555404663 + }, + "parameters": { + "choices": 2.0, + "outputs": 1.0, + "source": 0.0 + }, + "seed": 20224.0, + "type": "switch" + }, + { + "name": "switch_2", + "node_position": { + "x": -226.452392578125, + "y": 9.33334445953369 + }, + "parameters": { + "choices": 2.0, + "outputs": 1.0, + "source": 0.0 + }, + "seed": -31061.0, + "type": "switch" + }, + { + "name": "gen_parameters", + "node_position": { + "x": -540.0, + "y": -680.0 + }, + "parameters": { + "param0": 9.0, + "param1": 0.2, + "param2": 0.0, + "param3": false, + "param4": 100.0 + }, + "seed": 10501.0, + "type": "remote", + "widgets": [ + { + "label": "Grid size:", + "linked_widgets": [ + { + "node": "buffer_4", + "widget": "size" + }, + { + "node": "gaussian_blur_x_hq", + "widget": "size" + }, + { + "node": "gaussian_blur_y_hq", + "widget": "size" + } + ], + "longdesc": "The resolution of the input image", + "name": "param0", + "shortdesc": "Size", + "type": "linked_control" + }, + { + "label": "Sigma:", + "linked_widgets": [ + { + "node": "gaussian_blur_x_hq", + "widget": "sigma" + }, + { + "node": "gaussian_blur_y_hq", + "widget": "sigma" + } + ], + "longdesc": "The strength of the blur filter", + "name": "param1", + "shortdesc": "Sigma", + "type": "linked_control" + }, + { + "configurations": { + "Both": [ + { + "node": "switch", + "value": 0.0, + "widget": "source" + }, + { + "node": "switch_2", + "value": 0.0, + "widget": "source" + } + ], + "X": [ + { + "node": "switch", + "value": 0.0, + "widget": "source" + }, + { + "node": "switch_2", + "value": 1.0, + "widget": "source" + } + ], + "Y": [ + { + "node": "switch", + "value": 1.0, + "widget": "source" + }, + { + "node": "switch_2", + "value": 0.0, + "widget": "source" + } + ] + }, + "label": "Direction:", + "linked_widgets": [ + { + "node": "switch", + "widget": "source" + }, + { + "node": "switch_2", + "widget": "source" + } + ], + "longdesc": "Apply the blur filter horizontally, vertically or in both directions", + "name": "param2", + "shortdesc": "Direction", + "type": "config_control" + }, + { + "label": "Quality [%]", + "linked_widgets": [ + { + "node": "gaussian_blur_x_hq", + "widget": "quality" + }, + { + "node": "gaussian_blur_y_hq", + "widget": "quality" + } + ], + "name": "param4", + "type": "linked_control" + }, + { + "label": "32 Bits", + "linked_widgets": [ + { + "node": "buffer_4", + "widget": "f32" + }, + { + "node": "buffer_5", + "widget": "f32" + }, + { + "node": "buffer_3", + "widget": "f32" + } + ], + "longdesc": "Use 32-bit buffers when storing input/outputs. Reduces banding artifacts but could result in higher video memory usage.", + "name": "param3", + "shortdesc": "32 Bits", + "type": "linked_control" + } + ] + }, + { + "name": "gen_inputs", + "node_position": { + "x": -895.666625976562, + "y": -194.392852783203 + }, + "parameters": {}, + "ports": [ + { + "group_size": 0.0, + "longdesc": "The input image", + "name": "input", + "shortdesc": "Input", + "type": "rgba" + }, + { + "group_size": 0.0, + "longdesc": "A map that controls the strength of the blur filter", + "name": "amount", + "shortdesc": "Strength map", + "type": "f" + } + ], + "seed": 52641.0, + "type": "ios" + }, + { + "name": "gen_outputs", + "node_position": { + "x": 193.547607421875, + "y": -135.392852783203 + }, + "parameters": {}, + "ports": [ + { + "group_size": 0.0, + "longdesc": "Shows the generated blurred image", + "name": "port0", + "shortdesc": "Output", + "type": "rgba" + } + ], + "seed": 77778.0, + "seed_locked": true, + "type": "ios" + }, + { + "name": "buffer_4", + "node_position": { + "x": -400.0, + "y": -440.0 + }, + "parameters": { + "f32": false, + "filter": false, + "mipmap": false, + "size": 9.0 + }, + "seed_int": 0, + "type": "buffer", + "version": 2 + }, + { + "name": "buffer_5", + "node_position": { + "x": -60.0, + "y": 0.0 + }, + "parameters": { + "f32": false, + "filter": false, + "mipmap": false, + "size": 11.0 + }, + "seed_int": 0, + "type": "buffer", + "version": 2 + }, + { + "name": "buffer_3", + "node_position": { + "x": -620.0, + "y": 120.0 + }, + "parameters": { + "f32": false, + "filter": false, + "mipmap": false, + "size": 11.0 + }, + "seed_int": 0, + "type": "buffer", + "version": 2 + }, + { + "name": "gaussian_blur_x_hq", + "node_position": { + "x": -420.04296875, + "y": -171.733642578125 + }, + "parameters": { + "quality": 100.0, + "sigma": 0.2, + "size": 9.0 + }, + "seed_int": 0, + "type": "gaussian_blur_x_hq" + }, + { + "name": "gaussian_blur_y_hq", + "node_position": { + "x": -372.440856933594, + "y": 137.266357421875 + }, + "parameters": { + "quality": 100.0, + "sigma": 0.2, + "size": 9.0 + }, + "seed_int": 0, + "type": "gaussian_blur_y_hq" + } + ], + "parameters": { + "param0": 9.0, + "param1": 0.2, + "param2": 0.0, + "param3": false, + "param4": 100.0 + }, + "scroll_offset": { + "x": -674.78515625, + "y": -797.727294921875 + }, + "seed_int": 0, + "shortdesc": "Gaussian Blur HQ", + "type": "graph" +} diff --git a/addons/material_maker/nodes/gaussian_blur_x_hq.mmg b/addons/material_maker/nodes/gaussian_blur_x_hq.mmg new file mode 100644 index 000000000..e3be72cf0 --- /dev/null +++ b/addons/material_maker/nodes/gaussian_blur_x_hq.mmg @@ -0,0 +1,96 @@ +{ + "name": "gaussian_blur_x_hq", + "node_position": { + "x": 0, + "y": 0 + }, + "parameters": { + "quality": 100.0, + "sigma": 0.2, + "size": 11.0 + }, + "seed": 4629.0, + "shader_model": { + "code": "", + "global": "", + "inputs": [ + { + "default": "vec4(1.0)", + "function": true, + "label": "", + "name": "in", + "type": "rgba" + }, + { + "default": "1.0", + "function": true, + "label": "", + "name": "amount", + "type": "f" + } + ], + "instance": [ + "vec4 $(name)_fct(vec2 uv) {", + "\tfloat e = 1.0/$size;", + "\t//range based on 68–95–99.7 rule", + "\tfloat scaled_sigma = $sigma /10.0;", + "\tfloat sampling_range = scaled_sigma*3.0;", + "\tvec4 rv = vec4(0.0);", + "\tfloat sum = 0.0;", + "\tfloat sigma = max(0.000015, scaled_sigma*$amount(uv));", + "\tfloat mapped_quality = 1.0 + ($quality - 1.0) * ($size - 1.0) / (100.0 - 1.0);", + "\t", + "\tfloat step_size = max(e,1.0/mapped_quality);", + "\t//maxium number of loop iterations = 1024", + "\tstep_size = max(sampling_range*2.0/1024.0,step_size);", + "\tstep_size -= mod(step_size, e);", + "\tfloat coef_diff = 6.28318530718*sigma*sigma;", + "\tfor (float i = -sampling_range; i <= sampling_range; i += step_size) {", + "\t\tfloat i_sigma = i/sigma;", + "\t\tfloat coef = exp(-0.5*i_sigma*i_sigma)/coef_diff;", + "\t\trv += $in(uv+vec2(i, 0.0))*coef;", + "\t\tsum += coef;", + "\t}", + "\treturn rv/sum;", + "}" + ], + "name": "gaussian_blur_x_hq", + "outputs": [ + { + "rgba": "$(name)_fct($uv)", + "type": "rgba" + } + ], + "parameters": [ + { + "default": 9, + "first": 4, + "label": "Size", + "last": 12, + "name": "size", + "type": "size" + }, + { + "control": "None", + "default": 0.5, + "label": "Sigma", + "max": 2.0, + "min": 0.0, + "name": "sigma", + "step": 0.01, + "type": "float" + }, + { + "control": "None", + "default": 50.0, + "label": "Quality", + "max": 100.0, + "min": 1.0, + "name": "quality", + "step": 1.0, + "type": "float" + } + ] + }, + "type": "shader" +} \ No newline at end of file diff --git a/addons/material_maker/nodes/gaussian_blur_y_hq.mmg b/addons/material_maker/nodes/gaussian_blur_y_hq.mmg new file mode 100644 index 000000000..fd679ed9a --- /dev/null +++ b/addons/material_maker/nodes/gaussian_blur_y_hq.mmg @@ -0,0 +1,97 @@ +{ + "name": "gaussian_blur_y_hq", + "node_position": { + "x": 0, + "y": 0 + }, + "parameters": { + "quality": 100.0, + "sigma": 0.2, + "size": 11.0 + }, + "seed": 12279.0, + "seed_locked": true, + "shader_model": { + "code": "", + "global": "", + "inputs": [ + { + "default": "vec4(1.0)", + "function": true, + "label": "", + "name": "in", + "type": "rgba" + }, + { + "default": "1.0", + "function": true, + "label": "", + "name": "amount", + "type": "f" + } + ], + "instance": [ + "vec4 $(name)_fct(vec2 uv) {", + "\tfloat e = 1.0/$size;", + "\tfloat scaled_sigma = $sigma/10.0;", + "\t//range based on 68–95–99.7 rule", + "\tfloat sampling_range = scaled_sigma*3.0;", + "\tvec4 rv = vec4(0.0);", + "\tfloat sum = 0.0;", + "\tfloat sigma = max(0.000015, scaled_sigma*$amount(uv));", + "\tfloat mapped_quality = 1.0 + ($quality - 1.0) * ($size - 1.0) / (100.0 - 1.0);", + "\t", + "\tfloat step_size = max(e,1.0/mapped_quality);", + "\t//maxium number of loop iterations = 1024", + "\tstep_size = max(sampling_range*2.0/1024.0,step_size);", + "\tstep_size -= mod(step_size, e);", + "\tfloat coef_diff = 6.28318530718*sigma*sigma;", + "\tfor (float i = -sampling_range; i <= sampling_range; i += step_size) {", + "\t\tfloat i_sigma = i/sigma;", + "\t\tfloat coef = exp(-0.5*i_sigma*i_sigma)/coef_diff;", + "\t\trv += $in(uv+vec2(0.0, i))*coef;", + "\t\tsum += coef;", + "\t}", + "\treturn rv/sum;", + "}" + ], + "name": "gaussian_blur_y_hq", + "outputs": [ + { + "rgba": "$(name)_fct($uv)", + "type": "rgba" + } + ], + "parameters": [ + { + "default": 9, + "first": 4, + "label": "Size", + "last": 12, + "name": "size", + "type": "size" + }, + { + "control": "None", + "default": 0.5, + "label": "Sigma", + "max": 2.0, + "min": 0.0, + "name": "sigma", + "step": 0.01, + "type": "float" + }, + { + "control": "None", + "default": 0.5, + "label": "Quality", + "max": 100.0, + "min": 1.0, + "name": "quality", + "step": 1.0, + "type": "float" + } + ] + }, + "type": "shader" +} \ No newline at end of file diff --git a/material_maker/doc/images/node_filter_blur_hq.png b/material_maker/doc/images/node_filter_blur_hq.png new file mode 100644 index 0000000000000000000000000000000000000000..3b4480ec6f011b5003a4738a5a45a04754d75ac9 GIT binary patch literal 22159 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 WYDuU68IxxK0000