need help with math for glow effect

I’m new to shaders, and I’ve been working on a shader for a while now that outlines the blocks in a texture, and then having that outline emit a glow kind of like neon. It currently works exactly how i want it to, but it’s become rather slow so i was wondering if anyone could help me with the math to do this.

here is the code:

float testInt1 = distance(IN.worldPos, _P1Loc.xyz);
                float testInt2 = distance(IN.worldPos, _P2Loc.xyz);
                float testInt3 = distance(IN.worldPos, _P3Loc.xyz);
                float testInt4 = distance(IN.worldPos, _P4Loc.xyz);
                half yTex = _MainTex_TexelSize.y;
                half xTex = _MainTex_TexelSize.x;
                half IN0X = IN.uv_MainTex.x;
                half INX = IN.uv_MainTex.x + xTex;
                half IN2X = IN.uv_MainTex.x + xTex + xTex;
                half IN3X = IN.uv_MainTex.x + xTex + xTex + xTex;
                half IN4X = IN.uv_MainTex.x + xTex + xTex + xTex + xTex;
                half IN5X = IN.uv_MainTex.x + xTex + xTex + xTex + xTex + xTex;
                half IN6X = IN.uv_MainTex.x + xTex + xTex + xTex + xTex + xTex + xTex;
                half INrX = IN.uv_MainTex.x - xTex;
                half INr2X = IN.uv_MainTex.x - xTex - xTex;
                half INr3X = IN.uv_MainTex.x - xTex - xTex - xTex;
                half INr4X = IN.uv_MainTex.x - xTex - xTex - xTex - xTex;
                half INr5X = IN.uv_MainTex.x - xTex - xTex - xTex - xTex - xTex;
                half INr6X = IN.uv_MainTex.x - xTex - xTex - xTex - xTex - xTex - xTex;
                half IN0Y = IN.uv_MainTex.y;
                half INY = IN.uv_MainTex.y + yTex;
                half IN2Y = IN.uv_MainTex.y + yTex + yTex;
                half IN3Y = IN.uv_MainTex.y + yTex + yTex + yTex;
                half IN4Y = IN.uv_MainTex.y + yTex + yTex + yTex + yTex;
                half IN5Y = IN.uv_MainTex.y + yTex + yTex + yTex + yTex + yTex;
                half IN6Y = IN.uv_MainTex.y + yTex + yTex + yTex + yTex + yTex + yTex;
                half INrY = IN.uv_MainTex.y - yTex;
                half INr2Y = IN.uv_MainTex.y - yTex - yTex;
                half INr3Y = IN.uv_MainTex.y - yTex - yTex - yTex;
                half INr4Y = IN.uv_MainTex.y - yTex - yTex - yTex - yTex;
                half INr5Y = IN.uv_MainTex.y - yTex - yTex - yTex - yTex - yTex;
                half INr6Y = IN.uv_MainTex.y - yTex - yTex - yTex - yTex - yTex - yTex;
              
                fixed OutLine1 = tex2D(_P1Tex, IN.uv_MainTex).a
                    * (((tex2D(_P1Tex, fixed2(IN0X, INY)).a * tex2D(_P1Tex, fixed2(IN0X, INrY)).a
                    * tex2D(_P1Tex, fixed2(INrX, IN0Y)).a * tex2D(_P1Tex, fixed2(INX, IN0Y)).a
                    * tex2D(_P1Tex, fixed2(INrX, INrY)).a * tex2D(_P1Tex, fixed2(INrX, INY)).a
                    * tex2D(_P1Tex, fixed2(INX, INY)).a * tex2D(_P1Tex, fixed2(INX, INrY)).a
                    * tex2D(_P1Tex, fixed2(IN0X, INr2Y)).a * tex2D(_P1Tex, fixed2(IN0X, IN2Y)).a
                    * tex2D(_P1Tex, fixed2(INr2X, IN0Y)).a * tex2D(_P1Tex, fixed2(IN2X, IN0Y)).a) * -1) + 1);

                fixed inGlow1 = (tex2D(_P1Tex, IN.uv_MainTex).a * (((((tex2D(_P1Tex, fixed2(IN6X, IN0Y)).a * tex2D(_P1Tex, fixed2(IN3X, IN0Y)).a * tex2D(_P1Tex, fixed2(IN4X, IN0Y)).a * tex2D(_P1Tex, fixed2(IN5X, IN0Y)).a) * -1) + 1) * (6 - tex2D(_P1Tex, fixed2(IN5X, IN0Y)).a - tex2D(_P1Tex, fixed2(IN4X, IN0Y)).a - tex2D(_P1Tex, fixed2(IN3X, IN0Y)).a - tex2D(_P1Tex, fixed2(IN2X, IN0Y)).a - tex2D(_P1Tex, fixed2(INX, IN0Y)).a)) +
                    ((((tex2D(_P1Tex, fixed2(INr6X, IN0Y)).a * tex2D(_P1Tex, fixed2(INr3X, IN0Y)).a * tex2D(_P1Tex, fixed2(INr4X, IN0Y)).a * tex2D(_P1Tex, fixed2(INr5X, IN0Y)).a) * -1) + 1) * (6 - tex2D(_P1Tex, fixed2(INr5X, IN0Y)).a - tex2D(_P1Tex, fixed2(INr4X, IN0Y)).a - tex2D(_P1Tex, fixed2(INr3X, IN0Y)).a - tex2D(_P1Tex, fixed2(INr2X, IN0Y)).a - tex2D(_P1Tex, fixed2(INrX, IN0Y)).a)) +
                    ((((tex2D(_P1Tex, fixed2(IN0X, IN6Y)).a * tex2D(_P1Tex, fixed2(IN0X, IN3Y)).a * tex2D(_P1Tex, fixed2(IN0X, IN4Y)).a * tex2D(_P1Tex, fixed2(IN0X, IN5Y)).a) * -1) + 1) * (6 - tex2D(_P1Tex, fixed2(IN0X, IN5Y)).a - tex2D(_P1Tex, fixed2(IN0X, IN4Y)).a - tex2D(_P1Tex, fixed2(IN0X, IN3Y)).a - tex2D(_P1Tex, fixed2(IN0X, IN2Y)).a - tex2D(_P1Tex, fixed2(IN0X, INY)).a)) +
                    ((((tex2D(_P1Tex, fixed2(IN4X, IN4Y)).a * tex2D(_P1Tex, fixed2(IN3X, IN3Y)).a * tex2D(_P1Tex, fixed2(IN2X, IN2Y)).a) * -1) + 1) * (4 - tex2D(_P1Tex, fixed2(IN4X, IN4Y)).a - tex2D(_P1Tex, fixed2(IN3X, IN3Y)).a - tex2D(_P1Tex, fixed2(IN2X, IN2Y)).a - tex2D(_P1Tex, fixed2(INX, INY)).a)) +
                    ((((tex2D(_P1Tex, fixed2(INr4X, IN4Y)).a * tex2D(_P1Tex, fixed2(INr3X, IN3Y)).a * tex2D(_P1Tex, fixed2(INr2X, IN2Y)).a) * -1) + 1) * (4 - tex2D(_P1Tex, fixed2(INr4X, IN4Y)).a - tex2D(_P1Tex, fixed2(INr3X, IN3Y)).a - tex2D(_P1Tex, fixed2(INr2X, IN2Y)).a - tex2D(_P1Tex, fixed2(INrX, INY)).a)) +
                    ((((tex2D(_P1Tex, fixed2(IN4X, INr4Y)).a * tex2D(_P1Tex, fixed2(IN3X, INr3Y)).a * tex2D(_P1Tex, fixed2(IN2X, INr2Y)).a) * -1) + 1) * (4 - tex2D(_P1Tex, fixed2(IN4X, INr4Y)).a - tex2D(_P1Tex, fixed2(IN3X, INr3Y)).a - tex2D(_P1Tex, fixed2(IN2X, INr2Y)).a - tex2D(_P1Tex, fixed2(INX, INrY)).a)) +
                    ((((tex2D(_P1Tex, fixed2(INr4X, INr4Y)).a * tex2D(_P1Tex, fixed2(INr3X, INr3Y)).a * tex2D(_P1Tex, fixed2(INr2X, INr2Y)).a) * -1) + 1) * (4 - tex2D(_P1Tex, fixed2(INr4X, INr4Y)).a - tex2D(_P1Tex, fixed2(INr3X, INr3Y)).a - tex2D(_P1Tex, fixed2(INr2X, INr2Y)).a - tex2D(_P1Tex, fixed2(INrX, INrY)).a)) +
                    ((((tex2D(_P1Tex, fixed2(IN0X, INr6Y)).a * tex2D(_P1Tex, fixed2(IN0X, INr3Y)).a * tex2D(_P1Tex, fixed2(IN0X, INr4Y)).a * tex2D(_P1Tex, fixed2(IN0X, INr5Y)).a) * -1) + 1) * (6 - tex2D(_P1Tex, fixed2(IN0X, INr5Y)).a - tex2D(_P1Tex, fixed2(IN0X, INr4Y)).a - tex2D(_P1Tex, fixed2(IN0X, INr3Y)).a - tex2D(_P1Tex, fixed2(IN0X, INr2Y)).a - tex2D(_P1Tex, fixed2(IN0X, INrY)).a))) / 28) * ((OutLine1 * -1) + 1);

                fixed outGlow1 = ((tex2D(_P1Tex, IN.uv_MainTex).a * -1) + 1) * (tex2D(_P1Tex, fixed2(IN0X, INY)).a + tex2D(_P1Tex, fixed2(IN0X, IN2Y)).a + tex2D(_P1Tex, fixed2(IN0X, IN3Y)).a + tex2D(_P1Tex, fixed2(IN0X, IN4Y)).a +
                    tex2D(_P1Tex, fixed2(IN0X, INrY)).a + tex2D(_P1Tex, fixed2(IN0X, INr2Y)).a + tex2D(_P1Tex, fixed2(IN0X, INr3Y)).a + tex2D(_P1Tex, fixed2(IN0X, INr4Y)).a +
                    tex2D(_P1Tex, fixed2(INX, IN0Y)).a + tex2D(_P1Tex, fixed2(IN2X, IN0Y)).a + tex2D(_P1Tex, fixed2(IN3X, IN0Y)).a + tex2D(_P1Tex, fixed2(IN4X, IN0Y)).a +
                    tex2D(_P1Tex, fixed2(INrX, IN0Y)).a + tex2D(_P1Tex, fixed2(INr2X, IN0Y)).a + tex2D(_P1Tex, fixed2(INr3X, IN0Y)).a + tex2D(_P1Tex, fixed2(INr4X, IN0Y)).a +
                    tex2D(_P1Tex, fixed2(INX, INY)).a + tex2D(_P1Tex, fixed2(IN2X, IN2Y)).a + tex2D(_P1Tex, fixed2(IN3X, IN3Y)).a + tex2D(_P1Tex, fixed2(INr3X, IN3Y)).a + tex2D(_P1Tex, fixed2(INr2X, IN2Y)).a + tex2D(_P1Tex, fixed2(INrX, INY)).a +
                    tex2D(_P1Tex, fixed2(INX, INrY)).a + tex2D(_P1Tex, fixed2(IN2X, INr2Y)).a + tex2D(_P1Tex, fixed2(IN3X, INr3Y)).a + tex2D(_P1Tex, fixed2(INr3X, INr3Y)).a + tex2D(_P1Tex, fixed2(INr2X, INr2Y)).a + tex2D(_P1Tex, fixed2(INrX, INrY)).a) / 28;

                fixed4 swapCol1 = fixed4(0.1, 1, 0.1, OutLine1 + inGlow1 + outGlow1);

this thread is no longer needed i figured it out. I am more or less moving this into the script.

Oof. That’s probably one of the most verbose ways of writing that shader, but there’s not really anything you can do to optimize the math. That’s not the part that’s slow. To do glow effects requires sampling the texture multiple times, and that’s what is slow. You can sample the texture fewer times and go with a less good looking glow, or you can try using a completely different way of doing this, like precalculating the glow in another texture.