夜風のMixedReality

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

MixedReality-GraphicsTools-Unityを触る その⑦ StandardShaderでURP、ビルドイン両方のパイプラインにおける処理の流れを追う

本日はMRTK3調査枠です。

現在GraphicsToolsに関して調査しています。

前回まではドキュメントを読み解いていました。

redhologerbera.hatenablog.com

 GraphicsToolsStandardシェーダーはURP、ビルドインの両方のグラフィックパイプラインに対応しています。

 今回は一つのシェーダーで複数のパイプラインに対応させる処理の仕組みを見ていきます。

〇GraphicsStandardシェーダーのレンダーパイプラインの処理の流れ

今回はGraphicsStandardシェーダーの処理の流れを見ていきます。

GraphicsStandardシェーダーは二つのPassを含むSubShaderが二つ、合計4つのPassブロックで構成されています。

 それぞれURP、ビルドイン用のメインの処理とエディタ上で動くSubShaderとなります。

Shader "Graphics Tools/Standard"
{
    Properties
    {
   
    }


   ///URPのサブシェーダー 
    SubShader
    {
        PackageRequirements
        {
            "com.unity.render-pipelines.universal": "10.6.0"
        }

        Tags
        { 
            "RenderPipeline" = "UniversalPipeline"
            "RenderType" = "Opaque" 
        }

        // Default pass (only pass outside of the editor).
        Pass
        {
            ...
            Stencil
            {
              ...
            }

            HLSLPROGRAM

            #define _URP

            ...

            #include_with_pragmas "GraphicsToolsStandardProgram.hlsl"

            ENDHLSL
        }


        Pass
        {
            Name "Meta"
           ...
            HLSLPROGRAM

            #define _URP

            #include_with_pragmas "GraphicsToolsStandardMetaProgram.hlsl"
            
            ENDHLSL
        }
    }

   ///ビルドインレンダーパイプラインのサブシェーダー 
   ///URPでは動きません。
    SubShader
    {
     ...
        Pass
        {
            Name "Main"
         ...

            HLSLPROGRAM

            ...

            #include_with_pragmas "GraphicsToolsStandardProgram.hlsl"

            ENDHLSL
        }

        Pass
        {
            Name "Meta"
           ...

            HLSLPROGRAM

            #include_with_pragmas "GraphicsToolsStandardMetaProgram.hlsl"

            ENDHLSL
        }
    }
    
    CustomEditor "Microsoft.MixedReality.GraphicsTools.Editor.StandardShaderGUI"
}

メインとなる処理はGraphicsToolsStandarProgram.hlslおよび GraphicsToolsStandardMetaProgram.hlslをincludeしています。

 URPとビルドインシェーダーの区別はURP用となる最初のパスでPackageRequirements{}ブロックがあることで区別されています。

        PackageRequirements
        {
            "com.unity.render-pipelines.universal": "10.6.0"
        }

PackageRequirementsはパスおよびSubShaderが指定されたパッケージのもとで動作することを定義します。

docs.unity3d.com

これはShaderエラーを回避するほか、今回のようにURP、ビルドイン両方に対応したシェーダーを一つのシェーダーで作成できるメリットがあります。

これによってURPとビルドインを区別し、URP上での処理では

            #define _URP

でURPのキーワードを定義することでhlslファイルの中で処理を分岐させています。

 一例をとるとalbedoはURPの場合はSAMPLE_TEXTURE2D()ビルドインではtex2D()の関数が分岐で使用されます。

#if defined(_URP)
    half4 albedo = SAMPLE_TEXTURE2D(_MainTex, sampler_MainTex, input.uv);
#else
    half4 albedo = tex2D(_MainTex, input.uv);
#endif

今回は以上です。

PackageRequirementsは今回初めて知ったので今後使用していきたいです。

MixedReality-GraphicsTools-Unityを触る その⑥ MaterialGalleryサンプル RenderingMode

本日もMixedReality-GraphicsTools-Unityを触っていきます。

前回までは導入からドキュメントを読み解いていきました。

redhologerbera.hatenablog.com

redhologerbera.hatenablog.com

redhologerbera.hatenablog.com

今回はサンプルシーンからMaterialGalleryをより一つ一つ見ていきます。

MaterialGallery

MaterialGalleryGraphicsStandardShaderで提供される機能を用いたサンプル群です。

今回はRenderingModeから見ていきます。

〇Rendering Modes

 Rendering ModesはShaderがどのタイミングでどのようにレンダリングされるのかを指定します。

Graphics Tools/StandardシェーダーはUnityで提供されている多くのレンダリングオプションを使用できます。

