Perso, j'utilise le Blend plutôt que l'alpha test:
Code : Tout sélectionner
ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha
Code : Tout sélectionner
ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha
Oui, on m'a soufflé cette idée à l'oreillette. Et celle-ci aussi, qui fonctionne bien :boubouk50 a écrit :La gueule ouverte.
Perso, j'utilise le Blend plutôt que l'alpha test:Code : Tout sélectionner
ZWrite Off Blend SrcAlpha OneMinusSrcAlpha
Code : Tout sélectionner
fixed4 frag (v2f i) : SV_Target
{
half4 mainColor = tex2D(_MainTex, i.texcoord);
fixed4 alpha = tex2D(_Detail, i.texcoord);
fixed4 col = mainColor * alpha;
if (col.a == 0) discard;
return col;
}
Code : Tout sélectionner
fixed4 frag (v2f i) : SV_Target
{
half4 mainColor = tex2D(_MainTex, i.texcoord);
half4 alpha = tex2D(_Detail, i.texcoord*_Detail_ST.xy+_Detail_ST.zw);
fixed4 col = mainColor * alpha;
if (col.a == 0) discard;
return col;
}
Effectivement, c'est ce qu'il faut faire pour avoir l'alphaTest en fragment shader.Iwa a écrit :Code : Tout sélectionner
discard;
Code : Tout sélectionner
if (col.a <= _Cutoff) discard;
boubouk50 a écrit :Effectivement, c'est ce qu'il faut faire pour avoir l'alphaTest en fragment shader.Iwa a écrit :Code : Tout sélectionner
discard;
pour pouvoir gérer le seuil de Cuttout.Code : Tout sélectionner
if (col.a <= _Cutoff) discard;
Tu n'auras pas de dégradé sur l'alpha cependant.
Code : Tout sélectionner
/*
Renders doubled sides objects without lighting. Useful for
grass, trees or foliage.
This shader renders two passes for all geometry, one
for opaque parts and one with semitransparent details.
This makes it possible to render transparent objects
like grass without them being sorted by depth.
*/
Shader "Legacy Shaders/Transparent/Cutout/Soft Edge Unlit" {
Properties {
_Color ("Main Color", Color) = (1, 1, 1, 1)
_MainTex ("Base (RGB) Alpha (A)", 2D) = "white" {}
_Cutoff ("Base Alpha cutoff", Range (0,.9)) = .5
}
SubShader {
Tags { "Queue"="AlphaTest" "IgnoreProjector"="True" "RenderType"="TransparentCutout" }
Lighting off
// Render both front and back facing polygons.
Cull Off
// first pass:
// render any pixels that are more than [_Cutoff] opaque
Pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_fog
#include "UnityCG.cginc"
struct appdata_t {
float4 vertex : POSITION;
float4 color : COLOR;
float2 texcoord : TEXCOORD0;
};
struct v2f {
float4 vertex : SV_POSITION;
fixed4 color : COLOR;
float2 texcoord : TEXCOORD0;
UNITY_FOG_COORDS(1)
};
sampler2D _MainTex;
float4 _MainTex_ST;
fixed _Cutoff;
v2f vert (appdata_t v)
{
v2f o;
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
o.color = v.color;
o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex);
UNITY_TRANSFER_FOG(o,o.vertex);
return o;
}
fixed4 _Color;
fixed4 frag (v2f i) : SV_Target
{
half4 col = _Color * tex2D(_MainTex, i.texcoord);
clip(col.a - _Cutoff);
UNITY_APPLY_FOG(i.fogCoord, col);
return col;
}
ENDCG
}
// Second pass:
// render the semitransparent details.
Pass {
Tags { "RequireOption" = "SoftVegetation" }
// Dont write to the depth buffer
ZWrite off
// Set up alpha blending
Blend SrcAlpha OneMinusSrcAlpha
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_fog
#include "UnityCG.cginc"
struct appdata_t {
float4 vertex : POSITION;
float4 color : COLOR;
float2 texcoord : TEXCOORD0;
};
struct v2f {
float4 vertex : SV_POSITION;
fixed4 color : COLOR;
float2 texcoord : TEXCOORD0;
UNITY_FOG_COORDS(1)
};
sampler2D _MainTex;
float4 _MainTex_ST;
float _Cutoff;
v2f vert (appdata_t v)
{
v2f o;
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
o.color = v.color;
o.texcoord = TRANSFORM_TEX(v.texcoord, _MainTex);
UNITY_TRANSFER_FOG(o,o.vertex);
return o;
}
fixed4 _Color;
fixed4 frag (v2f i) : SV_Target
{
half4 col = _Color * tex2D(_MainTex, i.texcoord);
clip(-(col.a - _Cutoff));
UNITY_APPLY_FOG(i.fogCoord, col);
return col;
}
ENDCG
}
}
}
Code : Tout sélectionner
Shader "Custom/test" {
Properties {
_MainTex ("Base (RGB) Trans (A)", 2D) = "white" {}
_CircleCenter ("Circle Center", vector ) = (0,0,0,0)
_CircleRadius ("Circle Size", float ) = 0.5
}
SubShader {
Tags {"Queue"="Transparent" "IgnoreProjector" = "True" "RenderType"="Transparent" "PreviewType"="Plane"}
LOD 100
Cull Off
Lighting Off
ZWrite Off
ZTest [unity_GUIZTestMode]
Blend SrcAlpha OneMinusSrcAlpha
Pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_fog
#include "UnityCG.cginc"
struct appdata_t {
float4 vertex : POSITION;
float2 texcoord : TEXCOORD0;
};
struct v2f {
float4 vertex : SV_POSITION;
half2 texcoord : TEXCOORD0;
};
sampler2D _MainTex;
float4 _MainTex_ST;
float4 _CircleCenter;
float _CircleRadius;
v2f vert (appdata_t v)
{
v2f o;
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
o.texcoord = v.texcoord;
//TRANSFORM_TEX(v.texcoord, _MainTex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
half4 mainColor = tex2D(_MainTex, i.texcoord);
float circle = distance(float2(_CircleCenter.x,_CircleCenter.y),i.texcoord)*2;
float innerCircle = step(_CircleRadius,circle);
clip(-innerCircle);
return mainColor;
}
ENDCG
}
}
}
Code : Tout sélectionner
float circle = distance(float2(_CircleCenter.x,_CircleCenter.y),i.texcoord)*2;
Code : Tout sélectionner
Shader "Custom/test" {
Properties {
_MainTex ("Base (RGB) Trans (A)", 2D) = "white" {}
_CircleCenter ("Circle Center", vector ) = (0,0,0,0)
_CircleRadius ("Circle Size", float ) = 0.5
_TexWidth ("TexWidth", float ) = 0
_TexHeight ("TexHeight", float) = 0
}
SubShader {
Tags {"Queue"="Transparent" "IgnoreProjector" = "True" "RenderType"="Transparent" "PreviewType"="Plane"}
LOD 100
Cull Off
Lighting Off
ZWrite Off
ZTest [unity_GUIZTestMode]
Blend SrcAlpha OneMinusSrcAlpha
Pass {
CGPROGRAM
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_fog
#include "UnityCG.cginc"
struct appdata_t {
float4 vertex : POSITION;
float2 texcoord : TEXCOORD0;
};
struct v2f {
float4 vertex : SV_POSITION;
half2 texcoord : TEXCOORD0;
};
sampler2D _MainTex;
float4 _MainTex_ST;
float4 _CircleCenter;
float _CircleRadius;
float _TexWidth;
float _TexHeight;
v2f vert (appdata_t v)
{
v2f o;
o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
o.texcoord = v.texcoord;
//TRANSFORM_TEX(v.texcoord, _MainTex);
return o;
}
fixed4 frag (v2f i) : SV_Target
{
half4 mainColor = tex2D(_MainTex, i.texcoord);
float ratio = _TexWidth/_TexHeight;
float circle = distance(float2(_CircleCenter.x*_TexWidth,_CircleCenter.y*_TexHeight),float2(i.texcoord.x*_TexWidth, i.texcoord.y*_TexHeight))*2;
float innerCircle = step(_CircleRadius*_TexHeight,circle);
clip(-innerCircle);
return mainColor;
}
ENDCG
}
}
}
Code : Tout sélectionner
#pragma surface surf Standard fullforwardshadows