透明処理で切り抜かれたImageに、パターン画像を加算してこんな感じのを作りたい。
なかなか上手くいかなくて色々試してみた。
MASK処理を使う
多分一番簡単な方法。
ふきだし画像の下に半透明なパターン画像を置いて、ふきだしにマスクを追加する。
ただし、ステンシル処理してるところに被るとマスクが上手く働かない。
パターンを加算するマテリアルを適用
ふきだし画像の Material にパターン描写するような特性をつける。
シェーダーもいっぱいあるのでいろいろ試してみるが上手くいかない※。
Particles > Additive 付近がそれっぽいけど無理だった。
※シェーダー知識はほぼゼロ
スクリプトで設定
前に文字でやったように Texture2D をイジって設定する。
何でも出来るけど処理対象が多いとそれだけ遅くなる。
今回のケースだとスマホで使い物にならないレベルだったので却下。
シェーダーを作る
これはしたくなかったけど処理が早くて何でも出来る。
ここからビルドインシェーダーをDLして、参考にしながら弄ってみる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
Shader "Custom/Additive" { Properties { _MainTex ("Tmp Texture", 2D) = "" {} _MainTex2 ("Pattern Texture", 2D) = "" {} } Category { Tags { "Queue"="Overlay+1" "IgnoreProjector"="True" "RenderType"="Overlay" "PreviewType"="Plane" } Blend SrcAlpha OneMinusSrcAlpha SubShader { Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #pragma target 2.0 #pragma multi_compile_particles #pragma multi_compile_fog #include "UnityCG.cginc" sampler2D _MainTex; sampler2D _MainTex2; struct appdata_t {float4 vertex : POSITION; fixed4 color : COLOR; float2 texcoord : TEXCOORD0;}; struct v2f { float4 vertex : SV_POSITION; fixed4 color : COLOR; float2 texcoord : TEXCOORD0;}; float4 _MainTex_ST; v2f vert (appdata_t v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.color = v.color; o.texcoord = TRANSFORM_TEX(v.texcoord,_MainTex); return o; } fixed4 frag (v2f i) : SV_Target { fixed3 tex = tex2D(_MainTex2, i.texcoord).rgb - fixed3(0.5,0.5,0.5); fixed4 col = fixed4( i.color.rgb + i.color.rgb * tex * 0.1 + tex * 0.1, tex2D(_MainTex, i.texcoord).a); return col; } ENDCG } } } } |
_MainTex(ふきだし)の色とアルファ値に_MainTex2(パターン)の色を加算する。
パターンは下のような白黒のを用意して 0.5 引くことでどんな色に対してもそれっぽいパターンを表現できるようにした。
色々やったけどシェーダーへの理解はまったく進まない…。
理解しようと思えない感じはなんなんだろう。