〇Opaque

Opaque(不透明)はデフォルトのレンダリングモードです。

レンダーキュー(Shaderが描画される順)はGeometry=2000となっています。

レンダーキューはRenderingModeに依存しており、値が小さい順にレンダリングが行われます。

docs.unity3d.com

Geometryは透明度を持ったオブジェクトよりも先に描画が行われます。

〇Cutout

Cutoutは透明度を扱うことができるモードです。

木の葉やPing画像などの透明度を持ったテクスチャを使用してα値に応じて透明と不透明を切り替えています。

AlphaCutoffの値を使用することで指定した値より下のα値(0~1)をとったピクセルは描画されず透明になります。

〇Fade

FadeTransparent同様透明~半透明のオブジェクト描画を行いますが、Transparentに対し非物理学的に透過していくことが特徴です。

TransparentがガラスだとしたらFadeは蜃気楼やお化けのような表現ができます。

〇Transparent

Transparentはガラスや現実的な半透明なオブジェクトの描画に使用されます。

TransparentFadeのプロパティ的な違いはSource Blendにあります。

これはShader内のBlendのソースに当たります。

            Blend[_SrcBlend][_DstBlend]

Alpha(透明度)を持つShaderはそのオブジェクトが描画される前にどのように描画されるか(混ぜ合わせるか)という処理をBlend [元の画像][AlphaShaderの処理後の画像]の形式で描画をどのようにするか指定します。

SrcAlphaはシェーダーで計算された色を乗算する処理を示します。

Oneはシェーダーで計算された色をそのまま描画します。

このあたりはべつ記事で改めて調査していきます。

〇Additive

Additive(加算)はalphaを含むシェーダーで、主にパーティクルなどのエフェクトでよく見るShaderです。

特徴としてBlendが

Blend One One

となっており、オーバーレイされるように描画されます。

〇Custom

Customは描画の設定を自身でカスタマイズするモードです。

BlendモードやBlendオプション、Depthなどをカスタマイズしてより高度な描画ができます。

当然ながら描画順などの問題もあり、この設定を使いこなすためにはShaderやレンダリングにある程度精通している必要があります。

本日は以上です。

GraphicsToolsStandardShaderを使用することでAlphaBlendingなどの学習もできそうです。

今後のチャレンジとして行っていきます。

MixedReality-GraphicsTools-Unityを触る その④ GraphicsToolsStandardShaderのドキュメントを読む 後半

本日はGraphicsToolsStandardShaderのドキュメントを読んでいきます。

redhologerbera.hatenablog.com

redhologerbera.hatenablog.com

Microsoftによるドキュメントはこちらになります。

docs.microsoft.com

今回で一通りドキュメントを読み終えていきます。

〇Cull mode

Cull mode(Culling mode)はShaderによって描画されるメッシュの面に関する設定です。

3DCGでは処理の負荷を軽減させることがより良いパフォーマンスを発揮します。

 Cull Modeによって次のような見た目になります。

カリングモード カリングされる面 見た目
Back 裏面 面の表面が描画される
Front 表面 面の裏面が描画される
Off 無し 両面が描画される

 ここで注目すべきはCull Modeで指定するものはどちらの面をカリングするか?であり、最終的な見た目は選択したものと逆になる点です。

〇チャンネルマップ

 チャンネルマップはMainMapsセクションでChannelMapを有効化することで使用できるようになります。

 チャンネルマップを使用することでメタリック、オクリュージョン、発光、スムースを一つの画像で管理できます。

wiki.polycount.com

 Unityを含む多くの3DツールのShaderでは色情報はRGBAの4次元であらわされることが多いです。

 この性質を使用してチャンネルマップでは、メタリックマップをR、オクリュージョンマップをG、発光をB、スムースマップをAの情報で各パラメータをグレースケールで設定することで、一つの画像ですべてを管理することを実現しています。

 実際のチャンネルマップの一例が次の画像になります。

 

 チャンネルマップを使用することで塗装の剥げなどの細かい質感の変化のような際限もできます。

〇Triplaner Mapping

Triplaner Mappingは画像のサンプリングの手法です。

 通常3Dオブジェクトに画像をアタッチする場合、そのモデルが持つUV情報を参照し、サンプリングが行われます。

 TriplanerMappingはモデルが持つUV情報を使用することはなくオブジェクトのローカル座標、もしくはUnityのワールド座標に基づき、サンプリングが行われます。

 特徴として複雑な形状のモデルやUVが破断しているモデルを無視してテクスチャを張ることができるようになります。

 その反面処理が重いためパフォーマンスが重要な場面では慎重に使用する必要があります。

