夜風のMixedReality

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

MRTK StanderdShaderを読み解く その③

本日はMRTKのShader学習枠です。

MRTKにはHoloLensなどのMxiedRealityデバイスに特化したShaderが提供されています。

前回に引き続き中身を見ていきます。

//ここではMRTKStandardShaderをコピーしてresearchと名付けています。 
Shader "Custom/MRTKStandardShaderResearch"
{
Properties
{
  _Color("Color", Color) = (1.0, 1.0, 1.0, 1.0)
}

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;

                UNITY_VERTEX_INPUT_INSTANCE_ID
            };

            struct v2f
            {
                float4 position : SV_POSITION;

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


                o.position = UnityObjectToClipPos(vertexPosition);

                return o;
            }

            fixed4 frag(v2f i, fixed facing : VFACE) : SV_Target
            {
                fixed4 albedo = fixed4(1.0, 1.0, 1.0, 1.0);
                albedo *= _Color;
                fixed4 output = albedo;

                return output;
            }

            ENDCG
        }
        }
            Fallback "Hidden/InternalErrorShader"
}

〇appdata_t構造体

appdata_t構造体では頂点シェーダーに渡すデータが格納されます。

    struct appdata_t
            {
                float4 vertex : POSITION;
                UNITY_VERTEX_INPUT_INSTANCE_ID
            };

vertex を頂点の位置として使用することが定義されています。

またUNITY_VERTEX_INPUT_INSTANCE_IDで左右のレンダリングのIDを保有しています。

この処理はGPUの使用率を軽減させHoloLensに最適化したレンダリングを実現しています。

docs.unity3d.com

〇頂点シェーダー

appdata_t構造体からデータを受け取りv2f構造体に返します。

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


                o.position = UnityObjectToClipPos(vertexPosition);

                return o;
            }
                UNITY_SETUP_INSTANCE_ID(v);
                UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o);

シングルパスインスタンシングレンダリングにかかわる処理です。

UNITY_SETUP_INSTANCE_ID(v) は、どちらの目をレンダリングしているかに基づいて、unity_StereoEyeIndex と unity_InstanceID の二つのビルトインシェーダー変数を正しい値に計算し、設定します。

UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o)は直前に計算されたunity_StereoEyeIndexの値によってv2f構造体に情報を渡します。

               float4 vertexPosition = v.vertex;

vertexPososition は頂点の位置を代入しています。

                o.position = UnityObjectToClipPos(vertexPosition);

                return o;

v2f構造体のpositionにunity座標に変換した頂点の位置を代入します。

〇v2f構造体

          struct v2f
            {
                float4 position : SV_POSITION;
                UNITY_VERTEX_OUTPUT_STEREO
            };

positionはシステム上で扱われる位置座標を指します。これは頂点シェーダーで頂点の位置が代入されています。

UNITY_VERTEX_OUTPUT_STEREOは頂点シェーダーからもたらされたシングルパスインスタンシングレンダリングに関する情報が入ります。

〇フラグメントシェーダー

   fixed4 frag(v2f i, fixed facing : VFACE) : SV_Target
            {
                fixed4 albedo = fixed4(1.0, 1.0, 1.0, 1.0);
                fixed pointToLight = 1.0;
                fixed3 fluentLightColor = fixed3(0.0, 0.0, 0.0);
                albedo *= _Color;
                fixed4 output = albedo;
                fixed minProperty = min(_Smoothness, _Metallic);

                return output;
            }

v2f構造体からデータを受け取り ピクセル色として返します。

fixed facing :VFACEはレンダリングされる面の向きを取得するものです。

docs.unity3d.com

      fixed4 albedo = fixed4(1.0, 1.0, 1.0, 1.0);
                albedo *= _Color;
                fixed4 output = albedo;

                return output;

albedo には1,1,1,1の値を入れています。 albedoにColorを加算したものがピクセル色として書き出されます。

以上が最小限の構成にしたMRTKStandardShaderの処理です。

これをベースに次回以降MRTKStandardShaderへ復元していきます。