Hey there,
I’m trying to create a shader that will dipslay only a part of the applied texture.
The material is applied to a plane.
Currently the alpha channel is completely ignored, even if I change the _Color variable directly. Color will change but the transparency will not.
The shader has the desired effect if I use
`
half4 frag (v2f i) : COLOR
{
half4 c = tex2D(_MainTex, i.uv) * _Color;
if(i.uv.x > _Bounds[0] &&
i.uv.x < _Bounds[2] &&
i.uv.y > _Bounds[1] &&
i.uv.y < _Bounds[3]){
c.rgb = 1; //works
//c.a = 1 //will not work
}
else{
c.rgb = 0;
//c.a = 0; //will not work
}
return c;
}
`
_Bounds will contain the top left and bottom right corner of the piece of the texture that should be rendered. Like: (topLeftX, topLeftY, bottemRigthX, bottemRightY)
Full shader
`
Shader "Custom/Highlight" {
Properties {
_Color ("Color", Color) = (1,1,1,1)
_MainTex ("Texture", 2D) = "white" { }
_Bounds ("Bounds", Vector) = (0,0,.5,.5)
}
SubShader {
Tags{"Queue"="Transparent"}
Pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
sampler2D _MainTex;
float4 _Bounds;
float4 _Color;
struct v2f {
float4 pos : SV_POSITION;
float2 uv : TEXCOORD0;
};
float4 _MainTex_ST;
v2f vert (appdata_base v)
{
v2f o;
o.pos = mul (UNITY_MATRIX_MVP, v.vertex);
o.uv = TRANSFORM_TEX (v.texcoord, _MainTex);
return o;
}
half4 frag (v2f i) : COLOR
{
half4 c = tex2D(_MainTex, i.uv) * _Color;
if(i.uv.x > _Bounds[0] &&
i.uv.x < _Bounds[2] &&
i.uv.y > _Bounds[1] &&
i.uv.y < _Bounds[3]){
c.a = 1;
}
else{
c.a = 0;
}
return c;
}
ENDCG
}
}
Fallback "VertexLit"
}
`
I could probably solve this by scaling the plane it is applied to but I would rather learn how to use shaders.
Thanks in advance!
P.S, if you know of a way to make it work with tiling as well I would love to know it.