〇スーパーサンプルアンチエイリアシング

スーパーサンプルアンチエイリアシングはアンチエイリアシングの手法で、遠くから画像を見る際や重要なオブジェクトに使用することできれいに描画されるようになります。

bgolus.medium.com

〇DirectionalLight

GraphicsToolsStandardShaderではひとつのシェーダーで光の影響を受けるLitと受けないUnlitの両方を表現できます。

Directional Lightのチェックボックスを有効にするとライトの影響を受け、Normalやスムースなどの周囲の光を必要とする機能が有効化されます。

defaultで有効になっています。

〇GraphicsToolsStandardShaderのまとめ

GraphicsToolsStandardShaderとUnityで提供されているStandardShader(URPの場合Univarsal/Lit)ではパフォーマンスという面でGraphicsToolsStandardShaderが優れています。

 これはGraphicsToolsStandardShaderが必要な機能を必要な分コストを割くことで最適化を行っているためです。

 また、通常のUnityで提供されているシェーダーではマテリアルの特性ごとにLit,Unlitとシェーダーを使い分ける必要がありますが、アプリ内で使用されるUIを含め基本的な見た目に関する機能はすべてGraphicsToolsStandardShaderに網羅されています。

 以上でGraphicsToolsStandardShaderのドキュメントを読むになります。

Azure Custom neural Voice で声のDeepFakeを作る

本日はAzure AI学習枠です。

Azureでは様々なサービスが展開されていますが、今回はAzure Cognitive ServicesSpeech ServiceからAzure Custom neural Voiceを触っていきます。

〇Azure Cognitive Services

Azure Cognitive ServicesはAzureの提供するAIサービス群で、主に次のカテゴリーで構築済みのモデルを使用することで、開発者はゼロからモデルを構築することなくAIの機能を使用することができます。

・視覚

・音声

・言語

・Decision

docs.microsoft.com

Azure Custom neural VoiceSpeech(音声)サービスで提供されているサービスで、アプリケーション内で使用できる文字読み上げの音声をカスタマイズする機能です。

 Azure Custom neural Voiceを使用することでiPhoneのSiriなどのような音声読み上げの機械ボイスを自身もしくはボイスタレントの声に使用することができます。

〇Azure Custom neural Voiceの使用

Custom Voiceのページへアクセスします。

speech.microsoft.com

ここではサンプルを聞くことができます。

②Azureのアカウントでサインインを行いSpeechStudioからCustom Voiceを選択します。

この際Azureのリソースグループに紐づけるor新たにリソースグループを作成する必要があります。

③ここではすでに作成されているプロジェクトを見ることができます。最初は[+プロジェクトの作成]から新規でプロジェクトを作成します。

④現在2種類のプロジェクトタイプを選択できます。今回はLiteを使用します。

ProLiteに比べ必要なデータサイズの下限が大きく、またトレーニングに使用する言語で日本語を使用できるようです。

 しかしながらアクセス権を申請し、この申請が通る必要があります。

このアクセス権とは、Microsoft の責任のあるAIの観点から設けられているセキュリティで、Azure Custom neural Voiceを使用することでDeepFake音声が使用することができ、例えば政治利用や犯罪などに使用することもできるほか、声という個人が特定されるプライバシーを扱うため、そのプロジェクトがアプリでどのように使用され、アプリ内でエンドユーザーにどのようにその音声がAIによるものだと伝えるのかなど詳細をアクセス権申請として申請する必要があります。

ガイドラインはこちらになります。

docs.microsoft.com

⑤プロジェクトの名前と説明、ボイスタレントの性別そしてトレーニングデータで使用する言語を入力します。

トレーニングデータで使用する言語はLiteでは日本語は使用できませんが数多くの言語に対応しています。

プロジェクトが作成されると次のような画面に移動します。

⑥最低20の英文を録音します。

⑦最低限必要なデータがそろったら[モデルのトレーニング]を選択します。

 20このデータでは0.8時間ほどでトレーニングが完了します。

Azure Custom neural Voice の課金はこのトレーニングの際の時間課金とその後の出力された音声を使用する際の通信で発生するようです。

 筆者の場合0.8時間のトレーニングで50$程の料金が発生していました。

⑧トレーニングが完了するとモデルの確認タブでタレントの声で次のステップへの音声が読み上げられます。

Liteではアクセス権が得られるまでここで表示されている音声に制限されています。

本日は以上です。

