前回の記事では、シャドウを一般的に有効にしました。このトピックでは、エンティティごとにシャドウを操作する方法、および光源のタイプと設定できるプロパティによってシャドウがどのように変化するかについて説明します。シャドウを有効にする方法に関する前回の記事については、シャドウの視覚化 (1/2)を参照してください。
エンティティごとのシャドウ設定
デフォルトでは、シーン内のすべてのエンティティがシャドウを受け取り、シャドウを落としますが、この動作は各エンティティごとに制御できます。
void setEntityShadowParameters(OdDbEntity *pEntity, bool bCastShadows, bool bReceiveShadows)
{
pEntity->setCastShadows(bCastShadows);
pEntity->setReceiveShadows(bReceiveShadows);
}
上記のコード例のメソッドは、影の生成パフォーマンスに影響を与えるだけでなく、より良い視覚効果を生み出すのにも役立ちます。例えば、グラフィックシーンにランプシェード付きのテーブルランプがあり、その下に光源が配置されている場合、ランプシェードのオクルージョンオブジェクト(遮蔽オブジェクト)の影の生成を避けるために、ランプエンティティを影の投影プロセスから除外することができます。
光源の種類
結果として生じる影は、光源の種類によって異なります。
- 指向性ライト — 最も単純な光源タイプです。光の方向ベクトルのみで指定され、グラフィックシーン全体に影響を与えます。
- スポットライト — シーン内の照明コーンを表します。位置、方向、およびプロジェクターの照明領域を制御する角度を持ちます。
- 点光源 — 位置のみで指定され、グラフィックシーンのすべての方向に光を放射します。
スポットライトと点光源のタイプには、光源からの異なる距離での光強度の減衰を制御するために使用できる追加の減衰パラメータが含まれています。照明領域を制御し、不要なシーン部分での照明を除外するために、開始および終了の光減衰制限を使用することをお勧めします。
このシリーズの次のトピックでは、さまざまなプロパティを使用して影をさらに制御する方法について説明します。
レンダラー設定
レンダラーには、影の動作を正確に制御するための追加のプロパティが含まれています。通常、これらのプロパティは必須ではなく、デフォルト設定で使用できますが、より安定した、または正確な結果を得るのに役立つ場合があります。
- ShadowsRenderMode — ShadowsRenderModeプロパティは、キューブマップ、スムージングなどの影生成機能を有効/無効にするために使用できるビットマスクを表します。
- VsmShadowsAmount — バリアンスシャドウには、シーン内の他のオクルージョンオブジェクトから大きく離れたオクルージョンオブジェクトの端によって引き起こされるアーティファクトが含まれる場合があります。この効果はライトブリーディングと呼ばれます。残念ながら、この効果の量はレンダリングされるシーンの特性に依存し、自動的に計算することはできません。VsmShadowsAmountプロパティは、説明されているライトブリーディング効果を最小限に抑える機能を提供し、クライアントアプリケーションによって実験的に選択できます。
- ShadowMapSoftnessOverride — ShadowMapSoftnessOverrideプロパティは、シーン内のすべての光源の影のぼかし効果の量をオーバーライドする機能を提供します。デフォルトでは有効になっており、3に設定されています。範囲[0..3]で設定できます。
- ShadowMapSizeOverride — ShadowMapSizeOverrideプロパティは、シーン内のすべての光源のシャドウテクスチャサイズをオーバーライドする機能を提供します。デフォルトでは無効になっています。テクスチャサイズが大きいほど、より詳細な影が得られますが、影のエッジはより鮮明になります。テクスチャサイズが小さいと、影のエッジはより滑らかになりますが、詳細は少なくなります。テクスチャサイズが大きいほど、シャドウマップ生成により多くのGPUメモリとリソースも必要になります。
これらの影のプロパティについては、ODAドキュメントで詳しく説明されています(ログインが必要です)。
すべての影のプロパティは、標準のグラフィックシステムプロパティインターフェースを通じて設定できます。ベクトル化のプロパティに関する詳細については、ODAベクトル化デバイスプロパティを参照してください(ログインが必要です)。