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 函數


分享到:


相關文章: