本日はShader枠です。
Shaderでは様々な表現が行えますが、今回はその最も基本的な表現の一つとしてUVに沿ってテクスチャがスクロールするShaderを書いていきます。
〇コード
今回は次のShaderを基に編集していきます。
Shader "Custom/scroll" { Properties { // Main maps. _Color("Color", Color) = (1.0, 1.0, 1.0, 1.0) _MainTex("Albedo", 2D) = "white" {} } SubShader { Pass { Name "Main" Tags{ "RenderType" = "Opaque" "LightMode" = "ForwardBase" } LOD 100 CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" #include "UnityStandardConfig.cginc" #include "UnityStandardUtils.cginc" struct appdata_t { float4 vertex : POSITION; //追加 float2 uv : TEXCOORD0; UNITY_VERTEX_INPUT_INSTANCE_ID }; struct v2f { float4 position : SV_POSITION; float2 uv : TEXCOORD0; UNITY_VERTEX_OUTPUT_STEREO }; fixed4 _Color; sampler2D _MainTex; v2f vert(appdata_t v) { v2f o; UNITY_SETUP_INSTANCE_ID(v); UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); float4 vertexPosition = v.vertex; o.uv = v.uv; o.position = UnityObjectToClipPos(vertexPosition); return o; } fixed4 frag(v2f i, fixed facing : VFACE) : SV_Target { fixed4 albedo = tex2D(_MainTex, i.uv); albedo *= _Color; fixed4 output = albedo; return output; } ENDCG } } Fallback "Hidden/InternalErrorShader" }
上記のShaderではテクスチャが貼られるだけのシンプルかつ基本形なShaderです。
albedoに次のようにTime関数を加えました。
fixed4 frag(v2f i ,fixed facing : VFACE):SV_Target { fixed4 albedo = tex2D(_MainTex, i.uv+_Time); ... }
tex2D関数は何をどのようにというようにテクスチャを指定するため、時間によってどのようにに当たるuv座標が変わることでスクロールするようになりました。
このままではスクロールが早すぎるので次のように変更しました。
Properties { // Main maps. _Color("Color", Color) = (1.0, 1.0, 1.0, 1.0) _scroll("Scroll" ,Range(0,1))=0.1 _MainTex("Albedo", 2D) = "white" {} } ... float _scroll; fixed4 frag(v2f i, fixed facing : VFACE) : SV_Target { fixed4 albedo = tex2D(_MainTex, i.uv+(_Time*_scroll)); }
これでスクロールの速度を変えられるようになりました。
〇本日描いたShader
Shader "Custom/scroll" { Properties { // Main maps. _Color("Color", Color) = (1.0, 1.0, 1.0, 1.0) _scroll("Scroll" ,Range(0,1))=0.1 _MainTex("Albedo", 2D) = "white" {} } SubShader { Pass { Name "Main" Tags{ "RenderType" = "Opaque" "LightMode" = "ForwardBase" } LOD 100 CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" #include "UnityStandardConfig.cginc" #include "UnityStandardUtils.cginc" struct appdata_t { float4 vertex : POSITION; //追加 float2 uv : TEXCOORD0; UNITY_VERTEX_INPUT_INSTANCE_ID }; struct v2f { float4 position : SV_POSITION; float2 uv : TEXCOORD0; UNITY_VERTEX_OUTPUT_STEREO }; fixed4 _Color; sampler2D _MainTex; v2f vert(appdata_t v) { v2f o; UNITY_SETUP_INSTANCE_ID(v); UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); float4 vertexPosition = v.vertex; o.uv = v.uv; o.position = UnityObjectToClipPos(vertexPosition); return o; } float _scroll; fixed4 frag(v2f i, fixed facing : VFACE) : SV_Target { fixed4 albedo = tex2D(_MainTex, i.uv+(_Time*_scroll)); albedo *= _Color; fixed4 output = albedo; return output; } ENDCG } } Fallback "Hidden/InternalErrorShader" }