夜風のMixedReality

xRと出会って変わった人生と出会った技術を書き残すためのGeekなHoloRangerの居場所

熊本のコミュニティでシェーダーの勉強会を開催しました。

本日はイベント枠です。

私の師に当たる熊本のxRコミュニティで活躍されているガチ本さんと合同でコミュニティ内で知識共有と交流を目的とした勉強会を開催しました。

〇KumaMCN

KumaMCNは熊本を拠点に活動しているxRコミュニティです。

今回のイベントではKumaMCNのDiscordを使用して少人数で行われました。

discord.gg

〇UnityBarracuda

UnityBarracudaはUnityの新しい推論エンジンです。

学習済み推論モデルONNXを用いてGPUベースで推論を実行できる環境を提供します。

今回の勉強会ではがち本さんによってUnityの高橋啓次郎さんによって提供されているサンプルを読み解きながらどういうことに使えるかといった情報を共有いただきました。

www.youtube.com

Unity Barracudaに関しては筆者も少し触れています。

redhologerbera.hatenablog.com

一つ一つ実際にその場で動かしてライブデモを行っていただきました。

〇Shaderに関する知見の共有

Shaderに関しての知見の共有は筆者の発表です。

UnityではShaderLabと呼ばれる独自言語で記述されています。その実のところはcg/HLSL言語で記述されています。

今回の勉強会ではテンプレートを用意していました。

redhologerbera.hatenablog.com

f:id:Holomoto-Sumire:20210812212004j:plain

テンプレートのShaderを適応しても何も描画されません。

これはテンプレートのシェーダーが3Dモデルの情報をきちんと処理していないからです。

Shaderでは元の3Dモデルがもつ情報をどのように扱うかを宣言するブロックがあります。

今回の場合appdata_t構造体がそれにあたります。

次の一分を加えます。

  struct appdata_t
        {
            float4 vertex : POSITION;
        };

これで元の3Dモデルからvertexという変数名で座標を扱えるようになりました。

次に頂点シェーダーで3Dモデルの頂点を並べ替える処理を行います。

その前に頂点シェーダーで処理をした結果を格納する構造体であるv2f構造体に宣言を行います。

        struct v2f
        {
            float4 vertex :POSITION;
        };1

v2fはvertex to fragmentという意味でその名の通り頂点シェーダーで処理をしたデータをフラグメントシェーダーで使用するために格納します。

次に頂点シェーダーでの処理を記述します。

        v2f vert (appdata_t v)//頂点shader 頂点の処理を行う。
        {
            v2f o;//V2f構造体をoと指す
           o.vertex = TransformObjectToHClip(v.vertex); 
            return  o;//Oに出力
        }

頂点シェーダーでは[ TransformObjectToHClip]という関数が使用されています。

これはCore.HLSLで提供される関数で頂点をUnityの座標系に変換します。

座標の変換が必要な理由は3Dソフトの座標系の違いに対応するためです。

以下の画像はBlenderの画像です。注目するのは軸でZ軸が鉛直上向きになっています。

f:id:Holomoto-Sumire:20210812213021j:plain

UnityではY軸が鉛直上向きで使用されます。

f:id:Holomoto-Sumire:20210812213118j:plain

このソフトごとの座標軸に対応するために変換を行っています。実際は行列を行っていますが関数を使用することで意識することなく形式的に使用することができます。

最後にフラグメントシェーダーで処理が行われます。

   float4 frag(v2f i):SV_TARGET
        {
          float4 col = (1,1,1,1);//RGBA=1,1,1,1=白
           return col;//出力
        }

フラグメントシェーダーは解像度(ピクセル)ごとに色を出力します。

ここで出力される色はRGBAのfloat4型で指定されており、今回は1,1,1,1で白を出力します。

以上でテンプレートシェーダーで基礎的な描画が行えるようになりました。

f:id:Holomoto-Sumire:20210812213257j:plain

勉強会ではここまでを実際にハンズオン形式で手を動かして行いました。

次回は9月11日にKumaMCNのDiscordで行われます。