🐡
UnityでShader始めてみた No.1 シェーダープログラム
普段Unityでゲームを制作している大学生のmarmelonです。
ずっと前からシェーダーが気になっていたので、この機会に勉強してみることにしました。
記事にする目的
Zennを用いて記事にする理由は、
「シェーダーを学びたいけど何から学べば良いか分からない」
と思っている人に参考にしてほしいからです。
初心者でも勉強続ければそれなりにできるようになるんだぞ!ってところを見せることができればいいかな、と思います。
シェーダープログラム
シェーダープログラムのサンプルを使って説明してみようと思います。
// シェーダーの名前 Unlitフォルダに入れるColorという名前
Shader "Unlit/Color"
{
SubShader
{
Pass
{
// どのタグを割り当てるか 透明度の指定等ができる
Tags { "RenderType" = "Opaque" }
CGPROGRAM
#pragma vertex vert // 頂点シェーダーは vert の名前で記すことの宣言
#pragma fragment frag // フラグメントシェーダーは frag の名前で記すことの宣言
#include "UnityCG.cginc"
// セマンティクス(GPUに入力や出力の値が何の意味を持つか教えるためのもの)
// 頂点シェーダーにくるデータをまとめる構造体
struct appdata
{
float4 vertex : POSITION; // 頂点の座標
fixed3 color : COLOR0; // 頂点カラー
};
// フラグメントシェーダーに送るデータをまとめる構造体
struct v2f
{
float4 vertex : SV_POSITION; // 頂点の座標
fixed3 color : COLOR0; // 頂点カラー
};
// 頂点シェーダー
v2f vert (appdata v)
{
v2f o;
o.vertex = UnityObjectToClipPos(v.vertex);
o.color = v.color;
return o;
}
// フラグメントシェーダー
fixed4 frag (v2f i) : SV_Target
{
return fixed4(i.color, 1);
}
ENDCG
}
}
}
セマンティクス
シェーダープログラムの入出力の値の意味を表すもの。
appdataは頂点座標にくるデータ(頂点の座標と色)を、
v2fはフラグメントシェーダーに送るデータ(変換後の頂点座標と色)をまとめている。
文法上必要?らしい
頂点シェーダー
3Dオブジェクトの頂点を処理してくれる。
三角形なら3回、四角形なら4回、頂点の回数だけ実行される。
3Dのオブジェクトを2Dの画面にそのまま映すことはできないので、上手く映せるように座標変換をしてくれる。
プログラムの中身は、頂点座標と色の情報を受け取って、フラグメントシェーダーに渡す型に変換しているだけです。
フラグメントシェーダー
ピクセルの色を処理してくれる。
表示するメッシュのピクセルの数だけ実行されるため、頂点とは比較にならない回数となる。
プログラムの中身は、頂点シェーダーで受け取った情報にアルファ値を加えたfixed4型にしているだけです。
各頂点には赤色、青色、緑色を指定した上で、三角形のメッシュに適用してみました。
間の色は補間されるようです。
Discussion