Unity シェーダーの新規作成とプログラミングの始め方

前回、Unity でスプライト画像を灰色にして影を表示するために、マテリアルを作成し Albedo を灰色にして、Sprites/Default シェーダーに変更後、タイルマップゲームオブジェクトにその灰色マテリアルを割り当てました。

前回の記事:Unity マテリアルでスプライトの色を変える&シェーダーの種類 | Compota-Soft-Press

完全な黒色だと黒い影が出ますが、灰色にすると少し画像のもともとの色味がでてしまいました。
そこで今回は、グラフィックスパイプライン用のシェーダーを作成し、ピクセルの色を変化する手順を実践しながら紹介していきます。
※ Unity は 2021.3.14f1、Test Framework パッケージは Version 1.1.33、Visual Studio は Community 版 Version 17.2.5、 OS は Windows 10 です。

シェーダーの新規作成

メニュー [Assets] → [Create] → [Shader] でサブメニューを開くとたくさんの Shader がありました。

Unity メニュー Assets → Create → Shader にはさまざまな種類がありました.

カスタムシェーダーの基礎 – Unity マニュアル」では Unlit Shader を選択しています。

メニューに表示された 5 つのシェーダーにそれぞれどのような特徴があるのか調べました。

Starndard Surface Shader

ライティングと連動するシェーダーを効率的に作成できます。
参照:サーフェスシェーダーの記述 – Unity マニュアル

Unlit Shader

ライティングに影響されないマテリアルを作るシェーダーです。
参照:

Image Effect Shader

レンダリング後にかけるエフェクトです。ポストエフェクト (Post: ~後の) と同等です。
Unity では Camera コンポーネントに付加し、カメラの画像を入力としてエフェクトをかけた画像を出力します。
参照:【Unity】カスタムイメージエフェクトのつくりかた – エフアンダーバー

Compute Shader

通常のレンダリングパイプラインと異なり、グラフィックカード上で処理を行うシェーダです。
参照:コンピュートシェーダー – Unity マニュアル

Ray Tracing Shader

GPU を用いたレイトレーシングを行うシェーダーです。
まだ実験的な API であり、変更・削除されるかもしれません。
参照:Experimental.Rendering.RayTracingShader – Unity スクリプトリファレンス

Unity RayTracingShader はまだ実験的な API で将来変更されたり削除されるかもしれないようです.

カスタムシェーダーのプログラミングの始め方

前の章で 5 つのシェーダーについて調べました。
今回はスプライト画像のアルファ値に応じて灰色や黒色にピクセルの色を変更するシェーダーを作りたいので、ライティングを扱わない Unlit Shader をベースにしました。

メニュー[Assets]→[Create]→[Shader]→[Unlit Shader] を選択し、 Unlit Shader を新規作成します。

Unity メニュー [Assets]→[Create]→[Shader]→[Unlit Shader] を選択し、ライティングを用いない Unlit Shader を新規作成します.

Project ウィンドウで開いているフォルダに Unlit Shader が作成されました。
わかりやすい名前にリネームしましょう。

Unity Unlit Shader が開いているフォルダーに作成されました.

作成した Unlit Shader ファイルをダブルクリックするか Inspector ウィンドウの Open ボタンを押すと Visual Studio が開きました。

Unity 作成した Unlit Shader をダブルクリックするか Inspector ウィンドウの Open で Visual Studio が開きました.

Unlit Shader の初期コード

作成した Unlit Shader を Visual Studio で開くと次のようにプログラムが作られています。

Shader "Unlit/SCTilemapShadowUnlitShader"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            // make fog work
            #pragma multi_compile_fog

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                UNITY_FOG_COORDS(1)
                float4 vertex : SV_POSITION;
            };

            sampler2D _MainTex;
            float4 _MainTex_ST;

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = TRANSFORM_TEX(v.uv, _MainTex);
                UNITY_TRANSFER_FOG(o,o.vertex);
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                // sample the texture
                fixed4 col = tex2D(_MainTex, i.uv);
                // apply fog
                UNITY_APPLY_FOG(i.fogCoord, col);
                return col;
            }
            ENDCG
        }
    }
}

1行目に、「Unlit/シェーダーにつけたファイル名」が記述されていることから、カスタムシェーダーではなく Unlit Shader に分類されたようです。

タイルマップのゲームオブジェクトのマテリアルを Inspector ウィンドウで表示し、シェーダーのリストを確認すると、 Unlit のカテゴリの中に先ほど作成した SCTilemapShadowUnlitShader が追加されていました。

Unity ゲームオブジェクト(タイルマップ)のマテリアルの Shader を選択すると先ほど作成した自作のシェーダーが Unlit カテゴリに入っています.

マテリアルの Shader を新規作成したシェーダーに設定することで、新規作成した Unlit をベースにしたシェーダーの処理結果の表示を確認できます。

今回はここまで

今回は、Unity のカスタムシェーダーの作成方法、名前が似ているシェーダーグラフについて調べたことを紹介しました。
シェーダーの作成では、ベースとなるシェーダー 5 つについても軽く説明しました。
ライティングを用いない Unlit Shader からシェーダーを新規作成し、プログラミングするために Visual Studio を開くところまで実際に行いました。
デフォルトのコードについても記載しましたが、このコードの意味については次回紹介します。

参照サイト Thank You!

記事一覧 → Compota-Soft-Press

コメント

Ads Blocker Image Powered by Code Help Pro

お願い - Ads Blocker Detected

このサイトは広告を掲載して運営しています。

ポップアップを閉じて閲覧できますが、よろしければ

このサイト内の広告を非表示にする拡張機能をオフにしていただけませんか?

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

We have detected that you are using extensions to block ads. Please support us by disabling these ads blocker.

タイトルとURLをコピーしました