夜風のMixedReality

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

URPのShaderGraphでMRTKStandardShaderを再現する。 テクスチャ

本日はMRTKShader枠です。

MRTKではMRTKStandardShaderと呼ばれる非常に多機能なUberShader(使用する機能のみコンパイルされるShader)が提供されています。

ところが、このShaderはUnityのURPプロジェクトでは使用することができません。そこでShaderの勉強もかねてMRTKStandardShaderをShaderGraphで再現します。

〇ShaderGraphとは?

 ShaderGraphはUnityのスクリプタブルレンダーパイプラインで使用可能なShader構築環境でそれまでのコードベースではなくノードベースでShaderを作成することができます。

〇環境

・Unity 2021.1.0f1

・Universal RP v11.0.0

・ShaderGraph 11.0.0

〇テクスチャ

今回はテクスチャを設定します。

redhologerbera.hatenablog.com

‘‘‘ Shader "Custom/MRTKStandardShaderResearch" { Properties { // Main maps. Color("Color", Color) = (1.0, 1.0, 1.0, 1.0) //追加 MainTex("Albedo", 2D) = "white" {} }

SubShader
{

Pass { Name "Main" Tags{ "RenderType" = "Opaque" "LightMode" = "ForwardBase" } LOD 100

            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"
            #include "UnityStandardConfig.cginc"
            #include "UnityStandardUtils.cginc"
            #include "MixedRealityShaderUtils.cginc"


        struct appdata_t
        {
            float4 vertex : POSITION;
            //追加
            float2 uv : TEXCOORD0;

            UNITY_VERTEX_INPUT_INSTANCE_ID
        };

        struct v2f
        {
            float4 position : SV_POSITION;
            //追加
            float2 uv : TEXCOORD0;

            UNITY_VERTEX_OUTPUT_STEREO

        };
         fixed4 _Color;
        //追加
         sampler2D _MainTex;


        v2f vert(appdata_t v)
        {
            v2f o;
            UNITY_SETUP_INSTANCE_ID(v);
            UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);
            float4 vertexPosition = v.vertex;

            //追加
            o.uv = v.uv;

            o.position = UnityObjectToClipPos(vertexPosition);

            return o;
        }

        fixed4 frag(v2f i, fixed facing : VFACE) : SV_Target
        {
            //追加     
            fixed4 albedo = tex2D(_MainTex, i.uv);

            albedo *= _Color;
            fixed4 output = albedo;
            return output;
        }

        ENDCG
    }
}

Fallback "Hidden/InternalErrorShader"

// CustomEditor "Microsoft.MixedReality.Toolkit.Editor.MixedRealityStandardShaderGUI" } ‘‘‘

①プロジェクトウィンドウから[Create]、[Shader]、[Univarsal RenderPipeline]から[LitGraph]を選択します。

[f:id:Holomoto-Sumire:20210515150428j:plain]

プロジェクトウィンドウに新しいShaderGraphが作成されます。 今回[MRTKShader]とテスト用のマテリアルを作成しました。

[f:id:Holomoto-Sumire:20210515150944j:plain]

②MRTKShaderのGraphを開きます。

[f:id:Holomoto-Sumire:20210515151125j:plain]

③テクスチャのノードを作成します。右クリックの[CreateNode]から[Sample Texture 2D]を選択します。

[f:id:Holomoto-Sumire:20210515151418j:plain]

[Sample Texture 2D]の[RGBA(4)]をマスターノードの[Fragment]の[Color]に接続します。

[f:id:Holomoto-Sumire:20210515151746j:plain]

これによって画像を使用できるようになりました。

[f:id:Holomoto-Sumire:20210515152028j:plain]

マスターノードの[Fragment]はShaderコードのフラグメントシェーダー部分に相当します。

            fixed4 frag(v2f i, fixed facing : VFACE) : SV_Target
            {
                //追加     
                fixed4 albedo = tex2D(_MainTex, i.uv);
    
                albedo *= _Color;
                fixed4 output = albedo;
                return output;
            }

今回はテクスチャを指す albedoに _Colorでメインカラーが積算されています。

これをShaderGraphで表すと次のようになります。

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

Input同士を積算する[Multiply]ノードとMainColorを接続し最終的にColorに渡しています。

以上でMRTKStandardShaderのテクスチャを扱う代替えShaderができました。

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

今後も引き続き実装していきます。