思ったよりも簡単にそして筆者自身の声で音声が再現されており非常に驚きました。

 近年ではウクライナのゼレンスキー大統領のDeepFakeが作られたり、AIによるFakeの存在は驚異的なものになっていますが、これだけ簡単に声のDeepFakeを作れるからこそ、アクセス権などでしっかりと管理されているのだと感じます。

MixedReality-GraphicsTools-Unityを触る その④ GraphicsToolsStandardShaderのドキュメントを読む 中編

本日も昨日に引き続きMRTKGraphicsToolsを見ていきます。

現在ドキュメントを読み進めています。

redhologerbera.hatenablog.com

〇レンダーパイプラインの対応

近年のUnityではスクリプタブルレンダーパイプライン(SRP)を使用することで従来のビルドインパイプラインよりもレンダーパイプラインをカスタマイズすることでより最適な、よりハイクオリティなパフォーマンスのグラフィックを実現できます。

GraphicsToolsStandardShaderのレンダーパイプライン対応状況は次のようになっています。

レンダーパイプライン サポート 備考
ビルドイン ぼかし機能はサポート対象外
URP すべての機能にサポート
HDRP ×  
カスタムパイプライン レンダーパイプラインの構築状況に依存する

表を見てもわかる通りURPに最適化されているような印象を受けます。

UnityもURPは将来的な標準パイプラインとなると発表しているので、URPでの使用を大きく想定しているのかもしれません。

ビルドインパイプラインのぼかし機能とは実験的に導入されている機能です。

〇UnityUI のサポート

GraphicsToolsStandardShaderはUnityUIと連携して動作するようになっています。

公式ドキュメントより引用

Graphics Tools/Standard CanvasShaderが提供されています。

UnityUI(Canvas)では通常のオブジェクトと異なりShaderで軸変換を行う際にローカルではなく親であるCanvasの行列変換が行われます。

 このため通常のShaderと違う専用のShaderが提供されています。

〇MaterialInspector

GraphicsToolsStandardShaderはStandardShaderGUI.cs を使用してUnityのインスペクターウィンドウでの表示がカスタマイズされています。

UnityのShaderではCustomShaderEditorと呼ばれる機能でこれを実現していますが、これによってチェックを入れた機能のプロパティが動的に出現したりなど使いやすいようなUIを実現しています。

 

〇レンダリングモード

GraphicsToolsStandardShaderの最初に表示されるプロパティは、マテリアルのレンダリング状態を制御します。

 レンダリングモードは、マテリアルがどのタイミングで、どのようにレンダリングされるかを決定します。

 これはTransparentやOpaqueなどマテリアルの特性を決めます。

 現在Opaque(不透明)Cutout(α値のクリッピング)Fade(透明)Transparent(物理的な透明)Additive(加算透明)が提供されているほかCustomを使用してレンダリングをカスタマイズすることもできます。

 

 Customでは自身で高度なレンダリング設定をカスタマイズできます。

 これはAlphaBlendingやDepthTestなどUntiyで提供されている基本的なマクロを使用できます。

 

 本日は以上です 

MixedReality-GraphicsTools-Unityを触る その③ GraphicsToolsStandardShaderのドキュメントを読む 前半

本日は昨日に引き続きMRTK3のGraphicsToolsを調査していきます。

GraphicsToolsではMRTKのShaderやレンダリングなどのグラフィックに関する機能を担うMRTK3のパッケージです。

前回はMRTKv2のMRTKStandardShaderの後継機に当たるGraphicsTools/StandardShaderを軽く触っていきました。

redhologerbera.hatenablog.com

今回はGraphicsTools/StandardShaderのドキュメントを読み解いていきます。

〇GraphicsTools/StandardShaderドキュメント

MSのドキュメントは次にあります。

docs.microsoft.com

GraphicsToolsStandardシェーダーはMixedRealityデバイスでのパフォーマンスを想定しながらUnityで提供されているStandardShaderなどの汎用性の高いShaderとして提供されています。

Fluent Design Systemにのっとって機能が提供されています。

〇Fluent Design System

www.microsoft.com

Fluent Design Systemはオープンソースで提供されているクロスプラットフォームの設計システムを指し、アクセシビリティとパフォーマンスを両立したデザイン指向となっています。

〇サンプル

GraphicsTools/StandardShaderの例はMaterialGalleryシーンから確認することができます。

redhologerbera.hatenablog.com

〇設計

GraphicsTools/StandardShaderはUnityが提供しているShaderValiantを使用してShaderのプロパティに基づき、使用する機能がコンパイルされるウーバーシェーダーとなっています。

