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 極客看到下圖效果
關鍵字: discard 函數 Properties