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