Browse Source

Shader fixes

luboslenco 1 tuần trước cách đây
mục cha
commit
bf09feec64

+ 21 - 7
paint/sources/make_material.ts

@@ -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
paint/sources/make_mesh.ts

@@ -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
paint/sources/parser_material.ts

@@ -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") {