3秒でわかる「フラグメントシェーダー」【Unity】
フラグメントシェーダーとは
画面に投影される予定のピクセルの色データを加工するシェーダーです!
頂点シェーダーで加工したデータが別の工程を経た後、画面に投影される分のピクセルデータに変換されます。
そのピクセルデータを受け取り、再計算することでいろんな見えかたに変化させることができます。
シェーダーのコード
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座標)」を引数にとり、色のデータに変換しています。
その後そのデータをそのまま返します。
いろいろな処理を経て出力
フラグメントシェーダーでは色データをいじることができます。色々試せそうです。