なんかいろいろしてみます

Oct 29, 2020 - 2 minute read - HoloLens

HoloLensのSingle Pass InstancedでTilt Brushのブラシを利用する

Googleが提供しているTiltBrushのUnity用SDKをHoloLensのSingle Pass Instancedで表示できるようにします.

Tilt Brush

  • Tilt BrushはGoogleが提供しているVR用のペイントアプリです.https://www.tiltbrush.com/
  • Tilt Brushにはアプリ内でペイントしたデータをUnityにインポートして表示できるSDKがオープンソースで提供されています.https://github.com/googlevr/tilt-brush-toolkit
  • SDK内にはブラシのマテリアルがあるので,これをLineRendererに適応してHoloLensでもTilt Brushのブラシを使ってみます.

HoloLensでTilt Brushのブラシを利用

  • Single Pass Instancedでは描画で利用されているShaderが対応していないと片目側にしか表示されない状態になります.
  • Tilt BrushのShaderの一部はSingle Pass Instancedに対応していないためShaderを修正する必要があります.

HoloLens用Tilt Brushのブラシの導入

  • Tilt Brushの最新のunitypackageを以下からダウンロードしてUnityにインポート後HoloLens用の設定を行います.

  • ビルドが正常で行えるようにThirdParty/Json-NET-for-Unity/Assemblies/Windows/Newtonsoft.Json.dllのプラットフォーム設定でWSAPlayerにチェックを入れて適応します.

Tilt BrushのShaderの修正

1234567
struct appdata_t {
    UNITY_VERTEX_INPUT_INSTANCE_ID  //<- 追記
    float4 vertex : POSITION;
    fixed4 color : COLOR;
    float3 normal : NORMAL;
	float2 texcoord : TEXCOORD0;
};
12345678
struct v2f {
    UNITY_VERTEX_INPUT_INSTANCE_ID  //<- 追記
	UNITY_VERTEX_OUTPUT_STEREO  //<- 追記
	float4 vertex : SV_POSITION;
	fixed4 color : COLOR;
	float2 texcoord : TEXCOORD0;
	float4 worldPos : TEXCOORD1;
};
 1 2 3 4 5 6 7 8 91011121314151617
v2f vert(appdata_t v)
{
	v.color = TbVertToSrgb(v.color);

	v2f o;

	UNITY_INITIALIZE_OUTPUT(v2f, o);  //<- 追記
	UNITY_SETUP_INSTANCE_ID(v); //<- 追記
	UNITY_TRANSFER_INSTANCE_ID(v, o); //<- 追記
	UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(o); //<- 追記

	o.worldPos = mul(unity_ObjectToWorld, v.vertex);
	o.vertex = UnityObjectToClipPos(v.vertex);
	o.texcoord = TRANSFORM_TEX(v.texcoord,_MainTex);
	o.color = v.color;
    return o;
}
 1 2 3 4 5 6 7 8 910111213
fixed4 frag(v2f i) : SV_Target
{
    UNITY_SETUP_INSTANCE_ID(i); //<- 追記

    // Create parametric flowing UV's
	half2 uvs = i.texcoord;
	float row_id = floor(uvs.y * 5);
	float row_rand = rand_1_05(row_id.xx);
	uvs.x += row_rand * 200;

	half2 sins = sin(uvs.x * half2(10,23) + _Time.z * half2(5,3));
	uvs.y = 5 * uvs.y + dot(half2(.05, -.05), sins);
    ...
  • 同様に Assets/TiltBrush/AssetsのShaderを修正していきます.
  • 以下修正したShader一覧

    • Assets/TiltBrush/Assets/Brushes/Basic/CelVinyl/CelVinyl.shader
    • Assets/TiltBrush/Assets/Brushes/Basic/ChromaticWave/ChromaticWave.shader
    • Assets/TiltBrush/Assets/Brushes/Basic/Comet/Comet.shader
    • Assets/TiltBrush/Assets/Brushes/Basic/Fire/Fire.shader
    • Assets/TiltBrush/Assets/Brushes/Basic/Highlighter/AdditiveCutout.shader
    • Assets/TiltBrush/Assets/Brushes/Basic/Rainbow/Rainbow.shader
    • Assets/TiltBrush/Assets/Brushes/Basic/SoftHighlighter/SoftHighlighter.shader
    • Assets/TiltBrush/Assets/Brushes/Basic/Streamers/Streamers.shader
    • Assets/TiltBrush/Assets/Brushes/Basic/VelvetInk/VelvetInk.shader
    • Assets/TiltBrush/Assets/Brushes/Basic/Waveform/Waveform.shader
    • Assets/TiltBrush/Assets/Brushes/Basic/Snow/Snow.shader
    • Assets/TiltBrush/Assets/Brushes/Basic/Embers/Embers.shader
    • Assets/TiltBrush/Assets/Brushes/Basic/Dots/Dots.shader
    • Assets/TiltBrush/Assets/Brushes/Basic/Bubbles/Bubbles.shader
    • Assets/TiltBrush/Assets/Brushes/Shared/Shaders/Bloom.shader
    • Assets/TiltBrush/Assets/Shaders/Include/Particles.cginc
  • 実際の表示

まとめ