docs.unity3d.com

これによって使用しない機能はコンパイルされることはなく、これが多機能かつ軽量を実現している仕組みとなっています。

#pragma shader_feature_local _ _ALPHATEST_ON _ALPHABLEND_ON _ALPHABLEND_TRANS_ON _ADDITIVE_ON
#pragma shader_feature_local _DISABLE_ALBEDO_MAP

 ...

例えばノーマル(法線)はShader内で次のようにプリプロセッサによってコンパイルが設定されています。

    half3 localNormal = input.normal;

#if defined(_NORMAL) || defined(_VERTEX_EXTRUSION)
#if defined(_URP)
    half3 worldNormal = TransformObjectToWorldNormal(localNormal);
#else
    half3 worldNormal = UnityObjectToWorldNormal(localNormal);
#endif
#endif

このような仕組みを導入することで最適なパフォーマンスを提供するほかにURPなどにも対応することを可能としています。

〇提供されているシェーダーファイル

先日見たように GraphicsToolsStandardShaderではMRTKv2のMRTKStandardShaderから進化して、HLSLファイルを読み込むことで可読性を上げています。

redhologerbera.hatenablog.com

GraphicsToolsでは次のファイルが提供されてます。

〇GraphicsToolsStandardProgram.hlsl

頂点シェーダーとフラグメント シェーダーのコアを含みます。

GrapichsToolsStandardShaderのコア部分と呼べます。

〇GraphicsToolsStandardMetaProgram

UnityによるStaticライティングに使用する頂点シェーダーとフラグメントシェーダーの実装を含みます。 この処理は実行時および実機には使用されません

〇GraphicsToolsStandardInput

 頂点属性、頂点補間器、テクスチャ、テクスチャ サンプラー、マテリアルごとの定数バッファー、グローバル プロパティ、および定数の定義が含まれています。

 これらはUnityCG.cgincのAppdataなどのようにGraphicsToolsStandardShaderで使用されるデータが定義されているのでしょうか?

〇GraphicsToolsCommon.hlsl

 共通で使用されるメソッドと定義が記述されています。

これらのファイルはGrapchicsTools/Runtime/Shader内に存在します。

今回は長くなってしまったので以上です。

続きは次回以降見ていきます。

MixedReality-GraphicsTools-Unityを触る その② GraphicsTools StandardShader

今回はMRTK3調査枠です。

MRTK3がリリースされたことで間にMRTK3の調査が入ってしまいましたが今回はGraphicsToolsを触っていきます。

前回は導入とサンプルシーンをざっと見ていきました。

redhologerbera.hatenablog.com

今回はShaderを見ていきます。

〇GraphocsTools StandardShader

MRTK3ではv2のMixedReality StandardShaderに代わりGraphics Tools/StandardShaderが使用できます。

代わりといってもMRTK3ではMRTKv2と併用することもできるためMixedRealityStandardShaderと置き換わるものではなく、別のShaderとして開発されています。

中身も構造が変わっており、MRTKStandardShaderではCGPROGRAM~ENDCGで記述され、コアな処理はすべてShaderファイル内で行われていましたが、GraphibsTools/StandardShaderではHLSLPROGRAM~ENDHLSLの記述になっており、さらにコアな処理はGraphicsToolsStandardProgram.hlslに記述されincludeされるようになっています。

これによりMRTKStandardShaderでは1000行を超えていたファイルは300行ほどに収められ可読性が上がっています。

Shader "Graphics Tools/Standard"
{
    Properties
    {
 ...
    }

    SubShader
    {
  ...
        Pass
        {
           ...
            HLSLPROGRAM

           ...
            #include_with_pragmas "GraphicsToolsStandardProgram.hlsl"//Shaderの
処理は別ファイルをインクルードしている。

            ENDHLSL
        }
       ...
    } 
     ...
    }
    CustomEditor "Microsoft.MixedReality.GraphicsTools.Editor.StandardShaderGUI"
}

また URPにも対応してる仕組みとなっています。

GraphicsToolsStandardShader自体はMRTKStandardShader同様 CustomEditorでインスペクタの表示が管理されるようになっており、ShaderGUIUtillsが担当しています。

 これによりShaderプロパティが管理され、チェックボックスにチェックを入れ有効化した時、必要な詳細のプロパティが表示されるようになっています。

今回は以上です。

GraphicsToolsStandardShaderは一見するとMRTKv2のMRTKStandardShaderと同じですが、中身が全く異なっており、使用感などを同じにしながら別のShaderとしてアップデートしていることがわかりました。