spine-unity用アウトラインシェーダー

February 10th, 2020

アウトラインシェーダー デモ

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

アウトラインシェーダー 有効/無効

現在spine-unityランタイムに付属する各シェーダーは追加のOutlineセクションを提供するようになりました。マテリアルのOutlineパラメーターを有効にすると、そのシェーダーは自動的にSpine/shader_nameから新しいシェーダーバリアントSpine/Outline/shader_nameに切り替えられ、無効にすると元に戻ります。

このように別のアウトラインシェーダーを使うことで、アウトラインが不要な場所でレンダーパスが無駄にならず、ドローコールのバッチ処理に最適な状態を保つことができます。

作成とアウトラインマテリアルの切り替え

アウトラインシェーダー既存マテリアルの複製

アウトラインマテリアルを作成するには、まず最初にオリジナルのマテリアルを複製します。

補足: これは通常のSkeletonRenderer, SkeletonAnimationSkeletonMecanim 使用する場合のスケルトンアセットの次にある *_Material が該当します。 SkeletonGraphic の場合はSkeletonGraphicDefaultです。

新しいマテリアルを選択してマテリアルインスペクターでOutlineプロパティを有効にします。マテリアルがそれぞれのアウトラインシェーダーバリアントに自動的に切り替わります。

これでアウトラインマテリアルの準備ができたので、通常通りSkeletonRenderer および SkeletonGraphicコンポーネントに割り当てることができます。

SkeletonRendererCustomMaterials経由で適用

  • SkeletonRendererについて、これはSkeletonRenderer.CustomMaterialOverrideを介して、またはSkeletonRendererCustomMaterialsコンポーネントを追加することで実行できます。
  • SkeletonGraphicでは、SkeletonGraphic.material プロパティを直接設定できます。

スケルトンの上にマウスを置いたときに表示されるアウトラインの例をご覧になりたい場合は、このブログの最後のアウトラインシェーダーのサンプルシーンセクションで説明されているサンプルシーンをご覧ください。

メッシュとテクスチャアトラスの要件

アウトラインシェーダーがどのように動作しているか - 近辺のサンプリング

通常、 RegionAttachmentまたはMeshAttachment内の透明ピクセルは、フレームバッファーに寄与しません。アウトラインシェーダーでは、各透明ピクセルが、特定の距離でその近辺に不透明ピクセルがあるかどうかをテストします。ある場合、アウトラインの色が描画されます。

注意: 正しい描画順序を維持するには、影響を受けるスケルトンの追加のレンダリングパスが必要です。

イメージとテクスチャアトラス - パディングまたは余白を追加する

画像全体のにじみ

アタッチメントの境界にアウトラインカラーを表示した際に上のように表示されている場合、ほとんどの場合そのアウトラインに近いアトラス画像の領域がメッシュにより伸びてしまっています。

アトラスのエクスポート設定によりパディングを追加して、隣接するアウトラインに十分なスペースを残すことができます。また、パディングを増やす代わりに、空白の除去を無効にすることを検討するのも良いでしょう。

アウトラインのためのエクスポート設定

または、この問題が発生しなくなるまでアウトラインの幅を減らすという手もあります。

メッシュアタッチメント - アウトラインを途切れさせないようにスペースを空ける

メッシュによりアウトラインが途切れた状態

このアウトラインはメッシュの境界内にのみ描画できます。もしあなたが上のように輪郭の一部が切れてしまっているイメージを見かけた場合、メッシュの境界線が画像の不透明なピクセルの周りをあまりにもタイトに囲んでしまっている状態になっている可能性があります。

この問題を解決するには、メッシュ頂点を外側に移動させて十分なスペース(下の緑色で表示)を確保します。画像の境界に余白を追加する必要もあるかもしれません。

アウトラインを頂点の外側に移動

または、この問題が発生しなくなるまでアウトラインの幅を減らすという手もあります。

アウトラインシェーダーのサンプルシーン

現在spine-unityランタイムのパッケージに追加のサンプルシーンSpine Examples/Other Examples/Outline Shadersがあります。このシーンはマウスオーバーした際のアウトラインマテリアルの切り替えを行う方法を示しています。このサンプルシーンではUnityのEvent SystemEvent Triggerコンポーネントを使用してマウスポインターの入力イベントと終了イベントに反応します。

まとめ

今回のspine-unityランタイムへの追加により、色付きのアウトラインをスケルトンに簡単に追加できるようになりました。どうぞ遠慮なくSpineフォーラムであなたの考えや作品を共有してください!