影の視覚化(1/2)

ODAカーネルに追加された影の機能により、シーン内の光源の影を計算して描画できます。この一連のトピックでは、既存の.dwgファイルで影を有効にする方法と、最適な結果を得るために影のレンダリングを構成する方法について説明します。

 

example with shadows

 

影は、光源を含む既存のグラフィックシーンにさらなるリアリズムを追加できます。ライティングが有効になっている場合(シェーディングおよびリアルなビジュアルスタイル用)にレンダリングできます。影はOdGiShadowParametersクラスによって表現され、ライトパラメータの一部として管理されます。

光源の影を有効にする

まず、シーン内で影を落とす光源の影を有効にします。

void configureLightSourceShadow(OdDbLight *pLight)
{
  OdGiShadowParameters shadowParams = pLight->shadowParameters();
  shadowParams.setShadowsOn(true);
  shadowParams.setShadowType(OdGiShadowParameters::kShadowMaps);
  shadowParams.setShadowMapSize(256);
  shadowParams.setShadowMapSoftness(1);
  pLight->setShadowParameters(shadowParams);
}

各光源は独自の影のパラメータを持つことができます。光源はOdDbDatabase内でOdDbLightエンティティとして表現されます。

影のパラメータには、主要なプロパティに対する以下の設定メソッドが含まれています。

  • setShadowsOn() メソッドは、設定された光源の影を有効または無効にするために呼び出すことができます。
  • setShadowType() メソッドは、影のタイプを設定するために呼び出すことができます。GL2レンダラーは常にシャドウマップを呼び出し、他のモードをサポートしないため、このパラメータは常にkShadowMapsとして設定することをお勧めします。
  • setShadowMapSize() メソッドは、シャドウマップテクスチャのサイズを設定するために呼び出すことができます。テクスチャサイズが大きいほど影のディテールは増しますが、追加のリソースが必要となり、最終的な影はより鮮明になります。テクスチャサイズが小さいほど影のディテールは減りますが、最終的な影はより滑らかになります。
  • setShadowMapSoftness() メソッドは、影の滑らかさを設定するために呼び出すことができます。現在、4つのスムージング段階がサポートされています。

 

0 スムージングを無効にする。
1 3x3ガウスぼかしカーネルを使用してスムージングを呼び出す。
2 5x5ガウスぼかしカーネルを使用してスムージングを呼び出す。
≥3 7x7ガウスぼかしカーネルを使用してスムージングを呼び出す。

ぼかしはGPU側で実行されるため、ガウスカーネルのサイズによる深刻なパフォーマンスの違いはありません。主にこのパラメータは、ぼかし効果の量(ぼかされた領域のサイズ)に影響します。

ビジュアルスタイルで影を有効にする

Phongモデルライティングが有効な各ビジュアルスタイルは影を表示するために使用できますが、すべてのデフォルトのビジュアルスタイルが影のプロパティをデフォルトで有効にしているわけではありません。

void enableVisualStyleShadows(OdDbVisualStyle *pVisualStyle)
{
  pVisualStyle->setTrait(OdGiVisualStyleProperties::kDisplayShadowType, (OdInt32)OdGiVisualStyleProperties::kShadowsFull);
}

ビジュアルスタイルの影を有効にするには、kDisplayShadowTypeプロパティをkShadowsNone以外の値に設定します。kShadowsFullの設定が推奨されます。また、ピクセルごとのライティングを有効にすることをお勧めします。なぜなら、面ごとおよび頂点ごとのライティングでは、すべてのシャドウマップの詳細を表示するのに十分ではないからです。

デフォルトのビューポートライティング

初期状態では、デフォルトのビューポートライティングが使用されますが、これを無効にする必要があります。

void defaultDefaultLights(OdDbViewport *pViewport)
{
  pViewport->setDefaultLightingOn(false);
}

デフォルトのビューポートライティングが有効になっている場合、レンダラーはシーンライトの代わりにそれを描画するため、シーンライトからの影を見ることができません。

このシリーズの次のトピックでは、エンティティごとに影を操作する方法、および影が異なるライトの種類とプロパティによってどのように影響されるかについて説明します。

今すぐ始める

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

無料で試す