Glitchy rendering of Material after moving to Apple silicon (M2 Pro)
  • looseopinions
    member
    Posts: 10
    Joined: Tue Oct 19, 2021 1:57 am

    Glitchy rendering of Material after moving to Apple silicon (M2 Pro)

    by looseopinions » Mon Apr 10, 2023 4:31 pm

    Hi,
    I wrote a Material that renders fine on my previous MacBook Pro. However, after moving to a new MacBook Pro with an M2 Pro chip, the background of my material (where the alpha channel should be) is extremely glitchy. See the attachment.

    Is there something that I need to change in my code to make it render correctly on an Apple silicon-based processor?

    The following code runs fine on my Intel-based MacBook Pro, and looks like the glitchy mess shown in the attachment running on my new computer. Only difference is that I'm running the M1 build of Madmapper on my new computer:

    Code: Select all

    /*{ "CREDIT": "GB", "DESCRIPTION": "Line art using the superformula", "TAGS": "template", "VSN": "1.0", "INPUTS": [ {"LABEL": "Speed", "NAME": "mat_speed", "TYPE": "float", "MIN": 0.0, "MAX": 2.0, "DEFAULT": 1.0 }, {"LABEL": "# of Lines", "NAME": "mat_num_lines", "TYPE": "int", "MIN": 1, "MAX": 100, "DEFAULT": 15 }, {"LABEL": "Line Width", "NAME": "mat_lineWidth", "TYPE": "float", "MIN": 0.2, "MAX": 10, "DEFAULT": 1 }, {"LABEL": "Line Spacing", "NAME": "mat_lineSpacing", "TYPE": "float", "MIN": 0.1, "MAX": 40, "DEFAULT": 1 }, {"LABEL": "Line 1", "NAME": "mat_line1_bool", "TYPE": "bool", "DEFAULT": true }, {"LABEL": "Line 2", "NAME": "mat_line2_bool", "TYPE": "bool", "DEFAULT": true }, {"LABEL": "Line 3", "NAME": "mat_line3_bool", "TYPE": "bool", "DEFAULT": true }, {"LABEL": "Line 4", "NAME": "mat_line4_bool", "TYPE": "bool", "DEFAULT": true }, {"LABEL": "Rad1/A: size A", "NAME": "mat_rad1_a", "TYPE": "float", "MIN": 0, "MAX": 200, "DEFAULT": 1 }, {"LABEL": "Rad1/B: size B", "NAME": "mat_rad1_b", "TYPE": "float", "MIN": 0, "MAX": 200, "DEFAULT": 1 }, {"LABEL": "Rad1/M: num spikes", "NAME": "mat_rad1_m", "TYPE": "float", "MIN": 0, "MAX": 20, "DEFAULT": 1 }, {"LABEL": "Rad1/N1: convex1", "NAME": "mat_rad1_n1", "TYPE": "float", "MIN": 0.4, "MAX": 2, "DEFAULT": 1 }, {"LABEL": "Rad1/N2: convex2", "NAME": "mat_rad1_n2", "TYPE": "float", "MIN": 0, "MAX": 2, "DEFAULT": 1 }, {"LABEL": "Rad1/N3: convex3", "NAME": "mat_rad1_n3", "TYPE": "float", "MIN": 0, "MAX": 2, "DEFAULT": 1 }, {"LABEL": "Rad2/A: size A", "NAME": "mat_rad2_a", "TYPE": "float", "MIN": 0, "MAX": 200, "DEFAULT": 1 }, {"LABEL": "Rad2/B: size B", "NAME": "mat_rad2_b", "TYPE": "float", "MIN": 0, "MAX": 200, "DEFAULT": 1 }, {"LABEL": "Rad2/M: num spikes", "NAME": "mat_rad2_m", "TYPE": "float", "MIN": 0, "MAX": 20, "DEFAULT": 1 }, {"LABEL": "Rad2/N1: convex1", "NAME": "mat_rad2_n1", "TYPE": "float", "MIN": 0.4, "MAX": 2, "DEFAULT": 1 }, {"LABEL": "Rad2/N2: convex2", "NAME": "mat_rad2_n2", "TYPE": "float", "MIN": 0, "MAX": 2, "DEFAULT": 1 }, {"LABEL": "Rad2/N3: convex3", "NAME": "mat_rad2_n3", "TYPE": "float", "MIN": 0, "MAX": 2, "DEFAULT": 1 }, {"LABEL": "Range/X1 Range", "NAME": "mat_x1_range", "TYPE": "floatRange", "DEFAULT": [0.1,0.9], "MIN": 0.0, "MAX": 1.0 }, {"LABEL": "Range/Y1 Range", "NAME": "mat_y1_range", "TYPE": "floatRange", "DEFAULT": [0.1,0.9], "MIN": 0.0, "MAX": 1.0 }, {"LABEL": "Range/X2 Range", "NAME": "mat_x2_range", "TYPE": "floatRange", "DEFAULT": [0.1,0.9], "MIN": 0.0, "MAX": 1.0 }, {"LABEL": "Range/Y2 Range", "NAME": "mat_y2_range", "TYPE": "floatRange", "DEFAULT": [0.1,0.9], "MIN": 0.0, "MAX": 1.0 }, {"LABEL": "Freq/X1 Freq", "NAME": "mat_x1_freq", "TYPE": "float", "MIN": 1, "MAX": 300, "DEFAULT": 25 }, {"LABEL": "Freq/Y1 Freq", "NAME": "mat_y1_freq", "TYPE": "float", "MIN": 1, "MAX": 300, "DEFAULT": 20 }, {"LABEL": "Freq/X2 FreqA", "NAME": "mat_x2_freqA", "TYPE": "float", "MIN": 1, "MAX": 300, "DEFAULT": 35 }, {"LABEL": "Freq/X2 FreqB", "NAME": "mat_x2_freqB", "TYPE": "float", "MIN": 1, "MAX": 300, "DEFAULT": 15 }, {"LABEL": "Freq/Y2 FreqA", "NAME": "mat_y2_freqA", "TYPE": "float", "MIN": 1, "MAX": 300, "DEFAULT": 30 }, {"LABEL": "Freq/Y2 FreqB", "NAME": "mat_y2_freqB", "TYPE": "float", "MIN": 1, "MAX": 300, "DEFAULT": 22 }, {"LABEL": "Color/Line1 Color", "NAME": "mat_line1_color", "TYPE": "color", "DEFAULT": [ 0.7, 0.3, 0.6, 1.0 ] }, {"LABEL": "Color/Line2 Color", "NAME": "mat_line2_color", "TYPE": "color", "DEFAULT": [ 0.3, 0.7, 0.6, 1.0 ] }, {"LABEL": "Color/Line3 Color", "NAME": "mat_line3_color", "TYPE": "color", "DEFAULT": [ 0.6, 0.3, 0.7, 1.0 ] }, {"LABEL": "Color/Line4 Color", "NAME": "mat_line4_color", "TYPE": "color", "DEFAULT": [ 0.7, 0.6, 0.3, 1.0 ] }, ], "GENERATORS": [ {"NAME": "mat_time", "TYPE": "time_base", "PARAMS": {"speed": "mat_speed"} }, ], }*/ #include "MadCommon.glsl" #include "MadSDF.glsl" float inRange(float oldVal, float newMin, float newMax) { float oldMin = -1; float oldMax = 1; float newRange = newMax - newMin; float oldRange = oldMax - oldMin; return (((oldVal - oldMin) * newRange) / oldRange) + newMin; } float superformula(float theta, float a, float b, float m, float n1, float n2, float n3) { return pow(pow(abs(cos(m * theta / 4.0) / a), n2) + pow(abs(sin(m * theta / 4.0) / b), n3), -1.0 / n1); } float flip(float n) { // flip number across a 0.5 axis... turn 0.7 into 0.3 or turn 0.1 into 0.9 return (0.5 - n) + 0.5; } float x1(float t) { return inRange(cos(t/mat_x1_freq), mat_x1_range.x, mat_x1_range.y); } float y1(float t) { return inRange(sin(t / mat_y1_freq), mat_y1_range.x, mat_y1_range.y); } float x2(float t) { return inRange(inRange(sin(t / mat_x2_freqA), -0.5, 0.5) + inRange(cos(t / mat_x2_freqB), -0.5, 0.5), mat_x2_range.x, mat_x2_range.y); } float y2(float t) { return inRange(inRange(cos(t / mat_y2_freqA), -0.5, 0.5) + inRange(cos(t / mat_y2_freqB), -0.5, 0.5), mat_y2_range.x, mat_y2_range.y); } vec4 materialColorForPixel( vec2 texCoord ) { vec2 position = vec2( 0.5 ); float lineWidth = mat_lineWidth/400; vec4 fillColor = vec4( 1.0 ); vec4 backgroundColor = vec4(0.0); float distField1; float distField2; float distField3; float distField4; vec4 color1; vec4 color2; vec4 color3; vec4 color4; vec4 combinedColor; float timeMult = mat_time * 9; for (float theta = 0 + timeMult; theta <= 1 * PI + timeMult; theta += (3.2/mat_num_lines)) { float rad1 = superformula(theta, mat_rad1_a, // a mat_rad1_b, // b mat_rad1_m, // m = number of spikes mat_rad1_n1, // n1 mat_rad1_n2, // n2 mat_rad1_n3 // n3 ); float rad2 = superformula(theta, mat_rad2_a, // a mat_rad2_b, // b mat_rad2_m, // m = number of spikes mat_rad2_n1, // n1 mat_rad2_n2, // n2 mat_rad2_n3 // n3 ); float rad1X = rad1 * cos(theta) * .01; float rad1Y = rad1 * sin(theta) * .01; float rad2X = rad2 * cos(theta) * .01; float rad2Y = rad2 * sin(theta) * .01; if(mat_line1_bool) { distField1 = blend(distField1, line( texCoord, vec2(inRange(rad1X + x1(timeMult + theta*mat_lineSpacing), -1, 1), inRange(rad1Y + y1(timeMult + theta*mat_lineSpacing), -1, 1)), vec2(inRange(rad2X + x2(timeMult + theta*mat_lineSpacing), -1, 1), inRange(rad2Y + y2(timeMult + theta*mat_lineSpacing), -1, 1)), lineWidth)); color1 = fill( backgroundColor, mat_line1_color, distField1 ); } if(mat_line2_bool) { distField2 = blend(distField2, line( texCoord, vec2(inRange(rad1X + x1(timeMult + theta*mat_lineSpacing), -1, 1), inRange(rad1Y + y1(timeMult + theta*mat_lineSpacing), -1, 1)), vec2(inRange(flip(rad2X + x2(timeMult + theta*mat_lineSpacing)), -1, 1), inRange(rad2Y + y2(timeMult + theta*mat_lineSpacing), -1, 1)), lineWidth)); color2 = fill( backgroundColor, mat_line2_color, distField2 ); } if(mat_line3_bool) { distField3 = blend(distField3, line( texCoord, vec2(inRange(rad1X + x1(timeMult + theta*mat_lineSpacing), -1, 1), inRange(rad1Y + y1(timeMult + theta*mat_lineSpacing), -1, 1)), vec2(inRange(rad2X + x2(timeMult + theta*mat_lineSpacing), -1, 1), inRange(flip(rad2Y + y2(timeMult + theta*mat_lineSpacing)), -1, 1)), lineWidth)); color3 = fill( backgroundColor, mat_line3_color, distField3 ); } if(mat_line4_bool) { distField4 = blend(distField4, line( texCoord, vec2(inRange(rad1X + x1(timeMult + theta*mat_lineSpacing), -1, 1), inRange(rad1Y + y1(timeMult + theta*mat_lineSpacing), -1, 1)), vec2(inRange(flip(rad2X + x2(timeMult + theta*mat_lineSpacing)), -1, 1), inRange(flip(rad2Y + y2(timeMult + theta*mat_lineSpacing)), -1, 1)), lineWidth)); color4 = fill( backgroundColor, mat_line4_color, distField4 ); } } combinedColor = color1 + color2 + color3 + color4; return vec4(combinedColor); }
    Attachments
    Screenshot 2023-04-10 at 9.26.59 AM.png
    Screenshot 2023-04-10 at 9.26.59 AM.png (379.51 KiB) Viewed 2417 times
  • mad-matt
    garageCube team
    Posts: 1478
    Joined: Mon Sep 09, 2013 5:50 pm

    Re: Glitchy rendering of Material after moving to Apple silicon (M2 Pro)

    by mad-matt » Tue Apr 11, 2023 1:47 pm

    It seems that M2 driver doesn't initialize default values for variables, which looks like a good idea. You can solve your shader with

    " float distField1 = 0;
    float distField2 = 0;
    float distField3 = 0;
    float distField4 = 0;
    vec4 color1 = vec4(0);
    vec4 color2 = vec4(0);
    vec4 color3 = vec4(0);
    vec4 color4 = vec4(0);
    "

    full code:

    Code: Select all

    /*{ "CREDIT": "GB", "DESCRIPTION": "Line art using the superformula", "TAGS": "template", "VSN": "1.0", "INPUTS": [ {"LABEL": "Speed", "NAME": "mat_speed", "TYPE": "float", "MIN": 0.0, "MAX": 2.0, "DEFAULT": 1.0 }, {"LABEL": "# of Lines", "NAME": "mat_num_lines", "TYPE": "int", "MIN": 1, "MAX": 100, "DEFAULT": 15 }, {"LABEL": "Line Width", "NAME": "mat_lineWidth", "TYPE": "float", "MIN": 0.2, "MAX": 10, "DEFAULT": 1 }, {"LABEL": "Line Spacing", "NAME": "mat_lineSpacing", "TYPE": "float", "MIN": 0.1, "MAX": 40, "DEFAULT": 1 }, {"LABEL": "Line 1", "NAME": "mat_line1_bool", "TYPE": "bool", "DEFAULT": true }, {"LABEL": "Line 2", "NAME": "mat_line2_bool", "TYPE": "bool", "DEFAULT": true }, {"LABEL": "Line 3", "NAME": "mat_line3_bool", "TYPE": "bool", "DEFAULT": true }, {"LABEL": "Line 4", "NAME": "mat_line4_bool", "TYPE": "bool", "DEFAULT": true }, {"LABEL": "Rad1/A: size A", "NAME": "mat_rad1_a", "TYPE": "float", "MIN": 0, "MAX": 200, "DEFAULT": 1 }, {"LABEL": "Rad1/B: size B", "NAME": "mat_rad1_b", "TYPE": "float", "MIN": 0, "MAX": 200, "DEFAULT": 1 }, {"LABEL": "Rad1/M: num spikes", "NAME": "mat_rad1_m", "TYPE": "float", "MIN": 0, "MAX": 20, "DEFAULT": 1 }, {"LABEL": "Rad1/N1: convex1", "NAME": "mat_rad1_n1", "TYPE": "float", "MIN": 0.4, "MAX": 2, "DEFAULT": 1 }, {"LABEL": "Rad1/N2: convex2", "NAME": "mat_rad1_n2", "TYPE": "float", "MIN": 0, "MAX": 2, "DEFAULT": 1 }, {"LABEL": "Rad1/N3: convex3", "NAME": "mat_rad1_n3", "TYPE": "float", "MIN": 0, "MAX": 2, "DEFAULT": 1 }, {"LABEL": "Rad2/A: size A", "NAME": "mat_rad2_a", "TYPE": "float", "MIN": 0, "MAX": 200, "DEFAULT": 1 }, {"LABEL": "Rad2/B: size B", "NAME": "mat_rad2_b", "TYPE": "float", "MIN": 0, "MAX": 200, "DEFAULT": 1 }, {"LABEL": "Rad2/M: num spikes", "NAME": "mat_rad2_m", "TYPE": "float", "MIN": 0, "MAX": 20, "DEFAULT": 1 }, {"LABEL": "Rad2/N1: convex1", "NAME": "mat_rad2_n1", "TYPE": "float", "MIN": 0.4, "MAX": 2, "DEFAULT": 1 }, {"LABEL": "Rad2/N2: convex2", "NAME": "mat_rad2_n2", "TYPE": "float", "MIN": 0, "MAX": 2, "DEFAULT": 1 }, {"LABEL": "Rad2/N3: convex3", "NAME": "mat_rad2_n3", "TYPE": "float", "MIN": 0, "MAX": 2, "DEFAULT": 1 }, {"LABEL": "Range/X1 Range", "NAME": "mat_x1_range", "TYPE": "floatRange", "DEFAULT": [0.1,0.9], "MIN": 0.0, "MAX": 1.0 }, {"LABEL": "Range/Y1 Range", "NAME": "mat_y1_range", "TYPE": "floatRange", "DEFAULT": [0.1,0.9], "MIN": 0.0, "MAX": 1.0 }, {"LABEL": "Range/X2 Range", "NAME": "mat_x2_range", "TYPE": "floatRange", "DEFAULT": [0.1,0.9], "MIN": 0.0, "MAX": 1.0 }, {"LABEL": "Range/Y2 Range", "NAME": "mat_y2_range", "TYPE": "floatRange", "DEFAULT": [0.1,0.9], "MIN": 0.0, "MAX": 1.0 }, {"LABEL": "Freq/X1 Freq", "NAME": "mat_x1_freq", "TYPE": "float", "MIN": 1, "MAX": 300, "DEFAULT": 25 }, {"LABEL": "Freq/Y1 Freq", "NAME": "mat_y1_freq", "TYPE": "float", "MIN": 1, "MAX": 300, "DEFAULT": 20 }, {"LABEL": "Freq/X2 FreqA", "NAME": "mat_x2_freqA", "TYPE": "float", "MIN": 1, "MAX": 300, "DEFAULT": 35 }, {"LABEL": "Freq/X2 FreqB", "NAME": "mat_x2_freqB", "TYPE": "float", "MIN": 1, "MAX": 300, "DEFAULT": 15 }, {"LABEL": "Freq/Y2 FreqA", "NAME": "mat_y2_freqA", "TYPE": "float", "MIN": 1, "MAX": 300, "DEFAULT": 30 }, {"LABEL": "Freq/Y2 FreqB", "NAME": "mat_y2_freqB", "TYPE": "float", "MIN": 1, "MAX": 300, "DEFAULT": 22 }, {"LABEL": "Color/Line1 Color", "NAME": "mat_line1_color", "TYPE": "color", "DEFAULT": [ 0.7, 0.3, 0.6, 1.0 ] }, {"LABEL": "Color/Line2 Color", "NAME": "mat_line2_color", "TYPE": "color", "DEFAULT": [ 0.3, 0.7, 0.6, 1.0 ] }, {"LABEL": "Color/Line3 Color", "NAME": "mat_line3_color", "TYPE": "color", "DEFAULT": [ 0.6, 0.3, 0.7, 1.0 ] }, {"LABEL": "Color/Line4 Color", "NAME": "mat_line4_color", "TYPE": "color", "DEFAULT": [ 0.7, 0.6, 0.3, 1.0 ] }, ], "GENERATORS": [ {"NAME": "mat_time", "TYPE": "time_base", "PARAMS": {"speed": "mat_speed"} }, ], }*/ #include "MadCommon.glsl" #include "MadSDF.glsl" float inRange(float oldVal, float newMin, float newMax) { float oldMin = -1; float oldMax = 1; float newRange = newMax - newMin; float oldRange = oldMax - oldMin; return (((oldVal - oldMin) * newRange) / oldRange) + newMin; } float superformula(float theta, float a, float b, float m, float n1, float n2, float n3) { return pow(pow(abs(cos(m * theta / 4.0) / a), n2) + pow(abs(sin(m * theta / 4.0) / b), n3), -1.0 / n1); } float flip(float n) { // flip number across a 0.5 axis... turn 0.7 into 0.3 or turn 0.1 into 0.9 return (0.5 - n) + 0.5; } float x1(float t) { return inRange(cos(t/mat_x1_freq), mat_x1_range.x, mat_x1_range.y); } float y1(float t) { return inRange(sin(t / mat_y1_freq), mat_y1_range.x, mat_y1_range.y); } float x2(float t) { return inRange(inRange(sin(t / mat_x2_freqA), -0.5, 0.5) + inRange(cos(t / mat_x2_freqB), -0.5, 0.5), mat_x2_range.x, mat_x2_range.y); } float y2(float t) { return inRange(inRange(cos(t / mat_y2_freqA), -0.5, 0.5) + inRange(cos(t / mat_y2_freqB), -0.5, 0.5), mat_y2_range.x, mat_y2_range.y); } vec4 materialColorForPixel( vec2 texCoord ) { vec2 position = vec2( 0.5 ); float lineWidth = mat_lineWidth/400; vec4 fillColor = vec4( 1.0 ); vec4 backgroundColor = vec4(0.0); float distField1 = 0; float distField2 = 0; float distField3 = 0; float distField4 = 0; vec4 color1 = vec4(0); vec4 color2 = vec4(0); vec4 color3 = vec4(0); vec4 color4 = vec4(0); vec4 combinedColor = vec4(0); float timeMult = mat_time * 9; for (float theta = 0 + timeMult; theta <= 1 * PI + timeMult; theta += (3.2/mat_num_lines)) { float rad1 = superformula(theta, mat_rad1_a, // a mat_rad1_b, // b mat_rad1_m, // m = number of spikes mat_rad1_n1, // n1 mat_rad1_n2, // n2 mat_rad1_n3 // n3 ); float rad2 = superformula(theta, mat_rad2_a, // a mat_rad2_b, // b mat_rad2_m, // m = number of spikes mat_rad2_n1, // n1 mat_rad2_n2, // n2 mat_rad2_n3 // n3 ); float rad1X = rad1 * cos(theta) * .01; float rad1Y = rad1 * sin(theta) * .01; float rad2X = rad2 * cos(theta) * .01; float rad2Y = rad2 * sin(theta) * .01; if(mat_line1_bool) { distField1 = blend(distField1, line( texCoord, vec2(inRange(rad1X + x1(timeMult + theta*mat_lineSpacing), -1, 1), inRange(rad1Y + y1(timeMult + theta*mat_lineSpacing), -1, 1)), vec2(inRange(rad2X + x2(timeMult + theta*mat_lineSpacing), -1, 1), inRange(rad2Y + y2(timeMult + theta*mat_lineSpacing), -1, 1)), lineWidth)); color1 = fill( backgroundColor, mat_line1_color, distField1 ); } if(mat_line2_bool) { distField2 = blend(distField2, line( texCoord, vec2(inRange(rad1X + x1(timeMult + theta*mat_lineSpacing), -1, 1), inRange(rad1Y + y1(timeMult + theta*mat_lineSpacing), -1, 1)), vec2(inRange(flip(rad2X + x2(timeMult + theta*mat_lineSpacing)), -1, 1), inRange(rad2Y + y2(timeMult + theta*mat_lineSpacing), -1, 1)), lineWidth)); color2 = fill( backgroundColor, mat_line2_color, distField2 ); } if(mat_line3_bool) { distField3 = blend(distField3, line( texCoord, vec2(inRange(rad1X + x1(timeMult + theta*mat_lineSpacing), -1, 1), inRange(rad1Y + y1(timeMult + theta*mat_lineSpacing), -1, 1)), vec2(inRange(rad2X + x2(timeMult + theta*mat_lineSpacing), -1, 1), inRange(flip(rad2Y + y2(timeMult + theta*mat_lineSpacing)), -1, 1)), lineWidth)); color3 = fill( backgroundColor, mat_line3_color, distField3 ); } if(mat_line4_bool) { distField4 = blend(distField4, line( texCoord, vec2(inRange(rad1X + x1(timeMult + theta*mat_lineSpacing), -1, 1), inRange(rad1Y + y1(timeMult + theta*mat_lineSpacing), -1, 1)), vec2(inRange(flip(rad2X + x2(timeMult + theta*mat_lineSpacing)), -1, 1), inRange(flip(rad2Y + y2(timeMult + theta*mat_lineSpacing)), -1, 1)), lineWidth)); color4 = fill( backgroundColor, mat_line4_color, distField4 ); } } combinedColor = color1 + color2 + color3 + color4; return combinedColor+vec4(0,0,0,1); }

Who is online

Users browsing this forum: No registered users and 25 guests