ComfyUI/blueprints/Glow.json
Terry Jia 50076f3439
format blueprint (#13315)
Co-authored-by: guill <jacob.e.segal@gmail.com>
2026-04-06 23:33:55 -04:00

583 lines
17 KiB
JSON

{
"revision": 0,
"last_node_id": 37,
"last_link_id": 0,
"nodes": [
{
"id": 37,
"type": "0a99445a-aaf8-4a7f-aec3-d7d710ae1495",
"pos": [
2160,
-360
],
"size": [
260,
154
],
"flags": {},
"order": 4,
"mode": 0,
"inputs": [
{
"label": "image",
"localized_name": "images.image0",
"name": "images.image0",
"type": "IMAGE",
"link": null
}
],
"outputs": [
{
"label": "IMAGE",
"localized_name": "IMAGE0",
"name": "IMAGE0",
"type": "IMAGE",
"links": []
}
],
"properties": {
"proxyWidgets": [
[
"34",
"value"
],
[
"35",
"value"
],
[
"33",
"value"
],
[
"31",
"choice"
],
[
"32",
"color"
]
]
},
"widgets_values": [],
"title": "Glow"
}
],
"links": [],
"version": 0.4,
"definitions": {
"subgraphs": [
{
"id": "0a99445a-aaf8-4a7f-aec3-d7d710ae1495",
"version": 1,
"state": {
"lastGroupId": 0,
"lastNodeId": 36,
"lastLinkId": 53,
"lastRerouteId": 0
},
"revision": 0,
"config": {},
"name": "Glow",
"inputNode": {
"id": -10,
"bounding": [
2110,
-165,
120,
60
]
},
"outputNode": {
"id": -20,
"bounding": [
3170,
-165,
120,
60
]
},
"inputs": [
{
"id": "ffc7cf94-be90-4d56-a3b8-d0514d61c015",
"name": "images.image0",
"type": "IMAGE",
"linkIds": [
45
],
"localized_name": "images.image0",
"label": "image",
"pos": [
2210,
-145
]
}
],
"outputs": [
{
"id": "04986101-50be-4762-8957-8e2a5e460bbb",
"name": "IMAGE0",
"type": "IMAGE",
"linkIds": [
53
],
"localized_name": "IMAGE0",
"label": "IMAGE",
"pos": [
3190,
-145
]
}
],
"widgets": [],
"nodes": [
{
"id": 30,
"type": "GLSLShader",
"pos": [
2590,
-520
],
"size": [
520,
272
],
"flags": {},
"order": 5,
"mode": 0,
"inputs": [
{
"label": "image0",
"localized_name": "images.image0",
"name": "images.image0",
"type": "IMAGE",
"link": 45
},
{
"label": "image1",
"localized_name": "images.image1",
"name": "images.image1",
"shape": 7,
"type": "IMAGE",
"link": null
},
{
"label": "u_float0",
"localized_name": "floats.u_float0",
"name": "floats.u_float0",
"shape": 7,
"type": "FLOAT",
"link": 51
},
{
"label": "u_float1",
"localized_name": "floats.u_float1",
"name": "floats.u_float1",
"shape": 7,
"type": "FLOAT",
"link": 50
},
{
"label": "u_float2",
"localized_name": "floats.u_float2",
"name": "floats.u_float2",
"shape": 7,
"type": "FLOAT",
"link": 52
},
{
"label": "u_float3",
"localized_name": "floats.u_float3",
"name": "floats.u_float3",
"shape": 7,
"type": "FLOAT",
"link": null
},
{
"label": "u_int0",
"localized_name": "ints.u_int0",
"name": "ints.u_int0",
"shape": 7,
"type": "INT",
"link": 46
},
{
"label": "u_int1",
"localized_name": "ints.u_int1",
"name": "ints.u_int1",
"shape": 7,
"type": "INT",
"link": 47
},
{
"label": "u_int2",
"localized_name": "ints.u_int2",
"name": "ints.u_int2",
"shape": 7,
"type": "INT",
"link": null
},
{
"localized_name": "fragment_shader",
"name": "fragment_shader",
"type": "STRING",
"widget": {
"name": "fragment_shader"
},
"link": null
},
{
"localized_name": "size_mode",
"name": "size_mode",
"type": "COMFY_DYNAMICCOMBO_V3",
"widget": {
"name": "size_mode"
},
"link": null
}
],
"outputs": [
{
"localized_name": "IMAGE0",
"name": "IMAGE0",
"type": "IMAGE",
"links": [
53
]
},
{
"localized_name": "IMAGE1",
"name": "IMAGE1",
"type": "IMAGE",
"links": null
},
{
"localized_name": "IMAGE2",
"name": "IMAGE2",
"type": "IMAGE",
"links": null
},
{
"localized_name": "IMAGE3",
"name": "IMAGE3",
"type": "IMAGE",
"links": null
}
],
"properties": {
"Node name for S&R": "GLSLShader"
},
"widgets_values": [
"#version 300 es\nprecision mediump float;\n\nuniform sampler2D u_image0;\nuniform vec2 u_resolution;\nuniform int u_int0; // Blend mode\nuniform int u_int1; // Color tint\nuniform float u_float0; // Intensity\nuniform float u_float1; // Radius\nuniform float u_float2; // Threshold\n\nin vec2 v_texCoord;\nout vec4 fragColor;\n\nconst int BLEND_ADD = 0;\nconst int BLEND_SCREEN = 1;\nconst int BLEND_SOFT = 2;\nconst int BLEND_OVERLAY = 3;\nconst int BLEND_LIGHTEN = 4;\n\nconst float GOLDEN_ANGLE = 2.39996323;\nconst int MAX_SAMPLES = 48;\nconst vec3 LUMA = vec3(0.299, 0.587, 0.114);\n\nfloat hash(vec2 p) {\n p = fract(p * vec2(123.34, 456.21));\n p += dot(p, p + 45.32);\n return fract(p.x * p.y);\n}\n\nvec3 hexToRgb(int h) {\n return vec3(\n float((h >> 16) & 255),\n float((h >> 8) & 255),\n float(h & 255)\n ) * (1.0 / 255.0);\n}\n\nvec3 blend(vec3 base, vec3 glow, int mode) {\n if (mode == BLEND_SCREEN) {\n return 1.0 - (1.0 - base) * (1.0 - glow);\n }\n if (mode == BLEND_SOFT) {\n return mix(\n base - (1.0 - 2.0 * glow) * base * (1.0 - base),\n base + (2.0 * glow - 1.0) * (sqrt(base) - base),\n step(0.5, glow)\n );\n }\n if (mode == BLEND_OVERLAY) {\n return mix(\n 2.0 * base * glow,\n 1.0 - 2.0 * (1.0 - base) * (1.0 - glow),\n step(0.5, base)\n );\n }\n if (mode == BLEND_LIGHTEN) {\n return max(base, glow);\n }\n return base + glow;\n}\n\nvoid main() {\n vec4 original = texture(u_image0, v_texCoord);\n \n float intensity = u_float0 * 0.05;\n float radius = u_float1 * u_float1 * 0.012;\n \n if (intensity < 0.001 || radius < 0.1) {\n fragColor = original;\n return;\n }\n \n float threshold = 1.0 - u_float2 * 0.01;\n float t0 = threshold - 0.15;\n float t1 = threshold + 0.15;\n \n vec2 texelSize = 1.0 / u_resolution;\n float radius2 = radius * radius;\n \n float sampleScale = clamp(radius * 0.75, 0.35, 1.0);\n int samples = int(float(MAX_SAMPLES) * sampleScale);\n \n float noise = hash(gl_FragCoord.xy);\n float angleOffset = noise * GOLDEN_ANGLE;\n float radiusJitter = 0.85 + noise * 0.3;\n \n float ca = cos(GOLDEN_ANGLE);\n float sa = sin(GOLDEN_ANGLE);\n vec2 dir = vec2(cos(angleOffset), sin(angleOffset));\n \n vec3 glow = vec3(0.0);\n float totalWeight = 0.0;\n \n // Center tap\n float centerMask = smoothstep(t0, t1, dot(original.rgb, LUMA));\n glow += original.rgb * centerMask * 2.0;\n totalWeight += 2.0;\n \n for (int i = 1; i < MAX_SAMPLES; i++) {\n if (i >= samples) break;\n \n float fi = float(i);\n float dist = sqrt(fi / float(samples)) * radius * radiusJitter;\n \n vec2 offset = dir * dist * texelSize;\n vec3 c = texture(u_image0, v_texCoord + offset).rgb;\n float mask = smoothstep(t0, t1, dot(c, LUMA));\n \n float w = 1.0 - (dist * dist) / (radius2 * 1.5);\n w = max(w, 0.0);\n w *= w;\n \n glow += c * mask * w;\n totalWeight += w;\n \n dir = vec2(\n dir.x * ca - dir.y * sa,\n dir.x * sa + dir.y * ca\n );\n }\n \n glow *= intensity / max(totalWeight, 0.001);\n \n if (u_int1 > 0) {\n glow *= hexToRgb(u_int1);\n }\n \n vec3 result = blend(original.rgb, glow, u_int0);\n result += (noise - 0.5) * (1.0 / 255.0);\n \n fragColor = vec4(clamp(result, 0.0, 1.0), original.a);\n}",
"from_input"
]
},
{
"id": 34,
"type": "PrimitiveFloat",
"pos": [
2290,
-510
],
"size": [
270,
58
],
"flags": {},
"order": 0,
"mode": 0,
"inputs": [
{
"label": "intensity",
"localized_name": "value",
"name": "value",
"type": "FLOAT",
"widget": {
"name": "value"
},
"link": null
}
],
"outputs": [
{
"localized_name": "FLOAT",
"name": "FLOAT",
"type": "FLOAT",
"links": [
51
]
}
],
"properties": {
"Node name for S&R": "PrimitiveFloat",
"min": 0,
"max": 100,
"precision": 1,
"step": 1
},
"widgets_values": [
30
]
},
{
"id": 35,
"type": "PrimitiveFloat",
"pos": [
2290,
-410
],
"size": [
270,
58
],
"flags": {},
"order": 1,
"mode": 0,
"inputs": [
{
"label": "radius",
"localized_name": "value",
"name": "value",
"type": "FLOAT",
"widget": {
"name": "value"
},
"link": null
}
],
"outputs": [
{
"localized_name": "FLOAT",
"name": "FLOAT",
"type": "FLOAT",
"links": [
50
]
}
],
"properties": {
"Node name for S&R": "PrimitiveFloat",
"min": 0,
"max": 100,
"precision": 1,
"step": 1
},
"widgets_values": [
25
]
},
{
"id": 33,
"type": "PrimitiveFloat",
"pos": [
2290,
-310
],
"size": [
270,
58
],
"flags": {},
"order": 2,
"mode": 0,
"inputs": [
{
"label": "threshold",
"localized_name": "value",
"name": "value",
"type": "FLOAT",
"widget": {
"name": "value"
},
"link": null
}
],
"outputs": [
{
"localized_name": "FLOAT",
"name": "FLOAT",
"type": "FLOAT",
"links": [
52
]
}
],
"properties": {
"Node name for S&R": "PrimitiveFloat",
"min": 0,
"max": 100,
"precision": 1,
"step": 1
},
"widgets_values": [
100
]
},
{
"id": 32,
"type": "ColorToRGBInt",
"pos": [
2290,
-210
],
"size": [
270,
58
],
"flags": {},
"order": 3,
"mode": 0,
"inputs": [
{
"label": "color_tint",
"localized_name": "color",
"name": "color",
"type": "COLOR",
"widget": {
"name": "color"
},
"link": null
}
],
"outputs": [
{
"localized_name": "rgb_int",
"name": "rgb_int",
"type": "INT",
"links": [
47
]
}
],
"properties": {
"Node name for S&R": "ColorToRGBInt"
},
"widgets_values": [
"#45edf5"
]
},
{
"id": 31,
"type": "CustomCombo",
"pos": [
2290,
-110
],
"size": [
270,
222
],
"flags": {},
"order": 4,
"mode": 0,
"inputs": [
{
"label": "blend_mode",
"localized_name": "choice",
"name": "choice",
"type": "COMBO",
"widget": {
"name": "choice"
},
"link": null
}
],
"outputs": [
{
"localized_name": "STRING",
"name": "STRING",
"type": "STRING",
"links": null
},
{
"localized_name": "INDEX",
"name": "INDEX",
"type": "INT",
"links": [
46
]
}
],
"properties": {
"Node name for S&R": "CustomCombo"
},
"widgets_values": [
"add",
0,
"add",
"screen",
"soft",
"overlay",
"lighten",
""
]
}
],
"groups": [],
"links": [
{
"id": 51,
"origin_id": 34,
"origin_slot": 0,
"target_id": 30,
"target_slot": 2,
"type": "FLOAT"
},
{
"id": 50,
"origin_id": 35,
"origin_slot": 0,
"target_id": 30,
"target_slot": 3,
"type": "FLOAT"
},
{
"id": 52,
"origin_id": 33,
"origin_slot": 0,
"target_id": 30,
"target_slot": 4,
"type": "FLOAT"
},
{
"id": 46,
"origin_id": 31,
"origin_slot": 1,
"target_id": 30,
"target_slot": 6,
"type": "INT"
},
{
"id": 47,
"origin_id": 32,
"origin_slot": 0,
"target_id": 30,
"target_slot": 7,
"type": "INT"
},
{
"id": 45,
"origin_id": -10,
"origin_slot": 0,
"target_id": 30,
"target_slot": 0,
"type": "IMAGE"
},
{
"id": 53,
"origin_id": 30,
"origin_slot": 0,
"target_id": -20,
"target_slot": 0,
"type": "IMAGE"
}
],
"extra": {
"workflowRendererVersion": "LG"
},
"category": "Image Tools/Color adjust"
}
]
}
}