トーフメモ

主にゲーム制作

3秒でわかる「フラグメントシェーダー」【Unity】

f:id:tofgame:20190428235503j:plain

フラグメントシェーダーとは

画面に投影される予定のピクセルの色データを加工するシェーダーです!
頂点シェーダーで加工したデータが別の工程を経た後、画面に投影される分のピクセルデータに変換されます。
そのピクセルデータを受け取り、再計算することでいろんな見えかたに変化させることができます。

前回(頂点シェーダー)

tofgame.hatenablog.com


前回と同じコードを使います。

シェーダーのコード

Shader "Unlit/NewUnlitShader"{
    Properties{
        _MainTex("Texture", 2D) = "white" {}
    }

    SubShader{
        Tags { "RenderType" = "Opaque" }
        LOD 100

	Pass{
	    CGPROGRAM
	    #pragma vertex vert
	    #pragma fragment frag

	    //入力用の構造体
	    struct appdata {
               float4 vertex : POSITION; //頂点の座標
               float2 uv : TEXCOORD0; //頂点に設定されたuv座標
	    };

	    //出力の構造体
	    struct v2f {
                float4 vertex : SV_POSITION; //頂点の座標
                float2 uv : TEXCOORD0; //頂点に設定されたuv座標
            };

            //頂点シェーダー
            v2f vert(appdata v) {
	        v2f o;
	        o.vertex = UnityObjectToClipPos(v.vertex); //頂点の座標をクリップ空間での座標に変換
	        o.uv = v.uv; //uv座標はそのまま
	        return o;
            }

            sampler2D _MainTex; //プロパティで設定したテクスチャデータ

            //フラグメントシェーダー
            fixed4 frag(v2f i) : SV_Target{
	        fixed4 col = tex2D(_MainTex, i.uv);
	        return col;
            }
	    
	    ENDCG
        }
    }
}

フラグメントシェーダーに関わる部分

#pragma fragment frag

フラグメントシェーダーメソッドを設定しています。

sampler2D _MainTex; //プロパティで設定したテクスチャデータ

Propertiesで設定した_MainTexを使用するために変数を宣言します。

fixed4 frag(v2f i) : SV_Target{
    fixed4 col = tex2D(_MainTex, i.uv);
    return col;
}

ここの部分がフラグメントシェーダーのメソッドです。
出力データとして「SV_Target」セマンティクスを設定しています。(シェーダーの入出力にはセマンティクスを設定しなければいけません)
「SV_Target」は出力のカラー値を表しています。
「tex2D」メソッドで「_MainTex(テクスチャのデータ)」と「i.uv(ピクセルデータに補完されたuv座標)」を引数にとり、色のデータに変換しています。
その後そのデータをそのまま返します。

いろいろな処理を経て出力

フラグメントシェーダーでは色データをいじることができます。色々試せそうです。