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

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

Study!シェーダー!unityのやつ! vertexshader で見た目の大きさをいじってみるの巻(≧◇≦)

Vertex Shader を使ってちょっと遊んでみる

まさに、タイトルの通り、以前Shaderを少し紹介しましたので、その中で出てきた
VertexShaderを使ってちょびっと遊んでみようかと思うです。
前はこれです。
deep-or-near-sea.hateblo.jp

今回、ベースとしましたのは 前回も使いました普通のUnlit/Textureのシェーダーです。
今回、それを少し書き替えました。

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;
				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
		}
	}
}

ポイントとなるのは、Vertex Shader 要するに上のプログラムのvertのところを次のように書き換えました。

v2f vert (appdata v)
	{
	v.vertex.xyz = v.vertex.xyz * _Size;
	v2f o;
	o.vertex = UnityObjectToClipPos(v.vertex);
	o.uv = TRANSFORM_TEX(v.uv, _MainTex);
	UNITY_TRANSFER_FOG(o,o.vertex);
	return o;
}


具体的に何をやっているかというと、各頂点の座標に_Size(大きさを変える倍率)をかけて拡大・縮小しています。
何が起きるかというとーーー!


こんな感じに小さくなります。
f:id:matasaburou1999:20180617200613p:plain
左が元々ので右のが今回のシェーダーの奴ですね。

更に、このかける値_Sizeを以下の部分で、プロパティとして設定しておくことで、unity上でシェーダーの倍率を変更できるようにしているわけですね。

	Properties
	{
		_MainTex ("Texture", 2D) = "white" {}
		_Size ("ShaderSize", Range (0.1, 1)) = 1

	}
||>
[f:id:matasaburou1999:20180617200844p:plain]
こんな感じにunityの画面からシェーダーの設定値を変更できます。(>_<)
ここに表示されるということは、アニメーションとかにも使えるということなのです。
<b>(ただ、vrchatでは、なぜかこのシェーダーの値を使ったアニメーションが反映されないのが少しわからないです)</b>

今回vertexシェーダーで適当に値を触ってみました。
こういう感じで色々な値を触れるですので色々やってみたいですね。

ちなみにカリング(裏面ポリゴンを表示したりとか)の設定も、とかもこの辺で少し弄るだけでできちゃうので是非調べてみてください。(>_<)

てっでー(≧◇≦)/
続く!