- Home /
Shader CG not taking tiling into account
Hey guys! im pretty new at creating shaders. Im currently working on a shader that blendos two textures and takes into account the alpha i cutoff from the main texture. It works fine, until i try to use offset and scale to set the correct drawing within the spritesheet / atlas. For some reason i do not understand the main texture is not taking the offset and scale values i assign at the inspector, whereas the blend texture is. Could you guys guide me a bit through?
this is my script so far:
Shader "My Shaders/Unlit/Mixer Alpha Blend" {
Properties {
_Blend ("Blend", Range (0,1)) = 0.0
_MainTex ("Texture (A = Transparency)", 2D) = ""
_BlendTexture ("BlendTexture (A = Transparency)", 2D) = ""
_Cutoff ("Alpha Cutoff", Float) = 0.5
}
SubShader {
Tags {"Queue"="transparent" "RenderType"="transparent" }
ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha
Lighting Off
Pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
sampler2D _MainTex;
sampler2D _BlendTexture;
uniform float _Cutoff;
uniform float _Blend;
float4 _MainTex_ST;
float4 _BlendTexture_ST;
struct v2f {
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0;
float2 uv2 : TEXCOORD1;
};
v2f vert (appdata_base v){
v2f o;
o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
o.uv = TRANSFORM_TEX (v.texcoord, _MainTex);
o.uv2 = TRANSFORM_TEX (v.texcoord, _BlendTexture);
return o;
}
half4 frag (v2f i) : COLOR{
float4 MyColor = tex2D (_BlendTexture, i.uv2).rgba;
float4 MyAlpha = tex2D (_MainTex, i.uv).rgba;
if (MyAlpha.a < _Cutoff)
// alpha value less than user-specified threshold?
{
discard; // yes: discard this fragment
}
return lerp(MyAlpha, MyColor , _Blend);
}
ENDCG
}
}
}
Edited: modified script, it now works as expected!
Answer by tanoshimi · Jan 13, 2014 at 03:50 PM
You use TRANSFORM_TEX in the vertex method, but first you need to declare a new variable:
float4 _MainTexure_ST;
_ST variables are automatically populated with the texture scale (x,y) and offset (z,w) values from the correspondingly-named texture (in this case, _MainTexure).
Then, create a vertex method and, in it, write to the uv property of the output structure using the TRANSFORM_TEX macro:
o.uv = TRANSFORM_TEX(v.texcoord, _MainTexure);
(assuming o is your output structure, and v is your input structure)
Hi, thanks for your help, this is what i got so far: Shader "$$anonymous$$y Shaders/Unlit/$$anonymous$$ixer Alpha Blend" {
Properties {
_Blend ("Blend", Range (0,1)) = 0.0
_$$anonymous$$ainTex ("Texture (A = Transparency)", 2D) = ""
_BlendTexture ("BlendTexture (A = Transparency)", 2D) = ""
_Cutoff ("Alpha Cutoff", Float) = 0.5
}
SubShader {
Tags {"Queue"="transparent" "RenderType"="transparent" }
ZWrite Off
Blend SrcAlpha One$$anonymous$$inusSrcAlpha
Lighting Off
Pass {
CGPROGRA$$anonymous$$
#pragma vertex vert_img
#pragma fragment frag
#include "UnityCG.cginc"
sampler2D _$$anonymous$$ainTex;
sampler2D _BlendTexture;
uniform float _Cutoff;
uniform float _Blend;
float4 _$$anonymous$$ainTex_ST;
struct v2f {
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0;
};
v2f vert (appdata_base v){
v2f o;
o.pos = mul (UNITY_$$anonymous$$ATRIX_$$anonymous$$VP, v.vertex);
o.uv = TRANSFOR$$anonymous$$_TEX (v.texcoord, _$$anonymous$$ainTex);
return o;
}
half4 frag (v2f i) : COLOR{
float4 $$anonymous$$yColor = tex2D (_BlendTexture, i.uv).rgba;
float4 $$anonymous$$yAlpha = tex2D (_$$anonymous$$ainTex, i.uv).rgba;
if ($$anonymous$$yAlpha.a < _Cutoff)
// alpha value less than user-specified threshold?
{
discard; // yes: discard this fragment
}
return lerp($$anonymous$$yAlpha, $$anonymous$$yColor , _Blend);
}
ENDCG
}
}
}
but it does not seem to take any effect, any ideas why? thanks again!
i did it! thanks! the error was at line 20 where i called a wrong vertex: #pragma vertex vert
Answer by Hoeloe · Jan 13, 2014 at 09:56 AM
I think it's because you're using the same UV coordinate for both textures. You're necessarily taking the same point from both, which is i.uv
. You'll need to do some transformation to make it work. If I remember correctly, you can do this with the TRANSFORM_TEX
function.
i took a quick look at this but i was not able to solve the issue, could you guide me a little bit further? should i call transform_tex in my frag method? before i call i.uv?