mirror of
https://github.com/Orama-Interactive/Pixelorama.git
synced 2025-02-22 13:33:13 +00:00
Fix dithered gradients having wrong colors
Pass a nx1 image instead of the GradientTexture, that contains all of the gradient's selected colors, where n is the number of colors.
This commit is contained in:
parent
f26484f854
commit
53dea9c8d0
3 changed files with 20 additions and 7 deletions
|
@ -14,7 +14,7 @@ uniform int repeat = 0; // 0 = none, 1 = repeat, 2 = mirrored, 3 = truncate
|
||||||
|
|
||||||
float modify_uv(vec2 uv) {
|
float modify_uv(vec2 uv) {
|
||||||
float modified_uv;
|
float modified_uv;
|
||||||
if (shape == 0) {
|
if (shape == 0) { // Linear
|
||||||
vec2 uv_offsetted = uv - 0.5;
|
vec2 uv_offsetted = uv - 0.5;
|
||||||
float angle_cos = cos(radians(angle));
|
float angle_cos = cos(radians(angle));
|
||||||
float angle_sin = sin(radians(angle));
|
float angle_sin = sin(radians(angle));
|
||||||
|
@ -24,7 +24,7 @@ float modify_uv(vec2 uv) {
|
||||||
float pivot = position / size;
|
float pivot = position / size;
|
||||||
modified_uv -= pivot - 0.5;
|
modified_uv -= pivot - 0.5;
|
||||||
}
|
}
|
||||||
else {
|
else { // Radial
|
||||||
vec2 uv_offsetted = uv * 2.0 - 1.0;
|
vec2 uv_offsetted = uv * 2.0 - 1.0;
|
||||||
uv_offsetted -= (center * 2.0) - vec2(1.0);
|
uv_offsetted -= (center * 2.0) - vec2(1.0);
|
||||||
uv_offsetted *= radius;
|
uv_offsetted *= radius;
|
||||||
|
@ -33,6 +33,7 @@ float modify_uv(vec2 uv) {
|
||||||
return modified_uv;
|
return modified_uv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
float mirror_fract(float uv) {
|
float mirror_fract(float uv) {
|
||||||
int sign_uv = (int(sign(uv)) - 1) / 2;
|
int sign_uv = (int(sign(uv)) - 1) / 2;
|
||||||
if (int((uv)) % 2 == sign_uv)
|
if (int((uv)) % 2 == sign_uv)
|
||||||
|
|
|
@ -19,7 +19,7 @@ uniform int n_of_colors = 2;
|
||||||
|
|
||||||
float modify_uv(vec2 uv) {
|
float modify_uv(vec2 uv) {
|
||||||
float modified_uv;
|
float modified_uv;
|
||||||
if (shape == 0) {
|
if (shape == 0) { // Linear
|
||||||
vec2 uv_offsetted = uv - 0.5;
|
vec2 uv_offsetted = uv - 0.5;
|
||||||
float angle_cos = cos(radians(angle));
|
float angle_cos = cos(radians(angle));
|
||||||
float angle_sin = sin(radians(angle));
|
float angle_sin = sin(radians(angle));
|
||||||
|
@ -29,7 +29,7 @@ float modify_uv(vec2 uv) {
|
||||||
float pivot = position / size;
|
float pivot = position / size;
|
||||||
modified_uv -= pivot - 0.5;
|
modified_uv -= pivot - 0.5;
|
||||||
}
|
}
|
||||||
else {
|
else { // Radial
|
||||||
vec2 uv_offsetted = uv * 2.0 - 1.0;
|
vec2 uv_offsetted = uv * 2.0 - 1.0;
|
||||||
uv_offsetted -= (center * 2.0) - vec2(1.0);
|
uv_offsetted -= (center * 2.0) - vec2(1.0);
|
||||||
uv_offsetted *= radius;
|
uv_offsetted *= radius;
|
||||||
|
@ -52,7 +52,7 @@ float mirror_fract(float uv) {
|
||||||
// Logic taken from https://godotshaders.com/shader/dither-gradient-shader/
|
// Logic taken from https://godotshaders.com/shader/dither-gradient-shader/
|
||||||
float dither(vec2 uv, float modified_uv) {
|
float dither(vec2 uv, float modified_uv) {
|
||||||
float uv_lower = floor(modified_uv);
|
float uv_lower = floor(modified_uv);
|
||||||
float uv_upper = (floor(modified_uv) + 1.0);
|
float uv_upper = floor(modified_uv) + 1.0;
|
||||||
float threshold = texture(dither_texture, uv * (image_size / float(pixel_size))).r;
|
float threshold = texture(dither_texture, uv * (image_size / float(pixel_size))).r;
|
||||||
float ramp_val = modified_uv < threshold ? 0.0 : 1.0;
|
float ramp_val = modified_uv < threshold ? 0.0 : 1.0;
|
||||||
// sample at the lower bound colour if ramp_val is 0.0, upper bound color if 1.0
|
// sample at the lower bound colour if ramp_val is 0.0, upper bound color if 1.0
|
||||||
|
|
|
@ -70,22 +70,34 @@ func commit_action(cel: Image, project: Project = Global.current_project) -> voi
|
||||||
|
|
||||||
var dither_texture: Texture = selected_dither_matrix.texture
|
var dither_texture: Texture = selected_dither_matrix.texture
|
||||||
var pixel_size := dither_texture.get_width()
|
var pixel_size := dither_texture.get_width()
|
||||||
var gradient: Gradient = gradient_edit.texture.gradient
|
var gradient: Gradient = gradient_edit.gradient
|
||||||
var n_of_colors := gradient.offsets.size()
|
var n_of_colors := gradient.offsets.size()
|
||||||
# Pass the gradient offsets as an array to the shader
|
# Pass the gradient offsets as an array to the shader
|
||||||
# ...but since Godot 3.x doesn't support uniform arrays, instead we construct
|
# ...but since Godot 3.x doesn't support uniform arrays, instead we construct
|
||||||
# a nx1 grayscale texture with each offset stored in each pixel, and pass it to the shader
|
# a nx1 grayscale texture with each offset stored in each pixel, and pass it to the shader
|
||||||
var offsets_image := Image.new()
|
var offsets_image := Image.new()
|
||||||
offsets_image.create(n_of_colors, 1, false, Image.FORMAT_L8)
|
offsets_image.create(n_of_colors, 1, false, Image.FORMAT_L8)
|
||||||
|
# Construct an image that contains the selected colors of the gradient without interpolation
|
||||||
|
var gradient_image := Image.new()
|
||||||
|
gradient_image.create(n_of_colors, 1, false, Image.FORMAT_RGBA8)
|
||||||
offsets_image.lock()
|
offsets_image.lock()
|
||||||
|
gradient_image.lock()
|
||||||
for i in n_of_colors:
|
for i in n_of_colors:
|
||||||
var c := gradient.offsets[i]
|
var c := gradient.offsets[i]
|
||||||
offsets_image.set_pixel(i, 0, Color(c, c, c, c))
|
offsets_image.set_pixel(i, 0, Color(c, c, c, c))
|
||||||
|
gradient_image.set_pixel(i, 0, gradient.colors[i])
|
||||||
offsets_image.unlock()
|
offsets_image.unlock()
|
||||||
|
gradient_image.unlock()
|
||||||
var offsets_tex := ImageTexture.new()
|
var offsets_tex := ImageTexture.new()
|
||||||
offsets_tex.create_from_image(offsets_image, 0)
|
offsets_tex.create_from_image(offsets_image, 0)
|
||||||
|
var gradient_tex: Texture
|
||||||
|
if shader == shader_linear:
|
||||||
|
gradient_tex = gradient_edit.texture
|
||||||
|
else:
|
||||||
|
gradient_tex = ImageTexture.new()
|
||||||
|
gradient_tex.create_from_image(gradient_image, 0)
|
||||||
var params := {
|
var params := {
|
||||||
"gradient_texture": gradient_edit.texture,
|
"gradient_texture": gradient_tex,
|
||||||
"offset_texture": offsets_tex,
|
"offset_texture": offsets_tex,
|
||||||
"selection": selection_tex,
|
"selection": selection_tex,
|
||||||
"repeat": repeat_option_button.selected,
|
"repeat": repeat_option_button.selected,
|
||||||
|
|
Loading…
Add table
Reference in a new issue