Study!シェーダー!unityのやつ! vertexshader でアニメーション!の巻(≧◇≦)
VertexShaderで簡単なアニメーション!
ってわけで今回もvertexシェーダーをちょびっと弄ってみようと思うです。
ぶっちゃけ今回作ったのは宴会芸に使えるかなーってレベルのしょうもないやつですが、色々応用聞かせれば面白いこともできそうなのでご紹介。
前回の記事は下のやつです。今回はどーんなので、わからぬ…って方は前の見てもらうとよいです。(ノД`)・゜・。
deep-or-near-sea.hateblo.jp
ちなみに作ったのはこんなんです。
たてにのびたーりちじんだーり!って感じですね。(>_<)
ってわけでいきなりコードどーん!
Shader "Unlit/minimini" { Properties { _MainTex ("Texture", 2D) = "white" {} _Size ("ShaderSize", Range (0.1, 1)) = 1 } 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; UNITY_FOG_COORDS(1) float4 vertex : SV_POSITION; }; sampler2D _MainTex; float4 _MainTex_ST; float _Size; v2f vert (appdata v) { v.vertex.xyz = v.vertex.xyz * _Size ; v.vertex.y = v.vertex.y * (_SinTime.z + 1.0); v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(v.uv, _MainTex); UNITY_TRANSFER_FOG(o,o.vertex); return o; } fixed4 frag (v2f i) : SV_Target { // sample the texture fixed4 col = tex2D(_MainTex, i.uv); // apply fog UNITY_APPLY_FOG(i.fogCoord, col); return col; } ENDCG } } }
今回、前回のやつ(プロパティから大きさを変えれるやつ)に追記しましたのは、
v2f vert (appdata v) { v.vertex.xyz = v.vertex.xyz * _Size ; v.vertex.y = v.vertex.y * (_SinTime.z + 1.0); v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = TRANSFORM_TEX(v.uv, _MainTex); UNITY_TRANSFER_FOG(o,o.vertex); return o; }
のところの
v.vertex.y = v.vertex.y * (_SinTime.z + 1.0);
これ一行です!
今回は、vertexのY座標(高さ)を _SinTime.z の変化に合わせて大きくしたり小さくしたりな感じです。
参考にしたのはこちらのページ。(いろいろ使えそうなのが書いてある)
Unity - マニュアル: ShaderLab 定義済みの値
Sinと聞くと数学の授業で聞いた謎めいたやつですが、要するに1~-1の間の値をぐるぐると時間に合わせて変わってく感じです。時計の針の高さみたいなイメージですね。
ただ、1~-1という値で動きますので、-の値の時に倍されると、モデルの裏側が表示されてしまいます。それは流石に見栄えが悪いので、+1することでモデルの高さを、 0 ~ 2 倍にするような感じにしています。
この_SinTime.z としているところの z ですが、こちらは、ほかにも ,x .y もしくは、そもそも記述せず _SinTimeとすることもできるようです。
これらの違いは、単純にSinで1~-1へ値が変化する周期(ぐるぐる回る時間時計で言うなら針の速さ)が違うらしいですよ(>_<)。
ってっでー(≧◇≦)/
続く!