夜風のMixedReality

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

Hex表現を使用した出現シェーダーを作る その⑥ HoloLens用のSpatialMeshシェーダー

本日はShader枠です。

〇SptaialMeshように調整する

HoloLensのSpatialMeshはUVを持たないという性質があります。

そのため最初に行うことはオブジェクトのUV座標を使用した処理をUnityのワールド座標に置き換えます。

            CGPROGRAM
           ・・・
            struct v2f
            {
               //UVを削除
                float4 vertex : SV_POSITION;
                float3 worldPos: TEXCOORD1;
            };
             
           ・・・
            v2f vert(appdata v)
            {
    //UVにかかわる処理を削除
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.worldPos = mul(unity_ObjectToWorld, v.vertex).xyz; //worldPos
                return o;
            }

            fixed4 frag(v2f i) : SV_Target
            {
                float2 Hex;
                float2 HexUV;
                float HexPos;
                float2 HexIndex;
                Hexagon(i.worldPos.xz, _Scale, HexIndex, HexPos, HexUV, Hex);//ワールド座標に置き換え

                fixed4 col = float4(1,1,1,1);
                float StepHex = 1- step(float3(Hex,Hex.x), smoothstep(0.1,0.8, distance(i.worldPos* _Power, _userPos)));
                
               col *=  StepHex; 
                float3 emission = _EmissionColor.rgb*smoothstep( 0.1, 0.8,distance(i.worldPos* _Power, _userPos));
                emission *= 1-Hex.x;
               col.rgb += emission;
  
                return col;
            }
            ENDCG
        }
    }
}

ここで注意するべき点としてはHexagonメソッドの第一引数として渡す座標データにi.worldPos.xzとy座標ではなくZ座標を与えている点です。

これはUnityの座標でY軸は鉛直軸となっており、水平座標を取得するためにはxz座標を使用する必要があるためです。

これによってエフェクトの範囲、Hexの大きさがオブジェクトのUV座標に依存せず、Unityのワールド座標に依存するようになります。

UVに依存しないことでテクスチャを使用できなくなりました。

そのためプロパティブロックに色のプロパティを追加します。

   Properties
    {
         _MainColor("Color",color) = (0,0,0,1)//追加
         _Scale("Scale" ,float) = 0
        _Power("Power",float) = 0
        _userPos("Traget",vector) = (0,0,0,0)
        [HDR]_EmissionColor("Emission" ,color) = (1,1,1,1)
        
    }

もともとテクスチャをサンプリングしていたfloat4 colを_MainColorへ置き換えます。

            fixed4 frag(v2f i) : SV_Target
            {
                float2 Hex;
                float2 HexUV;
                float HexPos;
                float2 HexIndex;
                Hexagon(i.worldPos.xz, _Scale, HexIndex, HexPos, HexUV, Hex);

                fixed4 col = _MainColor;
                float StepHex = 1- step(float3(Hex,Hex.x), smoothstep(0.1,0.8, distance(i.worldPos* _Power, _userPos)));
                
               col *=  StepHex; 
                float3 emission = _EmissionColor.rgb*smoothstep( 0.1, 0.8,distance(i.worldPos* _Power, _userPos));
                emission *= 1-Hex.x;
               col.rgb += emission;
  
                return col;
            }

これによって次画像のような見た目を演出できました。

本日は以上です。 次回はいよいよHoloLensに適応していきます。