- Home /
alpha cutoff shader from map on map with already existing alpha channel
I am very new to shaders, and I need a very specific type of shader for creating this desired effect.
I need a shader that can be animated to do alpha cutoff from a map on a map that already have an alpha channel on its own.
Is this even possible? Or am I just being stupid here??
Just get a source of any of the standard Unity cutout shaders, add your cutoff map to the properties and go on with modifying the shader.
Answer by zharik86 · Dec 14, 2014 at 08:16 AM
If for your object with this shader you don't use light, than write shader on HLSL:
Shader "Custom/CutoutNoLightHLSL" {
Properties {
_Color ("Main Color", Color) = (1,1,1,1)
_MainTex ("Base (RGB) Trans (A)", 2D) = "white" {}
_CutTex ("Cutout (A)", 2D) = "white" {}
_Cutoff ("Alpha cutoff", Range(0,1)) = 0.5
}
SubShader {
Tags { "Queue" = "Transparent" }
Pass {
ZWrite Off // don't write to depth buffer
Blend SrcAlpha OneMinusSrcAlpha // use alpha blending
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
uniform float4 _Color; // define shader property for shaders
uniform sampler2D _MainTex;
uniform sampler2D _CutTex;
uniform float _Cutoff;
struct vertexInput {
float4 vertex : POSITION;
float4 texcoord : TEXCOORD0;
};
struct vertexOutput {
float4 pos : SV_POSITION;
float4 tex : TEXCOORD0;
};
vertexOutput vert(vertexInput input) {
vertexOutput output;
output.tex = input.texcoord;
output.pos = mul(UNITY_MATRIX_MVP, input.vertex);
return output;
}
float4 frag(vertexOutput input) : COLOR {
float2 tp = float2(input.tex.x, input.tex.y); //get textures coordinate
float4 col = tex2D(_MainTex, tp) * _Color; //load main texture
float newOpacity = tex2D(_CutTex, tp).a; //load cuttext
if(newOpacity < _Cutoff) {
newOpacity = 0.0;
} else { //Calculate new opacity, maybe, other formula. I don't know you parametr of change two textures
newOpacity = col.a;
//For example, from your pictures I see, that you change border of two textures as result. Maybe you need next calculation:
//if (newOpacity < _Cutoff + 0.1) {
//newOpacity = ((newOpacity - _Cutoff)/(_Cutoff + 0.1 - newOpacity)) * col.a;
//} else {
//newOpacity = col.a;
//}
}
return float4(col.r, col.g, col.b, newOpacity);
}
ENDCG
}
}
}
But, if you need object with light, write me. Than you need surface shader.I hope that it will help you.
It's close. This still doesnt preserve the opacity of the first texture..
@ragnaros100, Ok, I change little shader in my answer. Than all works.
Awesome dude! This produces the exact result wanted! Thanks man! :D You're awesome
Your answer
Follow this Question
Related Questions
Shader compilation fails for Wii-U 2 Answers
RimLight Shader 0 Answers
Is there a way to create an fading alpha-cutoff effect? 0 Answers
shader problem 0 Answers