Question by
Rins · Sep 30, 2016 at 07:32 PM ·
shaderspritealpha-channelpass
Writing to alpha channel of sprite
I want to dynamicaly create alpha mask in the sprite. I have a one sprite with alpha = 0. Shader has two passes. The first analize coordinates and write to the alpha channel. The second read alpha if alpha of pixel = 1 then the second pass returns color of sprite else returns black color.
Problem is the alpha-channel always equal to 1.
Here is the first pass:
#pragma enable_d3d11_debug_symbols
#pragma target 4.0
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
float2 w_pos : TEXTCOOD1;
};
sampler2D _MainTex;
float _Radius;
float3 _Pos;
v2f vert(appdata v)
{
v2f o;
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
o.w_pos = mul(unity_ObjectToWorld, v.vertex).xy;
o.uv = v.uv;
return o;
}
struct FragOut {
fixed4 color : SV_TARGET;
};
FragOut frag(v2f i)
{
float4 mask_col = tex2D(_MainTex, i.uv);
FragOut out_col;
fixed4 red_col = { 1, 0, 0, 1 };
fixed4 transparent = { 0, 0, 0, 0 };
fixed2 pos = i.w_pos;
pos.x -= _Pos.x;
pos.y -= _Pos.y;
out_col.color = red_col;
return out_col;
if (pos.x * pos.x + pos.y * pos.y < _Radius * _Radius || mask_col.a == 1.0)
out_col.color = red_col;
else
out_col.color = transparent;
return out_col;
}
Here is the second pass:
#pragma enable_d3d11_debug_symbols
#pragma target 4.0
#pragma vertex vert
#pragma fragment frag
#include "UnityCG.cginc"
struct appdata
{
float4 vertex : POSITION;
float2 uv : TEXCOORD0;
fixed4 color : COLOR;
};
struct v2f
{
float2 uv : TEXCOORD0;
float4 vertex : SV_POSITION;
fixed4 color : COLOR;
};
sampler2D _MainTex;
v2f vert(appdata v)
{
v2f o;
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
o.color = v.color;
o.uv = v.uv;
return o;
}
fixed4 frag(v2f i) : SV_Target
{
fixed4 col = tex2D(_MainTex, i.uv);
fixed4 black_color = { 0, 0, 0, 1 };
fixed4 color = { 1, col.r, col.g, col.b};
if (col.a == 1.0)
return color;
return black_color;
}
Comment
Your answer

Follow this Question
Related Questions
Shader invert sprite colors 2D 1 Answer
Sprite Occlusion with Stencil Buffer for Surface Shader? 0 Answers
How can I make a shader pass that emits dynamic light? 0 Answers
shader Graph in 2D sprites 0 Answers