paint: fix layer_merge

This commit is contained in:
luboslenco
2026-05-19 16:00:51 +02:00
parent c9d9b7345e
commit ec1cc82059
+15 -42
View File
@@ -41,7 +41,7 @@ fun layer_merge_vert(input: vert_in): vert_out {
fun hsv_to_rgb(c: float3): float3 {
var K: float4 = float4(1.0, 2.0 / 3.0, 1.0 / 3.0, 3.0);
var p: float3 = abs3(frac3(c.xxx + K.xyz) * 6.0 - K.www);
return c.z * lerp3(K.xxx, clamp3(p - K.xxx, 0.0, 1.0), c.y);
return c.z * lerp3(K.xxx, clamp3(p - K.xxx, float3(0.0, 0.0, 0.0), float3(1.0, 1.0, 1.0)), c.y);
}
fun rgb_to_hsv(c: float3): float3 {
@@ -133,63 +133,40 @@ fun layer_merge_frag(input: vert_out): float4 {
lerp3(cola.rgb, cola.rgb + col0.rgb, str),
max(col0.a * maskr, cola.a));
}
////
/* TODO: SPIRV
if (constants.blending == 8) { // Overlay
var rr: float;
if (cola.r < 0.5) {
rr = 2.0 * cola.r * col0.r;
}
else {
rr = 1.0 - 2.0 * (1.0 - cola.r) * (1.0 - col0.r);
}
var gg: float;
if (cola.r < 0.5) {
gg = 2.0 * cola.g * col0.g;
}
else {
gg = 1.0 - 2.0 * (1.0 - cola.g) * (1.0 - col0.g);
}
var bb: float;
if (cola.r < 0.5) {
bb = 2.0 * cola.b * col0.b;
}
else {
bb = 1.0 - 2.0 * (1.0 - cola.b) * (1.0 - col0.b);
}
var rr: float = lerp(2.0 * cola.r * col0.r, 1.0 - 2.0 * (1.0 - cola.r) * (1.0 - col0.r), step(0.5, cola.r));
var gg: float = lerp(2.0 * cola.g * col0.g, 1.0 - 2.0 * (1.0 - cola.g) * (1.0 - col0.g), step(0.5, cola.g));
var bb: float = lerp(2.0 * cola.b * col0.b, 1.0 - 2.0 * (1.0 - cola.b) * (1.0 - col0.b), step(0.5, cola.b));
return float4(
lerp3(cola.rgb, float3(rr, gg, bb), str),
max(col0.a, cola.a));
max(col0.a * maskr, cola.a));
}
if (constants.blending == 9) { // Soft Light
return float4(
((1.0 - str) * cola.rgb +
str * ((float3(1.0, 1.0, 1.0) - cola.rgb) * col0.rgb * cola.rgb +
cola.rgb * (float3(1.0, 1.0, 1.0) - (float3(1.0, 1.0, 1.0) - col0.rgb) * (float3(1.0, 1.0, 1.0) - cola.rgb)))),
max(col0.a, cola.a));
max(col0.a * maskr, cola.a));
}
if (constants.blending == 10) { // Linear Light
return float4(
(cola.rgb + str * (float3(2.0, 2.0, 2.0) * (col0.rgb - float3(0.5, 0.5, 0.5)))),
max(col0.a, cola.a));
max(col0.a * maskr, cola.a));
}
if (constants.blending == 11) {
if (constants.blending == 11) { // Difference
return float4(
lerp3(cola.rgb, abs3(cola.rgb - col0.rgb), str),
max(col0.a, cola.a));
max(col0.a * maskr, cola.a));
}
if (constants.blending == 12) { // Subtract
return float4(
lerp3(cola.rgb, cola.rgb - col0.rgb, str),
max(col0.a, cola.a));
max(col0.a * maskr, cola.a));
}
if (constants.blending == 13) { // Divide
return float4(
float3(1.0 - str, 1.0 - str, 1.0 - str) * cola.rgb + float3(str, str, str) * cola.rgb / col0.rgb,
max(col0.a, cola.a));
max(col0.a * maskr, cola.a));
}
if (constants.blending == 14) { // Hue
return float4(
@@ -200,7 +177,7 @@ fun layer_merge_frag(input: vert_out): float4 {
rgb_to_hsv(cola.rgb).g,
rgb_to_hsv(cola.rgb).b)),
str),
max(col0.a, cola.a));
max(col0.a * maskr, cola.a));
}
if (constants.blending == 15) { // Saturation
return float4(
@@ -211,7 +188,7 @@ fun layer_merge_frag(input: vert_out): float4 {
rgb_to_hsv(col0.rgb).g,
rgb_to_hsv(cola.rgb).b)),
str),
max(col0.a, cola.a));
max(col0.a * maskr, cola.a));
}
if (constants.blending == 16) { // Color
return float4(
@@ -222,7 +199,7 @@ fun layer_merge_frag(input: vert_out): float4 {
rgb_to_hsv(col0.rgb).g,
rgb_to_hsv(cola.rgb).b)),
str),
max(col0.a, cola.a));
max(col0.a * maskr, cola.a));
}
if (constants.blending == 17) { // Value
return float4(
@@ -233,13 +210,9 @@ fun layer_merge_frag(input: vert_out): float4 {
rgb_to_hsv(cola.rgb).g,
rgb_to_hsv(col0.rgb).b)),
str),
max(col0.a, cola.a));
max(col0.a * maskr, cola.a));
}
*/
////
return float4(1.0, 1.0, 1.0, 1.0);
}