本日は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に適応していきます。