Shader: separate alpha texture, independent offset

This shader that I found here does everything I need except that the offsets for MainTex and AlphaTex are linked together. In other words, changing the offset of the AlphaTex texture has no actual effect on its offset. Changing the offset of the MainTex moves both the MainTex and AlphaTex. I would like to be able to change the offsets independently, but I cannot wrap my mind around this code (I’m new to writing shaders). Thank you.

// Unlit alpha-blended shader.
// - no lighting
// - no lightmap support
// - no per-material color

Shader "Unlit/AlphaMask" {
Properties {
	_AlphaVal ("AlphaVal", Range (0,1) ) = 1.0
    _MainTex ("MainTex (Sprite)", 2D) = "white" {}
    _AlphaTex ("AlphaTex (R)", 2D) = "white" {}
}

SubShader {
    Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}
    LOD 100
   
    ZWrite Off
    Blend SrcAlpha OneMinusSrcAlpha
   
    Pass {  
        CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
           
            #include "UnityCG.cginc"

            struct appdata_t {
                float4 vertex : POSITION;
                float2 texcoord : TEXCOORD0;
            };

            struct v2f {
                float4 vertex : SV_POSITION;
                half2 texcoord : TEXCOORD0;
            };

            sampler2D _MainTex;
            sampler2D _AlphaTex;
			float _AlphaVal;
           
            float4 _MainTex_ST;
           
            v2f vert (appdata_t v)
            {
                v2f o;
                o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
                o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex);
                return o;
            }
           
            fixed4 frag (v2f i) : SV_Target
            {
                fixed4 main = tex2D(_MainTex, i.texcoord);
                fixed4 alph = tex2D(_AlphaTex, i.texcoord);
               
                return fixed4(main.r, main.g, main.b, (main.a*alph.r*_AlphaVal));
            }
        ENDCG
    }
}

}

1 Answer

1

Answered my own question. Changes and additions are noted with comments. Hope someone else finds this useful.

// Unlit alpha-blended shader.
// - no lighting
// - no lightmap support
// - no per-material color

Shader "Unlit/AlphaMask" {
Properties {
	_AlphaVal ("AlphaVal", Range (0,1) ) = 1.0
    _MainTex ("MainTex (Sprite)", 2D) = "white" {}
    _AlphaTex ("AlphaTex (R)", 2D) = "white" {}
}

SubShader {
    Tags {"Queue"="Transparent" "IgnoreProjector"="True" "RenderType"="Transparent"}
    LOD 100
   
    ZWrite Off
    Blend SrcAlpha OneMinusSrcAlpha
   
    Pass {  
        CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
           
            #include "UnityCG.cginc"

            struct appdata_t {
                float4 vertex : POSITION;
                float2 texcoord : TEXCOORD0;
				float2 texcoordA : TEXCOORD1; // alpha uv
            };

            struct v2f {
                float4 vertex : SV_POSITION;
                half2 texcoord : TEXCOORD0;
				half2 texcoordA : TEXCOORD1; // alpha uv
            };

            sampler2D _MainTex;
            sampler2D _AlphaTex;
			float _AlphaVal;
           
            float4 _MainTex_ST;
            float4 _AlphaTex_ST; // alpha uv
			
            v2f vert (appdata_t v)
            {
                v2f o;
                o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
                o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex);
				o.texcoordA = TRANSFORM_TEX(v.texcoordA, _AlphaTex); // alpha uv
                return o;
            }
           
            fixed4 frag (v2f i) : SV_Target
            {
                fixed4 main = tex2D(_MainTex, i.texcoord);
                fixed4 alph = tex2D(_AlphaTex, i.texcoordA); // alpha uv
               
                return fixed4(main.r, main.g, main.b, (main.a*alph.r*_AlphaVal));
            }
        ENDCG
    }
}

}

Oh man, I know this is a super old post, but I had looked for hours to find an answer to the exact same problem, and you post helped me solve it instantly! I cannot stress enough -- THANK YOU for posting your answer for others to see :D The internet would be a much better place if everyone was like you!