外部から幅を設定できるようにプロパティを追加して、それをもとにclip
を行うことになるかと思います。
一例としては、下記のような形はいかがでしょうか。
ShaderLab
1Shader "Unlit/ClipTopCenterBottom"
2{
3 Properties
4 {
5 _MainTex ("Texture", 2D) = "white" {}
6
7 // 切り取り幅を設定するためのプロパティを追加
8 _Top ("Top", Range(0.0, 1.0)) = 0.1
9 _Center ("Center", Range(0.0, 1.0)) = 0.2
10 _Bottom ("Bottom", Range(0.0, 1.0)) = 0.1
11 }
12 SubShader
13 {
14 Tags { "RenderType" = "Opaque" }
15 Pass
16 {
17 CGPROGRAM
18 #pragma vertex vert
19 #pragma fragment frag
20
21 #include "UnityCG.cginc"
22
23 struct appdata
24 {
25 float4 vertex : POSITION;
26 float2 uv : TEXCOORD0;
27 };
28
29 struct v2f
30 {
31 float2 uv : TEXCOORD0;
32 float4 vertex : SV_POSITION;
33 };
34
35 sampler2D _MainTex;
36 float4 _MainTex_ST;
37
38 v2f vert(appdata v)
39 {
40 v2f o;
41 o.vertex = UnityObjectToClipPos(v.vertex);
42 o.uv = TRANSFORM_TEX(v.uv, _MainTex);
43 return o;
44 }
45
46 // 切り取り幅を受け取る変数を追加
47 // スクリプトから値を設定したい場合、これら「_Top」「_Center」「_Bottom」の名前を引数に
48 // Material.SetFloatなどのユニフォーム変数設定用メソッドを使用する
49 float _Top;
50 float _Center;
51 float _Bottom;
52
53 fixed4 frag(v2f i) : SV_Target
54 {
55 // 下側...ご質問者さんの例示なさった「clip(i.uv.y - 0.5);」を可変にした形
56 clip(i.uv.y - _Bottom);
57
58 // 上側...V座標の上下を逆転し、下側と同様にクリッピングする形
59 clip(1.0 - i.uv.y - _Top);
60
61 // 中央...V座標の中央からの距離を求め、それをもとにクリッピングする形
62 clip(abs(i.uv.y - 0.5) - _Center * 0.5);
63
64 return tex2D(_MainTex, i.uv);
65 }
66 ENDCG
67 }
68 }
69}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。