プログラミング学習日記

プログラミング学習時のメモ帳。

Unity Shader 勉強

Shaderで取り扱われる流れはこの通りである.

f:id:topaz1-3:20220205183047p:plain

最初の入力データ

struct appdata{
    // インスペクター上で指定した値を中心とした拡張点の相対座標
    float4 vertex : POSITION;
    float2 uv : TEXCOORD0;
}

次の頂点シェーダー関数

    v2f vert(appdata v)
    {
        // モデル空間の座標(インスペクタで表示している座標
        // v.vertex

        v2f o;

        // MVP変換を行なった後の座標.wで割る前の視錯体の座標
        o.vertex = UnityObjectToClipPos(v.vertex);

        // wで割った後の投影する画面の座標.左下(0,0)右上(1920,1080)
        // o.vertex /= o.vertex.w;

        // tillingやoffsetを提要した後のuv座標
        o.uv = TRANSFORM_TEX(v.uv, _MainTex);

        return o;
    }

画面上の座標で扱うには o.vertex.wで割る必要がある.

https://light11.hatenadiary.com/entry/2018/06/10/233954

UnityObjectToClipPosでMVP変換が行われている.

出力がv2g構造体

    struct v2f
    {
        // 対象のTextureの左下を(0,0)右上を(1,1)とする座標系
        float2 uv : TEXCOORD0;

        // 左下を(0,0)右上が(1920,1080)とする座標系
        float4 vertex : SV_POSITION;
    };

ここでは画面サイズに対して左下を原点としてどのピクセルに描画するのかの vertex と描画対象のオブジェクト内の uv空間 での座標を扱うことができる.

        fixed4 frag (v2f i) : SV_Target
            {
                float4 col =float4(0,0,0,1);
                if(i.vertex.x>1900)
                {
                    col.x=1;
                }
                if(i.vertex.y>1070)
                {
                    col.y=1;
                }

                return col;
            }

入力としてuv座標画面上の座標 が得られる.これらの座標を使って を出力する.

ブログを見ていただきありがとうございました