1,今天在做特效,遇到了破面问题,首先想到的是打开深度写入,然后因为贴图是带透明通道的,
打开深度写入后,会出现本来是有特效的像素点,画深度写入的像素的时候,把之前的特效给剔除了,如图:
,然后想到可以用alphatest进行剔除半透的像素,这样半透的地方就不会有深度(应该是这么理解?)
然后用clip()进行剔除:上代码:(代码未整理,是ASE有一部分)
Shader "FX/CommonTest"
{
Properties
{
[HDR]_MainTexCor("MainTexCor", Color) = (1,1,1,1)
_MainTex("MainTex", 2D) = "white" {}
_MainTexSpeedU("MainTexSpeedU", Float) = 0
_MainTexSpeedV("MainTexSpeedV", Float) = 0
_NoiseTex("NoiseTex", 2D) = "white" {}
_NoiseStrenth("NoiseStrenth", Float) = 0
_NoiseTexSpeedV("NoiseTexSpeedV", Float) = 0
_NoiseTexSpeedU("NoiseTexSpeedU", Float) = 0
_DissolveTex("DissolveTex", 2D) = "white" {}
_DissolveValue("DissolveValue", Range( 0 , 1)) = 0.3176471
_DissolveTexSpeedU("DissolveTexSpeedU", Float) = 0
_DissolveTexSpeedV("DissolveTexSpeedV", Float) = 0
_Cutoff("Alpha Cutoff",Range(0,1)) = 0.5//关键地方标注
[Enum(UnityEngine.Rendering.CullMode)] _Cull ("Cull Mode", Float) = 2//enum()枚举函数,将CullMode写到属性面板,默认值“0”代表是off,“1”代表front"2"代表back
[Enum(UnityEngine.Rendering.CompareFunction)] _ZTest ("ZTest", Float) = 04//默认值从0到8本别代表了test类型
[Enum(Off, 0, On, 1)] _ZWrite ("ZWrite", Float) = 0
}
SubShader
{
Tags { "Queue" = "Transparent" "IgnoreProjector" = "True" "RenderType" = "TransparentCutout" }
LOD 100
CGINCLUDE
#pragma target 3.0
ENDCG
Blend SrcAlpha OneMinusSrcAlpha, SrcAlpha OneMinusSrcAlpha
AlphaToMask Off
Cull [_Cull]
ColorMask RGBA
ZWrite [_ZWrite]
ZTest [_ZTest]
Offset 0 , 0
Pass
{
Name "Unlit"
Tags { "LightMode"="ForwardBase" }
CGPROGRAM
#ifndef UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX
#define UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(input)
#endif
#pragma vertex vert
#pragma fragment frag
#pragma multi_compile_instancing
#include "UnityCG.cginc"
#include "UnityShaderVariables.cginc"
struct appdata
{
float4 vertex : POSITION;
float4 color : COLOR;
float4 ase_texcoord : TEXCOORD0;
UNITY_VERTEX_INPUT_INSTANCE_ID
};
struct v2f
{
float4 vertex : SV_POSITION;
#ifdef ASE_NEEDS_FRAG_WORLD_POSITION
float3 worldPos : TEXCOORD0;
#endif
float4 ase_color : COLOR;
float4 ase_texcoord1 : TEXCOORD1;
UNITY_VERTEX_INPUT_INSTANCE_ID
UNITY_VERTEX_OUTPUT_STEREO
};
uniform sampler2D _MainTex;
uniform float _NoiseStrenth;
uniform sampler2D _NoiseTex;
uniform float _NoiseTexSpeedU;
uniform float4 _NoiseTex_ST;
uniform float _NoiseTexSpeedV;
uniform float _MainTexSpeedU;
uniform float4 _MainTex_ST;
uniform float _MainTexSpeedV;
uniform float4 _MainTexCor;
uniform sampler2D _DissolveTex;
uniform float _DissolveTexSpeedU;
uniform float4 _DissolveTex_ST;
uniform float _DissolveTexSpeedV;
uniform float _DissolveValue;
float _Cutoff;
v2f vert ( appdata v )
{
v2f o;
UNITY_SETUP_INSTANCE_ID(v);
UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
UNITY_TRANSFER_INSTANCE_ID(v, o);
o.ase_color = v.color;
o.ase_texcoord1.xy = v.ase_texcoord.xy;
//setting value to unused interpolator channels and avoid initialization warnings
o.ase_texcoord1.zw = 0;
float3 vertexValue = float3(0, 0, 0);
#if ASE_ABSOLUTE_VERTEX_POS
vertexValue = v.vertex.xyz;
#endif
vertexValue = vertexValue;
#if ASE_ABSOLUTE_VERTEX_POS
v.vertex.xyz = vertexValue;
#else
v.vertex.xyz += vertexValue;
#endif
o.vertex = UnityObjectToClipPos(v.vertex);
#ifdef ASE_NEEDS_FRAG_WORLD_POSITION
o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz;
#endif
return o;
}
fixed4 frag (v2f i ) : SV_Target
{
UNITY_SETUP_INSTANCE_ID(i);
UNITY_SETUP_STEREO_EYE_INDEX_POST_VERTEX(i);
fixed4 finalColor;
#ifdef ASE_NEEDS_FRAG_WORLD_POSITION
float3 WorldPosition = i.worldPos;
#endif
float2 uv_NoiseTex = i.ase_texcoord1.xy * _NoiseTex_ST.xy + _NoiseTex_ST.zw;
float2 appendResult24 = (float2(( ( _Time.y * _NoiseTexSpeedU ) + uv_NoiseTex.x ) , ( ( _Time.y * _NoiseTexSpeedV ) + uv_NoiseTex.y )));
float NoiseValue29 = ( _NoiseStrenth * tex2D( _NoiseTex, appendResult24 ).r );
float2 uv_MainTex = i.ase_texcoord1.xy * _MainTex_ST.xy + _MainTex_ST.zw;
float2 appendResult9 = (float2(( NoiseValue29 + ( ( _Time.y * _MainTexSpeedU ) + uv_MainTex.x ) ) , ( ( _Time.y * _MainTexSpeedV ) + uv_MainTex.y )));
float4 tex2DNode1 = tex2D( _MainTex, appendResult9 );
clip(tex2DNode1.a-_Cutoff);//关键地方标注
float2 uv_DissolveTex = i.ase_texcoord1.xy * _DissolveTex_ST.xy + _DissolveTex_ST.zw;
float2 appendResult52 = (float2(( NoiseValue29 + ( ( _Time.y * _DissolveTexSpeedU ) + uv_DissolveTex.x ) ) , ( ( _Time.y * _DissolveTexSpeedV ) + uv_DissolveTex.y )));
float Dissolve54 = ceil( ( tex2D( _DissolveTex, appendResult52 ).r - _DissolveValue ) );
finalColor = ( i.ase_color * ( tex2DNode1 * _MainTexCor * ( tex2DNode1.a * Dissolve54 ) ) );
return finalColor;
}
ENDCG
}
}
CustomEditor "ASEMaterialInspector"
}