commit
fee1c64775
7 changed files with 169 additions and 1 deletions
|
@ -3,3 +3,4 @@
|
||||||
|
|
||||||
- swamp.jpg by [clfr21 on Pixabay](https://pixabay.com/de/users/clfr21-6530007/)
|
- swamp.jpg by [clfr21 on Pixabay](https://pixabay.com/de/users/clfr21-6530007/)
|
||||||
- grass.png by [GDJ on Pixabay](https://pixabay.com/users/gdj-1086657/)
|
- grass.png by [GDJ on Pixabay](https://pixabay.com/users/gdj-1086657/)
|
||||||
|
- mountain.jpg by [Phghvvcftyyufj on Pixabay](https://pixabay.com/users/phghvvcftyyufj-12646982)
|
||||||
|
|
BIN
examples/images/mountain.jpg
Normal file
BIN
examples/images/mountain.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 814 KiB |
34
examples/images/mountain.jpg.import
Normal file
34
examples/images/mountain.jpg.import
Normal file
|
@ -0,0 +1,34 @@
|
||||||
|
[remap]
|
||||||
|
|
||||||
|
importer="texture"
|
||||||
|
type="CompressedTexture2D"
|
||||||
|
uid="uid://ben72llmopgaj"
|
||||||
|
path="res://.godot/imported/mountain.jpg-c1b7de1e6557b826bc6f9324027e11af.ctex"
|
||||||
|
metadata={
|
||||||
|
"vram_texture": false
|
||||||
|
}
|
||||||
|
|
||||||
|
[deps]
|
||||||
|
|
||||||
|
source_file="res://examples/images/mountain.jpg"
|
||||||
|
dest_files=["res://.godot/imported/mountain.jpg-c1b7de1e6557b826bc6f9324027e11af.ctex"]
|
||||||
|
|
||||||
|
[params]
|
||||||
|
|
||||||
|
compress/mode=0
|
||||||
|
compress/high_quality=false
|
||||||
|
compress/lossy_quality=0.7
|
||||||
|
compress/hdr_compression=1
|
||||||
|
compress/normal_map=0
|
||||||
|
compress/channel_pack=0
|
||||||
|
mipmaps/generate=false
|
||||||
|
mipmaps/limit=-1
|
||||||
|
roughness/mode=0
|
||||||
|
roughness/src_normal=""
|
||||||
|
process/fix_alpha_border=true
|
||||||
|
process/premult_alpha=false
|
||||||
|
process/normal_map_invert_y=false
|
||||||
|
process/hdr_as_srgb=false
|
||||||
|
process/hdr_clamp_exposure=false
|
||||||
|
process/size_limit=0
|
||||||
|
detect_3d/compress_to=1
|
16
examples/kuwahara.gdshader
Normal file
16
examples/kuwahara.gdshader
Normal file
|
@ -0,0 +1,16 @@
|
||||||
|
shader_type canvas_item;
|
||||||
|
|
||||||
|
//!load ./images/mountain.jpg
|
||||||
|
|
||||||
|
#include "res://shaderlib/kuwahara.gdshaderinc"
|
||||||
|
#include "res://shaderlib/hsv.gdshaderinc"
|
||||||
|
|
||||||
|
void fragment() {
|
||||||
|
// Kuwahara
|
||||||
|
COLOR.rgb = kuwahara(TEXTURE, UV, 20, 80.0, 18.0, 0.6, .15, 8);
|
||||||
|
// A litte bit of color adjustments
|
||||||
|
vec4 hsv = rgb2hsv(COLOR);
|
||||||
|
hsv.x += .03;
|
||||||
|
hsv.y *= 1.4;
|
||||||
|
COLOR = hsv2rgb(hsv);
|
||||||
|
}
|
|
@ -11,7 +11,7 @@ config_version=5
|
||||||
[application]
|
[application]
|
||||||
|
|
||||||
config/name="Fragmented"
|
config/name="Fragmented"
|
||||||
config/version="v8.1"
|
config/version="v8.2"
|
||||||
run/main_scene="res://scenes/main.tscn"
|
run/main_scene="res://scenes/main.tscn"
|
||||||
config/features=PackedStringArray("4.3", "Mobile")
|
config/features=PackedStringArray("4.3", "Mobile")
|
||||||
run/low_processor_mode=true
|
run/low_processor_mode=true
|
||||||
|
|
116
shaderlib/kuwahara.gdshaderinc
Normal file
116
shaderlib/kuwahara.gdshaderinc
Normal file
|
@ -0,0 +1,116 @@
|
||||||
|
/*
|
||||||
|
Kuwahara Filter, adapted
|
||||||
|
original code: https://godotshaders.com/shader/generalized-kuwahara/
|
||||||
|
original authors:
|
||||||
|
- https://godotshaders.com/author/firerabbit/
|
||||||
|
- https://github.com/GarrettGunnell (Acerola)
|
||||||
|
license of the original code:
|
||||||
|
|
||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2022 Garrett Gunnell
|
||||||
|
Copyright (c) 2024 Firerabbit
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy of this
|
||||||
|
software and associated documentation files (the "Software"), to deal in the Software
|
||||||
|
without restriction, including without limitation the rights to use, copy, modify, merge,
|
||||||
|
publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons
|
||||||
|
to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all copies
|
||||||
|
or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
||||||
|
THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||||
|
IN THE SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
vec3 kuwahara(
|
||||||
|
sampler2D texture,
|
||||||
|
vec2 uv,
|
||||||
|
int kernel_size, // should be > 2 - high values will affect performance
|
||||||
|
float hardness, // should be in the range of 1.0 - 100.0
|
||||||
|
float sharpness, // should be in the range of 1.0 - 18.0
|
||||||
|
float zero_crossing, // should be in the range of 0.5 - 2.0
|
||||||
|
float zeta, // should be in the range of 0.01 - 3.0
|
||||||
|
int n // number of iterations, should be 8, must be <= 8
|
||||||
|
) {
|
||||||
|
vec2 texelSize = vec2(1.0 / vec2(textureSize(texture, 0)));
|
||||||
|
vec4 m[8];
|
||||||
|
vec3 s[8];
|
||||||
|
|
||||||
|
int kernel_radius = kernel_size / 2;
|
||||||
|
|
||||||
|
float sin_zero_crossing = sin(zero_crossing);
|
||||||
|
float eta = (zeta + cos(zero_crossing)) / (sin_zero_crossing * sin_zero_crossing);
|
||||||
|
|
||||||
|
for (int k = 0; k < n; ++k) {
|
||||||
|
m[k] = vec4(0.0f);
|
||||||
|
s[k] = vec3(0.0f);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int y = -kernel_radius; y <= kernel_radius; ++y) {
|
||||||
|
for (int x = -kernel_radius; x <= kernel_radius; ++x) {
|
||||||
|
vec2 v = vec2(float(x), float(y)) / float(kernel_radius);
|
||||||
|
vec3 c = texture(texture, uv + vec2(float(x), float(y)) * texelSize.xy).rgb;
|
||||||
|
c = clamp(c, 0.0f, 1.0f);
|
||||||
|
float sum = 0.0f;
|
||||||
|
float w[8];
|
||||||
|
float z, vxx, vyy;
|
||||||
|
|
||||||
|
/* Calculate Polynomial Weights */
|
||||||
|
vxx = zeta - eta * v.x * v.x;
|
||||||
|
vyy = zeta - eta * v.y * v.y;
|
||||||
|
z = max(0, v.y + vxx);
|
||||||
|
w[0] = z * z;
|
||||||
|
sum += w[0];
|
||||||
|
z = max(0, -v.x + vyy);
|
||||||
|
w[2] = z * z;
|
||||||
|
sum += w[2];
|
||||||
|
z = max(0, -v.y + vxx);
|
||||||
|
w[4] = z * z;
|
||||||
|
sum += w[4];
|
||||||
|
z = max(0, v.x + vyy);
|
||||||
|
w[6] = z * z;
|
||||||
|
sum += w[6];
|
||||||
|
v = sqrt(2.0f) / 2.0f * vec2(v.x - v.y, v.x + v.y);
|
||||||
|
vxx = zeta - eta * v.x * v.x;
|
||||||
|
vyy = zeta - eta * v.y * v.y;
|
||||||
|
z = max(0, v.y + vxx);
|
||||||
|
w[1] = z * z;
|
||||||
|
sum += w[1];
|
||||||
|
z = max(0, -v.x + vyy);
|
||||||
|
w[3] = z * z;
|
||||||
|
sum += w[3];
|
||||||
|
z = max(0, -v.y + vxx);
|
||||||
|
w[5] = z * z;
|
||||||
|
sum += w[5];
|
||||||
|
z = max(0, v.x + vyy);
|
||||||
|
w[7] = z * z;
|
||||||
|
sum += w[7];
|
||||||
|
|
||||||
|
float g = exp(-3.125f * dot(v,v)) / sum;
|
||||||
|
|
||||||
|
for (int k = 0; k < 8; ++k) {
|
||||||
|
float wk = w[k] * g;
|
||||||
|
m[k] += vec4(c * wk, wk);
|
||||||
|
s[k] += c * c * wk;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
vec4 output = vec4(0.0f);
|
||||||
|
for (int k = 0; k < n; ++k) {
|
||||||
|
m[k].rgb /= m[k].w;
|
||||||
|
s[k] = abs(s[k] / m[k].w - m[k].rgb * m[k].rgb);
|
||||||
|
float sigma2 = s[k].r + s[k].g + s[k].b;
|
||||||
|
float w = 1.0f / (1.0f + pow(hardness * 1000.0f * sigma2, 0.5f * sharpness));
|
||||||
|
output += vec4(m[k].rgb * w, w);
|
||||||
|
}
|
||||||
|
|
||||||
|
return clamp(output / output.w, 0.0f, 1.0f).rgb;
|
||||||
|
}
|
|
@ -134,6 +134,7 @@ const shaderlib_functions = {
|
||||||
"common": ["alpha_blend", "cbrt"],
|
"common": ["alpha_blend", "cbrt"],
|
||||||
"denoise": ["smart_denoise"],
|
"denoise": ["smart_denoise"],
|
||||||
"hsv": ["rgb2hsv", "hsv2rgb",],
|
"hsv": ["rgb2hsv", "hsv2rgb",],
|
||||||
|
"kuwahara": ["kuwahara",],
|
||||||
"oklab": ["oklab2rgb", "rgb2oklab", "oklab2oklch", "oklch2oklab"],
|
"oklab": ["oklab2rgb", "rgb2oklab", "oklab2oklch", "oklch2oklab"],
|
||||||
"pixelate": ["pixelate"],
|
"pixelate": ["pixelate"],
|
||||||
"place_texture": ["place_texture"],
|
"place_texture": ["place_texture"],
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue