spine-unity用アウトラインシェーダー
February 10th, 2020

spine-unityランタイムのすべてのシェーダーでアウトラインレンダリングをサポートできるようになったことを発表させていただきます!これにより、選択されたキャラクターや、Spineで動かしたUI要素やその他様々な要素の周りに色付きのアウトラインを表示することが簡単になります。

現在spine-unityランタイムに付属する各シェーダーは追加のOutlineセクションを提供するようになりました。マテリアルのOutlineパラメーターを有効にすると、そのシェーダーは自動的にSpine/shader_nameから新しいシェーダーバリアントSpine/Outline/shader_nameに切り替えられ、無効にすると元に戻ります。
このように別のアウトラインシェーダーを使うことで、アウトラインが不要な場所でレンダーパスが無駄にならず、ドローコールのバッチ処理に最適な状態を保つことができます。
作成とアウトラインマテリアルの切り替え

アウトラインマテリアルを作成するには、まず最初にオリジナルのマテリアルを複製します。
補足: これは通常の
SkeletonRenderer,SkeletonAnimationやSkeletonMecanim使用する場合のスケルトンアセットの次にある*_Materialが該当します。SkeletonGraphicの場合はSkeletonGraphicDefaultです。
新しいマテリアルを選択してマテリアルインスペクターでOutlineプロパティを有効にします。マテリアルがそれぞれのアウトラインシェーダーバリアントに自動的に切り替わります。
これでアウトラインマテリアルの準備ができたので、通常通りSkeletonRenderer および SkeletonGraphicコンポーネントに割り当てることができます。

SkeletonRendererについて、これはSkeletonRenderer.CustomMaterialOverrideを介して、またはSkeletonRendererCustomMaterialsコンポーネントを追加することで実行できます。SkeletonGraphicでは、SkeletonGraphic.materialプロパティを直接設定できます。
スケルトンの上にマウスを置いたときに表示されるアウトラインの例をご覧になりたい場合は、このブログの最後のアウトラインシェーダーのサンプルシーンセクションで説明されているサンプルシーンをご覧ください。
メッシュとテクスチャアトラスの要件
アウトラインシェーダーがどのように動作しているか - 近辺のサンプリング
通常、 RegionAttachmentまたはMeshAttachment内の透明ピクセルは、フレームバッファーに寄与しません。アウトラインシェーダーでは、各透明ピクセルが、特定の距離でその近辺に不透明ピクセルがあるかどうかをテストします。ある場合、アウトラインの色が描画されます。
注意: 正しい描画順序を維持するには、影響を受けるスケルトンの追加のレンダリングパスが必要です。
イメージとテクスチャアトラス - パディングまたは余白を追加する

アタッチメントの境界にアウトラインカラーを表示した際に上のように表示されている場合、ほとんどの場合そのアウトラインに近いアトラス画像の領域がメッシュにより伸びてしまっています。
アトラスのエクスポート設定によりパディングを追加して、隣接するアウトラインに十分なスペースを残すことができます。また、パディングを増やす代わりに、空白の除去を無効にすることを検討するのも良いでしょう。

または、この問題が発生しなくなるまでアウトラインの幅を減らすという手もあります。
メッシュアタッチメント - アウトラインを途切れさせないようにスペースを空ける

このアウトラインはメッシュの境界内にのみ描画できます。もしあなたが上のように輪郭の一部が切れてしまっているイメージを見かけた場合、メッシュの境界線が画像の不透明なピクセルの周りをあまりにもタイトに囲んでしまっている状態になっている可能性があります。
この問題を解決するには、メッシュ頂点を外側に移動させて十分なスペース(下の緑色で表示)を確保します。画像の境界に余白を追加する必要もあるかもしれません。

または、この問題が発生しなくなるまでアウトラインの幅を減らすという手もあります。
アウトラインシェーダーのサンプルシーン
現在spine-unityランタイムのパッケージに追加のサンプルシーンSpine Examples/Other Examples/Outline Shadersがあります。このシーンはマウスオーバーした際のアウトラインマテリアルの切り替えを行う方法を示しています。このサンプルシーンではUnityのEvent SystemのEvent Triggerコンポーネントを使用してマウスポインターの入力イベントと終了イベントに反応します。
まとめ
今回のspine-unityランタイムへの追加により、色付きのアウトラインをスケルトンに簡単に追加できるようになりました。どうぞ遠慮なくSpineフォーラムであなたの考えや作品を共有してください!