teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

つなぎ目ブレンドに特化したバージョンを検討

2019/03/02 22:33

投稿

Bongo
Bongo

スコア10816

answer CHANGED
@@ -118,4 +118,122 @@
118
118
 
119
119
  黄緑芝生の手前に緑芝生を配置し、緑芝生のマテリアルをその「Sprites/Gradient Alpha」を使ったものに差し替えたところ、下図のようになりました。
120
120
 
121
- ![結果](56f7d0778df4ec5261342620f98e876d.gif)
121
+ ![結果](56f7d0778df4ec5261342620f98e876d.gif)
122
+
123
+ #追記
124
+ 不透明にしたいエッジを選択する方式を検討してみました。同じくSprites-Default.shaderをベースに下記のように改造し...
125
+
126
+ ```ShaderLab
127
+ // Unity built-in shader source. Copyright (c) 2016 Unity Technologies. MIT license (see license.txt)
128
+
129
+ Shader "Sprites/Edge Gradient Alpha"
130
+ {
131
+ Properties
132
+ {
133
+ [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}
134
+ _Color ("Tint", Color) = (1,1,1,1)
135
+ [MaterialToggle] PixelSnap ("Pixel snap", Float) = 0
136
+ [HideInInspector] _RendererColor ("RendererColor", Color) = (1,1,1,1)
137
+ [HideInInspector] _Flip ("Flip", Vector) = (1,1,1,1)
138
+ [PerRendererData] _AlphaTex ("External Alpha", 2D) = "white" {}
139
+ [PerRendererData] _EnableExternalAlpha ("Enable External Alpha", Float) = 0
140
+
141
+ [Space]
142
+ [Header(Gradient)]
143
+ _GradientAlpha1 ("Alpha 1", Range(0, 1)) = 0
144
+ _GradientAlpha2 ("Alpha 2", Range(0, 1)) = 1
145
+ [PowerSlider(2.0)] _GradientExponent ("Exponent", Range(0.125, 8)) = 2
146
+ [Toggle] _GradientEdgeTop ("Top", Float) = 0
147
+ [Toggle] _GradientEdgeBottom ("Bottom", Float) = 0
148
+ [Toggle] _GradientEdgeLeft ("Left", Float) = 0
149
+ [Toggle] _GradientEdgeRight ("Right", Float) = 0
150
+ }
151
+
152
+ SubShader
153
+ {
154
+ Tags
155
+ {
156
+ "Queue"="Transparent"
157
+ "IgnoreProjector"="True"
158
+ "RenderType"="Transparent"
159
+ "PreviewType"="Plane"
160
+ "CanUseSpriteAtlas"="True"
161
+ }
162
+
163
+ Cull Off
164
+ Lighting Off
165
+ ZWrite Off
166
+ Blend One OneMinusSrcAlpha
167
+
168
+ Pass
169
+ {
170
+ CGPROGRAM
171
+ #pragma vertex vert
172
+ #pragma fragment frag
173
+ #pragma target 2.0
174
+ #pragma multi_compile_instancing
175
+ #pragma multi_compile _ PIXELSNAP_ON
176
+ #pragma multi_compile _ ETC1_EXTERNAL_ALPHA
177
+ #include "UnitySprites.cginc"
178
+
179
+ float _GradientAlpha1;
180
+ float _GradientAlpha2;
181
+ float _GradientExponent;
182
+ float _GradientEdgeTop;
183
+ float _GradientEdgeBottom;
184
+ float _GradientEdgeLeft;
185
+ float _GradientEdgeRight;
186
+
187
+ struct v2fCustom
188
+ {
189
+ float4 vertex : SV_POSITION;
190
+ fixed4 color : COLOR;
191
+ float2 texcoord : TEXCOORD0;
192
+ float2 position : TEXCOORD1; // グラデーション用の位置
193
+ UNITY_VERTEX_OUTPUT_STEREO
194
+ };
195
+
196
+ v2fCustom vert(appdata_t IN)
197
+ {
198
+ v2fCustom OUT;
199
+
200
+ UNITY_SETUP_INSTANCE_ID (IN);
201
+ UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(OUT);
202
+
203
+ OUT.vertex = UnityFlipSprite(IN.vertex, _Flip);
204
+ OUT.vertex = UnityObjectToClipPos(OUT.vertex);
205
+ OUT.texcoord = IN.texcoord;
206
+ OUT.color = IN.color * _Color * _RendererColor;
207
+ OUT.position = IN.vertex.xy * 2;
208
+
209
+ #ifdef PIXELSNAP_ON
210
+ OUT.vertex = UnityPixelSnap (OUT.vertex);
211
+ #endif
212
+
213
+ return OUT;
214
+ }
215
+
216
+ fixed4 frag(v2fCustom IN) : SV_Target
217
+ {
218
+ fixed4 c = SampleSpriteTexture (IN.texcoord) * IN.color;
219
+
220
+ float alpha = saturate(dot(float4(
221
+ pow(saturate(_GradientEdgeTop * IN.position.y), _GradientExponent),
222
+ pow(saturate(_GradientEdgeBottom * -IN.position.y), _GradientExponent),
223
+ pow(saturate(_GradientEdgeLeft * -IN.position.x), _GradientExponent),
224
+ pow(saturate(_GradientEdgeRight * IN.position.x), _GradientExponent)), 1));
225
+ c.a *= saturate(lerp(_GradientAlpha1, _GradientAlpha2, alpha));
226
+
227
+ c.rgb *= c.a;
228
+
229
+ return c;
230
+ }
231
+ ENDCG
232
+ }
233
+ }
234
+ }
235
+ ```
236
+
237
+ インスペクタ上で各チェックボックスを切り替えると、その方向のエッジ表示が切り替わります。
238
+
239
+ ![結果](cd51bb17730bee8893e7315f94879fbf.gif)