GPUベースの断面表示

ODA SDKsバージョン2020 Update 1以降、ジオメトリ断面をリアルタイムで描画できます。この機能は、オブジェクトのジオメトリ構造を調査する能力を必要とするさまざまな製品で使用できます。CPU側で計算される断面と比較して、GPUベースの断面は出力ジオメトリや分析的な断面情報を生成しません。これらは断面結果の視覚的表現にのみ使用できます。

 

example sectioning results


この種の断面処理は完全にGPUによって行われます。これは、断面レンダリング中にCPUが他のタスクに解放されることを意味します。断面レンダリングのパフォーマンスは、GPUの機能のみに依存します。

GPUベースの断面処理は、OpenGL ES2レンダラーのみでサポートされています。古いレンダラーをサポートする現在の計画はありませんが、将来的にはMetalレンダラーでも断面処理ソリューションが計画されています。

OdHardwareSectionsInterface API

ハードウェアアクセラレーションによる断面機能はレンダリングデバイスの特性に完全に依存するため、ハードウェア断面機能との通信インターフェースは、GsプロパティAPIを使用してベクトル化デバイスから直接取得できます(ログインが必要です)

OdHardwareSectionsInterface APIクラスを呼び出すには、次のヘッダーファイルを含めます。

#include "ExHardwareSections.h"

これは.\main\Kernel\Extensions\ExRenderディレクトリで利用可能です。

次に、アクティブなOdGsDeviceへのポインタが必要です。新しいOdGsDeviceを作成してレンダリング用に準備するか、既存のOdGsDeviceを取得することができます。これはアプリケーションの特性に依存します。

注:OdGsDeviceはWinGLES2.txvベクトル化モジュールから作成する必要があります。他のベクトル化モジュールはハードウェア断面処理をサポートしておらず、後述するデバイスプロパティはそれらでは利用できません。

ハードウェア断面インターフェースには、次のコードスニペットに示すようにアクセスできます。

OdHardwareSectionsInterface *pHwSections = NULL;
if (pGsDevice && !pGsDevice->properties().isNull() && pGsDevice->properties()->has(OD_T("HardwareSections")))
  pHwSections = static_cast<OdHardwareSectionsInterface*>(pGsDevice->properties()->getAt(OD_T("HardwareSections")).get());

ここで、(pHwSections != NULL) の場合、ハードウェア断面機能を呼び出すことができます。

OdHardwareSectionsInterface APIクラスは、新しい断面平面の追加、既存の断面平面の変換、削除、アクセス、および断面ジオメトリの外観のカスタマイズ機能を提供します。すべての断面平面は個別のOdGsViewに対して一意であるため、各OdGsViewは独自の断面平面セットを持つことができます。

次の例では、最初のデバイスビューに既存の断面平面がある場合、それらを削除し、新しい断面平面を追加します。

OdHardwareSectionsInterface *pHwSections = getHwSectionsIface(pGsDevice);

if (pHwSections)
{
  OdGsView *pView = pGsDevice->viewAt(0);
  // Remove existing section planes if present
  if (pHwSections->numSectionPlanes(pView))
    pHwSections->clearSectionPlanes(pView);
  // Add new section plane
  pHwSections->addSectionPlane(pView, OdHardwareSectionsInterface::SectionDef(m_position, m_normal));
  // Enable section plane filling and set up filling color
  pHwSections->setEnableSectionsFill(pView, true);
  pHwSections->setSectionsFillColor(pView, ODRGBA(255, 0, 0, 255));
}

各断面平面は、平面位置(OdGePoint3dとして)と法線(OdGeVector3dとして)によって指定されます。これは古典的な平面指定です。デフォルトでは、断面の塗りつぶしは無効になっています(ジオメトリの単純なクリッピングによって行われます)が、OdHardwareSectionsInterface::setEnableSectionsFill()メソッドを使用して有効にできます。最後の呼び出しは、断面の塗りつぶしに不透明な赤色を設定します。平面の向きが正しく指定されていれば、次の断面画像が得られます。
 

section image

次に、以下の呼び出しを使用してセクションの動作をカスタマイズしてみましょう。

pHwSections->setSectionsFillColor(pView, ODRGBA(255, 0, 0, 128));
pHwSections->setEnableSectionsFillPattern(pView, true);
pHwSections->setSectionsFillPattern(pView, OdPs::kFsSlantRight);
pHwSections->setSectionsFillPatternColor(pView, ODRGBA(0, 0, 255, 255));

まず、セクションの塗りつぶしに半透明の赤色を設定します。次の呼び出しは、パターンをセクションジオメトリにレンダリングできるようにし、パターンタイプを設定し、パターン色を青に設定するために使用されます。最終画像:

enable rendering of the pattern onto section geometry

最後に、複数のセクション平面の動作を示すためにもう1つのセクション平面を追加します。

pHwSections->addSectionPlane(pView, OdHardwareSectionsInterface::SectionDef(m_position, m_normal));
pHwSections->addSectionPlane(pView, OdHardwareSectionsInterface::SectionDef(m_position, m_normal.rotateBy(OdaPI2, OdGeVector3d::kZAxis)));

二次セクション平面の法線は、Z軸を中心に90°回転しています。最終画像:

secondary section plane normal is rotated 90° about the z-axis

注:セクションの塗りつぶしが無効になっている場合、セクション平面による単純なクリッピングが行われます。


If section filling is disabled, we get simple clipping by section plane

結論

GPUベースのセクションには、以下の機能があります。

  • ハードウェアセクション生成は完全にGPUベースのソリューションであるため、パフォーマンスはGPUの機能にのみ依存します。この効果は複数のレンダリングパスを呼び出すため、セクション処理の有無でレンダリングパフォーマンスが多少異なる場合があります。
  • セクションの外観はカスタマイズ可能です。
  • 複数のセクション平面が完全にサポートされています。
  • 自己交差および重複するジオメトリで動作します。
self-intersected and overlapped geometry
  • セクション処理アルゴリズムは、有効な閉じたモデル(ペアになっていない穴がないもの)でのみ正しく機能します。そうでない場合、セクションレンダリングは予測不能なアーティファクトを生成する可能性があります。この画像は、モデルの下部にある2つの小さな赤い三角形を示しています。これは、3Dモデルの不正確さによって生成されたアーティファクトです。

    この画像は、モデルの下部にある2つの小さな赤い三角形を示しています。これは、3Dモデルの不正確さによって生成されたアーティファクトです。
  • ハードウェアセクション処理は、最新のグラフィックデバイス(OpenGL ES2、および近日中にMetal向けに提供予定)でのみ利用可能です。

GPUセクション処理は、一般的な最新のハードウェアで良好な結果を伴って効果的に処理できます。

今すぐ始める

ODAソフトウェアを60日間無料でお試しください。
リスクなし、クレジットカード不要。

無料で試す