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 函数](http://p2.ttnews.xyz/loading.gif)
關鍵字: discard 函数 Properties