Shader fixes

This commit is contained in:
luboslenco
2025-09-08 19:11:22 +02:00
parent 3701454d4a
commit bf09feec64
3 changed files with 39 additions and 15 deletions
+21 -7
View File
@@ -407,11 +407,21 @@ function make_material_blend_mode(kong: node_shader_t, blending: i32, cola: stri
return "lerp3(" + cola + ", " + cola + " + " + colb + ", " + opac + ")";
}
else if (blending == blend_type_t.OVERLAY) {
return "lerp3(" + cola + ", float3( \
" + cola + ".r < 0.5 ? 2.0 * " + cola + ".r * " + colb + ".r : 1.0 - 2.0 * (1.0 - " + cola + ".r) * (1.0 - " + colb + ".r), \
" + cola + ".g < 0.5 ? 2.0 * " + cola + ".g * " + colb + ".g : 1.0 - 2.0 * (1.0 - " + cola + ".g) * (1.0 - " + colb + ".g), \
" + cola + ".b < 0.5 ? 2.0 * " + cola + ".b * " + colb + ".b : 1.0 - 2.0 * (1.0 - " + cola + ".b) * (1.0 - " + colb + ".b) \
), " + opac + ")";
// return "lerp3(" + cola + ", float3( \
// " + cola + ".r < 0.5 ? 2.0 * " + cola + ".r * " + colb + ".r : 1.0 - 2.0 * (1.0 - " + cola + ".r) * (1.0 - " + colb + ".r), \
// " + cola + ".g < 0.5 ? 2.0 * " + cola + ".g * " + colb + ".g : 1.0 - 2.0 * (1.0 - " + cola + ".g) * (1.0 - " + colb + ".g), \
// " + cola + ".b < 0.5 ? 2.0 * " + cola + ".b * " + colb + ".b : 1.0 - 2.0 * (1.0 - " + cola + ".b) * (1.0 - " + colb + ".b) \
// ), " + opac + ")";
let res_r: string = string_replace_all(cola, ".", "_") + "_res_r";
let res_g: string = string_replace_all(cola, ".", "_") + "_res_g";
let res_b: string = string_replace_all(cola, ".", "_") + "_res_b";
node_shader_write_frag(kong, "var " + res_r + ": float;");
node_shader_write_frag(kong, "var " + res_g + ": float;");
node_shader_write_frag(kong, "var " + res_b + ": float;");
node_shader_write_frag(kong, "if (" + cola + ".r < 0.5) { " + res_r + " = 2.0 * " + cola + ".r * " + colb + ".r; } else { " + res_r + " = 1.0 - 2.0 * (1.0 - " + cola + ".r) * (1.0 - " + colb + ".r); }");
node_shader_write_frag(kong, "if (" + cola + ".g < 0.5) { " + res_g + " = 2.0 * " + cola + ".g * " + colb + ".g; } else { " + res_g + " = 1.0 - 2.0 * (1.0 - " + cola + ".g) * (1.0 - " + colb + ".g); }");
node_shader_write_frag(kong, "if (" + cola + ".b < 0.5) { " + res_b + " = 2.0 * " + cola + ".b * " + colb + ".b; } else { " + res_b + " = 1.0 - 2.0 * (1.0 - " + cola + ".b) * (1.0 - " + colb + ".b); }");
return "lerp3(" + cola + ", float3(" + res_r + ", " + res_g + ", " + res_b + "), " + opac + ")";
}
else if (blending == blend_type_t.SOFT_LIGHT) {
return "((1.0 - " + opac + ") * " + cola + " + " + opac + " * ((float3(1.0, 1.0, 1.0) - " + cola + ") * " + colb + " * " + cola + " + " + cola + " * (float3(1.0, 1.0, 1.0) - (float3(1.0, 1.0, 1.0) - " + colb + ") * (float3(1.0, 1.0, 1.0) - " + cola + "))))";
@@ -446,7 +456,7 @@ function make_material_blend_mode(kong: node_shader_t, blending: i32, cola: stri
}
}
function make_material_blend_mode_mask(blending: i32, cola: string, colb: string, opac: string): string {
function make_material_blend_mode_mask(kong: node_shader_t, blending: i32, cola: string, colb: string, opac: string): string {
if (blending == blend_type_t.MIX) {
return "lerp(" + cola + ", " + colb + ", " + opac + ")";
}
@@ -472,7 +482,11 @@ function make_material_blend_mode_mask(blending: i32, cola: string, colb: string
return "lerp(" + cola + ", " + cola + " + " + colb + ", " + opac + ")";
}
else if (blending == blend_type_t.OVERLAY) {
return "lerp(" + cola + ", " + cola + " < 0.5 ? 2.0 * " + cola + " * " + colb + " : 1.0 - 2.0 * (1.0 - " + cola + ") * (1.0 - " + colb + "), " + opac + ")";
// return "lerp(" + cola + ", " + cola + " < 0.5 ? 2.0 * " + cola + " * " + colb + " : 1.0 - 2.0 * (1.0 - " + cola + ") * (1.0 - " + colb + "), " + opac + ")";
let res: string = string_replace_all(cola, ".", "_") + "_res";
node_shader_write_frag(kong, "var " + res + ": float;");
node_shader_write_frag(kong, "if (" + cola + " < 0.5) { " + res + " = 2.0 * " + cola + " * " + colb + "; } else { " + res + " = 1.0 - 2.0 * (1.0 - " + cola + ") * (1.0 - " + colb + "); }");
return "lerp(" + cola + ", " + res + ", " + opac + ")";
}
else if (blending == blend_type_t.SOFT_LIGHT) {
return "((1.0 - " + opac + ") * " + cola + " + " + opac + " * ((1.0 - " + cola + ") * " + colb + " * " + cola + " + " + cola + " * (1.0 - (1.0 - " + colb + ") * (1.0 - " + cola + "))))";
+2 -2
View File
@@ -242,7 +242,7 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte
node_shader_write_frag(kong, "{"); // Group mask is sampled across multiple layers
node_shader_write_frag(kong, "var texpaint_mask_sample" + m.id + ": float = sample_lod(texpaint" + m.id + ", sampler_linear, tex_coord, 0.0).r;");
let opac: f32 = slot_layer_get_opacity(m);
let mask: string = make_material_blend_mode_mask(m.blending, texpaint_mask, "texpaint_mask_sample" + m.id, "float(" + opac + ")");
let mask: string = make_material_blend_mode_mask(kong, m.blending, texpaint_mask, "texpaint_mask_sample" + m.id, "float(" + opac + ")");
node_shader_write_frag(kong, texpaint_mask + " = " + mask + ";");
node_shader_write_frag(kong, "}");
}
@@ -503,7 +503,7 @@ function make_mesh_run(data: material_t, layer_pass: i32 = 0): node_shader_conte
}
node_shader_write_frag(kong, "var mask_sample" + m.id + ": float = sample_lod(texpaint_view_mask" + m.id + ", sampler_linear, tex_coord, 0.0).r;");
let opac: f32 = slot_layer_get_opacity(m);
let mask: string = make_material_blend_mode_mask(m.blending, "mask_view", "mask_sample" + m.id, "float(" + opac + ")");
let mask: string = make_material_blend_mode_mask(kong, m.blending, "mask_view", "mask_sample" + m.id, "float(" + opac + ")");
node_shader_write_frag(kong, "mask_view = " + mask + ";");
}
}
+16 -6
View File
@@ -716,11 +716,21 @@ function parser_material_parse_vector(node: ui_node_t, socket: ui_node_socket_t)
out_col = "lerp3(" + col1 + ", " + col1 + " + " + col2 + ", " + fac_var + ")";
}
else if (blend == "OVERLAY") {
out_col = "lerp3(" + col1 + ", float3( \
" + col1 + ".r < 0.5 ? 2.0 * " + col1 + ".r * " + col2 + ".r : 1.0 - 2.0 * (1.0 - " + col1 + ".r) * (1.0 - " + col2 + ".r), \
" + col1 + ".g < 0.5 ? 2.0 * " + col1 + ".g * " + col2 + ".g : 1.0 - 2.0 * (1.0 - " + col1 + ".g) * (1.0 - " + col2 + ".g), \
" + col1 + ".b < 0.5 ? 2.0 * " + col1 + ".b * " + col2 + ".b : 1.0 - 2.0 * (1.0 - " + col1 + ".b) * (1.0 - " + col2 + ".b) \
), " + fac_var + ")";
// out_col = "lerp3(" + col1 + ", float3( \
// " + col1 + ".r < 0.5 ? 2.0 * " + col1 + ".r * " + col2 + ".r : 1.0 - 2.0 * (1.0 - " + col1 + ".r) * (1.0 - " + col2 + ".r), \
// " + col1 + ".g < 0.5 ? 2.0 * " + col1 + ".g * " + col2 + ".g : 1.0 - 2.0 * (1.0 - " + col1 + ".g) * (1.0 - " + col2 + ".g), \
// " + col1 + ".b < 0.5 ? 2.0 * " + col1 + ".b * " + col2 + ".b : 1.0 - 2.0 * (1.0 - " + col1 + ".b) * (1.0 - " + col2 + ".b) \
// ), " + fac_var + ")";
let res_r: string = parser_material_node_name(node) + "_res_r";
let res_g: string = parser_material_node_name(node) + "_res_g";
let res_b: string = parser_material_node_name(node) + "_res_b";
parser_material_write(parser_material_kong, "var " + res_r + ": float;");
parser_material_write(parser_material_kong, "var " + res_g + ": float;");
parser_material_write(parser_material_kong, "var " + res_b + ": float;");
parser_material_write(parser_material_kong, "if (" + col1 + ".r < 0.5) { " + res_r + " = 2.0 * " + col1 + ".r * " + col2 + ".r; } else { " + res_r + " = 1.0 - 2.0 * (1.0 - " + col1 + ".r) * (1.0 - " + col2 + ".r); }");
parser_material_write(parser_material_kong, "if (" + col1 + ".g < 0.5) { " + res_g + " = 2.0 * " + col1 + ".g * " + col2 + ".g; } else { " + res_g + " = 1.0 - 2.0 * (1.0 - " + col1 + ".g) * (1.0 - " + col2 + ".g); }");
parser_material_write(parser_material_kong, "if (" + col1 + ".b < 0.5) { " + res_b + " = 2.0 * " + col1 + ".b * " + col2 + ".b; } else { " + res_b + " = 1.0 - 2.0 * (1.0 - " + col1 + ".b) * (1.0 - " + col2 + ".b); }");
out_col = "lerp3(" + col1 + ", float3(" + res_r + ", " + res_g + ", " + res_b + "), " + fac_var + ")";
}
else if (blend == "SOFT_LIGHT") {
out_col = "((1.0 - " + fac_var + ") * " + col1 + " + " + fac_var + " * ((float3(1.0, 1.0, 1.0) - " + col1 + ") * " + col2 + " * " + col1 + " + " + col1 + " * (float3(1.0, 1.0, 1.0) - (float3(1.0, 1.0, 1.0) - " + col2 + ") * (float3(1.0, 1.0, 1.0) - " + col1 + "))))";
@@ -737,7 +747,7 @@ function parser_material_parse_vector(node: ui_node_t, socket: ui_node_socket_t)
else if (blend == "DIVIDE") {
let eps: f32 = 0.000001;
col2 = "max3(" + col2 + ", float3(" + eps + ", " + eps + ", " + eps + "))";
let v3: string = parser_material_to_vec3("(1.0 - " + fac_var + ") * " + col1 + " + " + fac_var + " * " + col1 + " / " + col2);
let v3: string = "(float3(1.0, 1.0, 1.0) - float3(" + fac_var + ", " + fac_var + ", " + fac_var + ")) * " + col1 + " + float3(" + fac_var + ", " + fac_var + ", " + fac_var + ") * " + col1 + " / " + col2;
out_col = "(" + v3 + ")";
}
else if (blend == "HUE") {