关于特效想要半透,但是又渲染出现破面,外加跟其他半透模型的穿插严重不对的解决方法

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"
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值