サーフェスシェーダーで頂点を動かす

去年からちょこちょことシェーダーを勉強しているのだけれど、なかなか思ったように書けるようにならないので、2020年は本腰を入れてシェーダーを勉強しようと思う。

勉強するためにUdemy、書籍、同人誌、ブログなどを参考に進めているが、自分がアウトプットしていかないと憶えないので、ここにはやりたいこととその実装、メモを書いていく。

まずシェーダーで頂点を動かすのをやりたかったので、書いてみた。

Shader "Custom/SimpleVertex"
{
    Properties {
        _BendWeight("Bend Scale", Range(0.0, 1.0)) = 0.2
        _MainTex("Main Texture", 2D) = "white" {}
    }
    SubShader {
        CGPROGRAM
        
        // vertex: vertと指定すると、SurfaceShaderで頂点をいじれる
        #pragma surface surf Lambert vertex:vert
        #define PI 3.14159

        float _BendWeight;
        sampler2D _MainTex;

        struct Input {
            float4 color: Color;
        };

        void vert(inout appdata_full v) {
            // _Timeを使って動きをつくる
            float bend = sin(PI * _Time.x * 20);

            // v.texcoordを使うことでTextureの位置によって動く大きさが変えることができる
            float x = sin(v.texcoord.x * PI);
            float y = sin(v.texcoord.y * PI);
            v.vertex.y +=  _BendWeight * bend * (x+y);
        }

        void surf(Input IN, inout SurfaceOutput o) {
            o.Albedo = IN.color.rgb;
        }

        ENDCG
    }
    FallBack "Diffuse"
}

こちらを参考にさせていただきました。