- Home /
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
}
}
}
Answer by Ghisallo · Oct 10, 2014 at 07:09 PM
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 -- THAN$$anonymous$$ YOU for posting your answer for others to see :D The internet would be a much better place if everyone was like you!
Your answer
Follow this Question
Related Questions
Shader with two textures separated by an alpha channel? 1 Answer
Add transparency to this shader? 0 Answers
Need Help adding Main Color Property to a complicated Shader 1 Answer
Offset textures individually into specific world directions 2 Answers
Is using texture offset with displacement shader possible? 0 Answers