Appearance
断面表示シェーダー比較
概要
Looking Glass(LKG)ディスプレイ上で3Dモデルの断面を表示する機能は、医療・教育分野において非常に重要です。たとえば人体臓器の内部構造を立体視で観察したり、建築物の断面図をインタラクティブに操作したりといった用途が想定されます。
本記事では、LKG3DViewer の断面表示機能を実現するために調査・検証した 8種類以上のシェーダー/プラグイン を横断的に比較します。評価の観点は以下のとおりです:
- ランタイムでの動的断面表示が可能か
- Leap Motion 等のハンドトラッキングと連携できるか
- 断面の見た目(穴埋め・単色・内部構造表示)が用途に合うか
- 商用利用可否と価格
- Unity レンダリングパイプライン(Built-in / URP / HDRP)への対応状況
調査の目的は、ランタイムで読み込んだ3Dモデルに対し、Leap Motion 等を使って任意の面で断面表示を行う機能の実現にあります。
比較対象一覧
以下の表は、調査した全ソリューションの概要比較です。
| 名前 | 種類 | 価格 | 商用利用 | 対応バージョン | 断面処理の特徴 | デモ結果 |
|---|---|---|---|---|---|---|
| crossSection | Shader | $26.40 | 可能 | 2020.1~2022.1 | 切断面を平面で穴埋め | - |
| Section/Clipping Plane | Shader | $16.50 | 可能 | 2020.3.32f1 | 中身を輪切り状に表示可能 | 良好 |
| Cross Section Shader for URP | Shader | 無料 | 可能 | Unity 2021.3+ | 断面を単色表示 | デモ失敗 |
| Cross-Section Shader for Unity | Shader | 無料 | 可能 | Unity 2021.1+ | 断面を単色表示 | デモ失敗 |
| ezy-slice | Mesh切断 | 無料 | 可能 | 2018~ | 断面を閉じてマテリアルを貼る | 動作確認済 |
| Dynamic Mesh Slicer | Mesh切断 | 無料 | 可能 | 2022.3.14~ | 断面を閉じて画像を貼る | 動作確認済 |
| 断面シェーダー Cross Section Shader | Shader | 1,000円 | 可能 | 不明 | 断面を閉じずに中身を見せる | - |
| Advanced Dissolve | Shader | $38.50 | 可能 | - | 断面を閉じずに中身を見せる | - |
| CADライク断面表示(Qiita記事) | Shader | 無料 | 可能 | 不明 | シェーダーで断面を擬似的に埋める | 参考情報 |
各ソリューションの詳細
crossSection(Unity Asset Store)
- URL: Asset Store
- 種類: シェーダー
- 価格: $26.40
crossSection は Unity Asset Store で販売されているシェーダーアセットです。切断面を平面で穴埋めする方式を採用しています。
長所:
- 切断面が平面で閉じられるため、見た目が自然です
- Asset Store の正規アセットとしてサポートが期待できます
短所:
- 対応バージョンが 2020.1~2022.1 と範囲が限定されています
- デモ動画では基本的に断面が単色表示のみとなっています
- 有償アセットであり、コストが発生します
Section/Clipping Plane
- URL: Asset Store
- 種類: シェーダー
- 価格: $16.50
Section/Clipping Plane は、中にオブジェクトがあれば輪切り状に見ることが可能なシェーダーです。デモ動画の品質が高く、断面表示の見た目としては非常に良好です。
長所:
- 輪切り表示が可能で、内部構造を確認できます
- デモ動画の品質が高く、実用的な断面表示が期待できます
- 断面を閉じずに中身を見せるタイプであり、構造把握に適しています
短所:
- ビルトインパイプラインにしか対応していません(URP/HDRP 非対応)
- 断面の色表示には対応していないようです
- 有償アセットです
| Unity バージョン | ビルトイン | URP | HDRP |
|---|---|---|---|
| 2020.3.32f1 | 互換性あり | 互換性なし | 互換性なし |
Cross Section Shader for URP / Cross-Section Shader for Unity
- URL(URP版): GitHub - dedovskaya(Unity 2021.3+)
- URL(Unity版): GitHub - Z-E-R-0(Unity 2021.1+)
- 種類: シェーダー
- 価格: いずれも無料
GitHub で公開されている無料のクロスセクションシェーダーです。いずれも商用利用可能ですが、両方ともデモの動作確認に失敗しています。Unity 版はインポート時にレガシー README のエラーが発生し、URP 版も導入に技術的な問題がありました。断面表示は単色のみであり、実用性の検証ができていません。
ezy-slice
- URL: GitHub
- 種類: Mesh 切断ライブラリ
- 価格: 無料
ezy-slice は実際にメッシュを2つに分割するライブラリです。切断面を閉じてマテリアルを貼る方式です。
長所:
- 無料で商用利用が可能です
- Unity 2018 以降の幅広いバージョンに対応しています
- 操作性が良く、マテリアルの設定も簡単です(調査者の実感)
- 切断したモデルにコライダーを付与できます
- テクスチャアトラスを利用した動的な断面マテリアル切り替えが可能です
短所:
- Mesh 切断方式のため、大量切断時にはオブジェクトプール処理が必要になります
- 物理コライダーの再生成による負荷が発生します
- 断面を動的に切り替える場合はアトラス化等の追加実装が必要です
csharp
// ezy-slice でのテクスチャ領域指定例
TextureRegion region = myMaterial.GetTextureRegion(px, py, width, height);
SlicedHull hull = target.Slice(planePos, planeNormal, region);Dynamic Mesh Slicer
- URL: Asset Store
- 種類: Mesh 切断ライブラリ
- 価格: 無料
Dynamic Mesh Slicer は断面に表示する画像を選択して貼り付けるタイプのメッシュ切断ツールです。
長所:
- 無料で商用利用が可能です
- 断面画像の選択機能があります
- MeshFilter の Read/Write が有効なオブジェクトであれば何でも切断可能です
短所:
- 動的にスライスした断面の画像を切り替える処理は見当たりませんでした
- 臓器をスライスして場所ごとに画像を変えるような用途には不向きです
- 切断したオブジェクトに自動で Gravity が付与されるため、制御が必要です
断面シェーダー Cross Section Shader(Booth)
- URL: Booth
- 種類: シェーダー / 価格: 1,000円
断面を閉じずに中身を見せるタイプのシェーダーです。比較的安価ですが、対応バージョンが不明であり、Booth 販売のためサポートの継続性にやや不安があります。
Advanced Dissolve
- URL: Asset Store
- 種類: シェーダー / 価格: $38.50
断面を閉じずに中身を見せるシェーダーで、Asset Store の正規アセットです。ただし調査対象の中で最も高価であり、Dissolve 系はランダムに溶解表示するのが主目的のため、断面の法線補填は行いません。
CADライク断面表示(Qiita 記事参考)
- URL: Qiita
- 種類: ShaderGraph ベースの実装 / 価格: 無料
メッシュを再生成せず、シェーダーのアルファ判定とエミッションによる色塗りつぶしで断面を擬似的に埋めて見せる手法です。ShaderGraph ベースで理解しやすいですが、内部的にはメッシュが生成されていないため、内部に配置したオブジェクトを見ることはできません。
ソリューション分類
調査の結果、断面表示ソリューションは大きく3つのカテゴリに分類できます。
クロスセクション系シェーダー
Transform を介してプレーン座標を渡す方式です。Leap Motion の手の位置をそのまま平面 Transform に適用すれば、リアルタイムでの切断が可能です。シェーダーベースのため、メッシュの再生成が不要で軽量に動作します。
Mesh 切断ライブラリ
実際のメッシュを2つに分割する方式です。物理コライダーの再生成が可能なものもありますが、大量切断時にはオブジェクトプール処理が必要になります。断面にマテリアルを貼ることができるため、見た目のカスタマイズ性が高いです。
Dissolve 系シェーダー
ランダムに溶解表示するのが主目的であり、断面の法線補填は行いません。断面表示用途としては限定的です。
LKG3DViewer 断面表示機能
依頼内容と要件
LKG3DViewer の断面表示機能は、以下の要件で開発が進められました:
- ランタイム対応: エディタのみの動作は不可
- 任意のカット面を動的に設定可能: スライダーや手の動きに連動
- 見た目が破綻しない断面表示処理: 法線・ライティングを考慮
調査結果の考察
断面を閉じずに中身を見せるタイプのシェーダーとしては、以下の3つが候補に残りました:
- Advanced Dissolve
- 断面シェーダー Cross Section Shader(Booth)
- Section/Clipping Plane
これらは、家の外観と見取り図、車の外観と中の構造など、構造を把握する用途には十分に対応できます。
一方で、内臓を切って MRI のように見るといった医療用途に使えるアセットは、調査時点では見つかりませんでした。
Mesh 切断系では ezy-slice が最も扱いやすく、マテリアルの設定も簡単でした。動的な断面マテリアルの切り替えには、テクスチャアトラス化による参照領域の指定が現実的な方法です。
推奨と選定ガイド
用途別の推奨ソリューション
| 用途 | 推奨ソリューション | 理由 |
|---|---|---|
| 構造把握(建築・機械) | Section/Clipping Plane | 輪切り表示が可能で内部構造を確認できます |
| 教育用の簡易断面表示 | ezy-slice | 無料で操作性が良く、導入が容易です |
| 医療用(MRI 的表示) | 独自実装が必要 | 既存アセットでは要件を満たせません |
| URP プロジェクト | CADライク断面表示の手法を参考にカスタム実装 | URP 対応の既存アセットはデモ失敗のため |
| コスト重視 | ezy-slice | 無料で最も実用的です |
選定時のチェックポイント
- レンダリングパイプライン: URP を使用する場合、ビルトイン専用アセットは使用できません
- 断面の見た目: 用途に応じて「穴埋め」「単色」「内部表示」のどれが必要かを判断します
- パフォーマンス: Mesh 切断系はランタイム負荷が高いため、切断頻度を考慮します
- Leap Motion 連携: クロスセクション系シェーダーが最も相性が良いです
AI 補完
AI補完:クリッピングプレーンのシェーダー実装原理
断面表示シェーダーの多くは、フラグメントシェーダー内で clip() 関数 を使用しています。この関数は、引数が負の場合にそのフラグメント(ピクセル)の描画を破棄します。
基本的な実装の流れは以下のとおりです:
- C# スクリプトから平面(Plane)の位置と法線をシェーダーに渡します
- フラグメントシェーダーで、各ピクセルのワールド座標と平面との距離を計算します
- 平面の片側にあるピクセル(距離が負)を
clip()で破棄します
hlsl
// シェーダー内での基本的なクリッピング処理
float distance = dot(worldPos - _PlanePosition, _PlaneNormal);
clip(distance); // distance < 0 のピクセルは描画されないTransform を平面情報の入力に使うことで、Leap Motion のハンドトラッキング座標をそのまま適用できます。これにより、手の動きに連動したリアルタイム断面表示が実現可能です。
AI補完:URP とビルトインパイプラインにおける断面シェーダーの違い
Unity のレンダリングパイプラインの違いは、断面シェーダーの実装に大きく影響します。
ビルトインパイプライン:
- Surface Shader や固定パイプラインの記法が使用できます
clip()関数を直接 Surface Shader 内に記述できるため、実装が比較的簡単です- 多くの既存アセットがビルトインパイプライン向けに作られています
URP(Universal Render Pipeline):
- ShaderGraph を使用するか、HLSL で直接記述する必要があります
- ShaderGraph では Custom Function ノードを使って
clip()を呼び出します - ライティングモデルが異なるため、ビルトイン向けシェーダーの移植には書き換えが必要です
- マルチパスレンダリングの仕組みが異なり、ステンシルバッファの使い方にも注意が必要です
LKG 向け開発では、使用する Unity バージョンとパイプラインを事前に決定し、それに対応したアセットを選定することが重要です。Section/Clipping Plane のようにビルトイン専用のアセットは、URP プロジェクトでは使用できません。
AI補完:医療用3D可視化のベストプラクティス
医療分野における3Dモデルの断面表示では、以下の点を考慮する必要があります。
データの正確性:
- DICOM データから生成されたボリュームレンダリングと、ポリゴンメッシュベースの断面表示では精度が異なります
- MRI / CT のような連続的な断面表示を実現するには、ボリュームレンダリング技術(レイマーチング等)の方が適しています
- ポリゴンベースの断面表示は、臓器の外形把握や教育目的には有効ですが、診断用途には不十分です
インタラクション設計:
- 断面の位置・角度をスムーズに制御できる UI が必要です
- Looking Glass のような立体ディスプレイでは、奥行き方向の断面移動が直感的に理解しやすくなります
- Leap Motion との組み合わせにより、手の位置で断面を制御する自然なインタラクションが可能です
パフォーマンス要件:
- 医療用3Dモデルはポリゴン数が多いため、シェーダーベースの断面表示(Mesh 切断不要)が推奨されます
- LKG ディスプレイは複数視点のレンダリングが必要なため、処理負荷に特に注意が必要です
AI補完:ステンシルバッファを用いた断面レンダリング手法
断面を「閉じた」状態で表示するための高度な手法として、ステンシルバッファを利用するアプローチがあります。
基本原理:
- パス1: クリッピングプレーンで切断された部分の表面をレンダリングし、ステンシルバッファにマークを書き込みます
- パス2: クリッピングプレーンの位置に平面ジオメトリを配置し、ステンシルバッファでマークされた領域のみ描画します
この手法の利点:
- 実際のメッシュを分割せずに、断面が閉じているように見せることができます
- シェーダーのみで完結するため、ランタイム負荷が低いです
- CADライク断面表示(Qiita 記事)の手法はこの考え方に近いものです
crossSection アセットとの関係: crossSection アセットが「切断面を平面で穴埋めする」と記述されているのは、このステンシルバッファベースの手法(または類似のマルチパス手法)を使用している可能性があります。断面の色や模様を制御したい場合は、パス2 で使用するマテリアルをカスタマイズすることで対応できます。
hlsl
// ステンシル設定の概念例
Stencil {
Ref 1
Comp Always // パス1: 常にステンシルに書き込む
Pass Replace
}
// パス2 でステンシル値が 1 の領域のみ断面色を描画
Stencil {
Ref 1
Comp Equal // ステンシル値が 1 の箇所のみ描画
}Author: 松崎 | AI Enhanced: 2026-03-06 本記事は複数の調査記録を統合し、AI による技術補完を加えた比較記事です。