Unity3D Shader 之 Clip 函数

clip()函数可以丢弃掉一些不满足条件的像素

比如clip(xx.a-0.3)将丢弃掉alpha值小于0.3的像素。

等价于

if(xx.a<0.3){

discard;

}

基于这个函数我们可以控制显示不同的部分,通过变化不同的条件,比如判断世界坐标,判断alpha值等等,可以实现消融效果等。

下面的shader ,只显示世界坐标 y 值大于1的部分。

下面代码用于计算顶点的世界坐标,便于传入fragment shader.

o.worldPos = mul(unity_ObjectToWorld, v.vertex);

完整代码如下

// Upgrade NOTE: replaced '_Object2World' with 'unity_ObjectToWorld'
Shader "Unlit/TestClip"
{
 Properties
 {
 _MainTex ("Texture", 2D) = "white" {}
 }
 SubShader
 {
 Tags { "RenderType"="Opaque" }
 LOD 100
 Pass
 {
 CGPROGRAM
 #pragma vertex vert
 #pragma fragment frag
 // make fog work
 // #pragma multi_compile_fog
 
 #include "UnityCG.cginc"
 struct appdata
 {
 float4 vertex : POSITION;
 float2 uv : TEXCOORD0;
 };
 struct v2f
 {
 float2 uv : TEXCOORD0;
 float4 vertex : POSITION;
 float4 worldPos : TEXCOORD1;
 };
 sampler2D _MainTex;
 float4 _MainTex_ST;
 
 v2f vert (appdata v)
 {
 v2f o;
 o.worldPos = mul(unity_ObjectToWorld, v.vertex);
 o.vertex = UnityObjectToClipPos(v.vertex);
 o.uv = v.uv;
 return o;
 }
 
 fixed4 frag (v2f i) : SV_Target
 {
 fixed4 col = tex2D(_MainTex, i.uv);
 clip(i.worldPos.y-1.0f);
 // if(i.worldPos.y<1){
 // discard;
 // } 
 return col;
 }
 ENDCG
 }
 }
}

将上面的shader赋予一个Cube,上下拖动Cube 极客看到下图效果

Unity3D Shader 之 Clip 函数


分享到:


相關文章: