海の底または近海を漂うナニカ?

きのむくままにいろいろかくですよー(≧◇≦)

Study!シェーダー!unityのやつ! vertexshader でアニメーション!の巻(≧◇≦)

VertexShaderで簡単なアニメーション!

ってわけで今回もvertexシェーダーをちょびっと弄ってみようと思うです。
ぶっちゃけ今回作ったのは宴会芸に使えるかなーってレベルのしょうもないやつですが、色々応用聞かせれば面白いこともできそうなのでご紹介。

前回の記事は下のやつです。今回はどーんなので、わからぬ…って方は前の見てもらうとよいです。(ノД`)・゜・。
deep-or-near-sea.hateblo.jp

ちなみに作ったのはこんなんです。

f:id:matasaburou1999:20180619211303g:plain

たてにのびたーりちじんだーり!って感じですね。(>_<)

ってわけでいきなりコードどーん!

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へ値が変化する周期(ぐるぐる回る時間時計で言うなら針の速さ)が違うらしいですよ(>_<)。

ってっでー(≧◇≦)/

続く!