Hello
I'm trying to create a shader that uses 2 color mask textures (Blue, Green, Red for masking, Black for everything else) to assing indiviual colors via a color picker.
My problem is when I mix the output of the 2 masks together it becomes all black, if I only use the result from one mask I get the colors I want for this mask but everything else is black.
Changing the color mask textures, to only use 1 texture is not an option for this project.
I hope someone knows how I can fix this.
Here is my shader code:
shader_type spatial;
uniform sampler2D roughness_tex;
uniform sampler2D metal_tex;
uniform sampler2D normal_tex;
uniform sampler2D default_tex;
uniform vec4 Color_mask_blue: hint_color = vec4 (0,0,1.0,1.0);
uniform vec4 Color_mask_red: hint_color = vec4 (1.0,0,0,1.0);
uniform vec4 Color_mask_green: hint_color = vec4 (0,1.0,0,1.0);
uniform sampler2D mask_1;
uniform sampler2D mask_2;
uniform vec4 Color_1: hint_color = vec4 (1.0,1.0,1.0,1.0);
uniform vec4 Color_2: hint_color = vec4 (1.0,1.0,1.0,1.0);
uniform vec4 Color_3: hint_color = vec4 (1.0,1.0,1.0,1.0);
uniform vec4 Color_4: hint_color = vec4 (1.0,1.0,1.0,1.0);
uniform vec4 Color_5: hint_color = vec4 (1.0,1.0,1.0,1.0);
uniform vec4 Color_6: hint_color = vec4 (1.0,1.0,1.0,1.0);
void fragment() {
vec4 color_4 = texture(default_tex, UV);
vec3 color = color_4.rgb;
float color_len = length(color);
// Masks
vec4 mask_1_vec = texture(mask_1, UV);
vec4 mask_2_vec = texture(mask_2, UV);
// Colour
float mask_1_len = length(mask_1_vec.rgb);
vec3 mask_1_norm = mask_1_vec.rgb / mask_1_len * color_len;
vec3 Color_1_norm = Color_1.rgb / mask_1_len * color_len;
vec3 Color_2_norm = Color_2.rgb / mask_1_len * color_len;
vec3 Color_3_norm = Color_3.rgb / mask_1_len * color_len;
float mask_2_len = length(mask_2_vec.rgb);
vec3 mask_2_norm = mask_2_vec.rgb / mask_2_len * color_len;
vec3 Color_4_norm = Color_4.rgb / mask_2_len * color_len;
vec3 Color_5_norm = Color_5.rgb / mask_2_len * color_len;
vec3 Color_6_norm = Color_6.rgb / mask_2_len * color_len;
float dist_mask_1 = distance(Color_mask_blue, mask_1_vec);
float dist_mask_2 = distance(Color_mask_red, mask_1_vec);
float dist_mask_3 = distance(Color_mask_green, mask_1_vec);
float dist_mask_4 = distance(Color_mask_blue, mask_2_vec);
float dist_mask_5 = distance(Color_mask_red, mask_2_vec);
float dist_mask_6 = distance(Color_mask_green, mask_2_vec);
// Mixing
color = mix(Color_1_norm,color,step(0.01,dist_mask_1));
color = mix(Color_2_norm,color,step(0.01,dist_mask_2));
color = mix(Color_3_norm,color,step(0.01,dist_mask_3));
color = mix(Color_4_norm,color,step(0.01,dist_mask_4));
color = mix(Color_5_norm,color,step(0.01,dist_mask_5));
color = mix(Color_6_norm,color,step(0.01,dist_mask_6));
color = clamp(color,0,1);
ALBEDO = color;