シャドウマッピング

はじめに

シャドウマッピングは、3Dシーンにリアルタイムの影を提供するための一般的なテクニックです。これは、光源の視点から深度マップテクスチャをレンダリングすることによって動作します。次に、3Dモデルのピクセルをシェーディングするときに、その深度値が深度マップと比較され、影になっている場合はより暗く、光に照らされている場合はより明るくシェーディングされます。

影はシーンの知覚的リアリズムを高め、オブジェクトの相対的な位置を判断しやすくします。

画像の左のシーンでは、オブジェクトが平面からどのくらい離れているのかが分かりませんが、右のシーンでは影があるため簡単に分かります。

Qt では、3 種類のライト(DirectionalLightPointLightSpotLight )のシャドウマッピングをサポートしています。シーンで影を有効にするには、まずcastsShadowtrue に設定して、影を投げるようにライトを設定する必要があります。次に、castsShadowsreceivesShadowstrue またはfalse に設定することで、影を投げるモデルと受けるモデルを制御できます。

指向性ライト

ディレクショナル・ライトは、無限に遠くにある特定できない光源から一方向に光を放ちます。これは現実の太陽光と同じです。指向性ライトは無限の範囲を持ち、減衰しません。

カスケードシャドウマップ

DirectionalLight 、ライトの視点からシーン全体をレンダリングしてしまうという問題があります。これは、シャドウマップのサイズが適切でない場合、ブロックのような見た目の影につながる可能性があります。より良いレンダリング品質を得るための1つのオプションは、カスケードシャドウマップ(CSM)を使用することです。QtはParallell Split Shadow Maps(PSSM)と呼ばれるCSMのバージョンをサポートしています。PSSMは、ビュー・フラストゥムをいくつかの部分に分割し、それぞれの部分に対してシャドウマップをレンダリングすることで機能します。

この図は、PSSMで分割されたビュー・フラストラムの抽象的なイメージです。2つの分割が3つのカスケードで終わっています。

こうすることで、カメラの近くではシャドウマップの解像度が向上し、カメラの遠くでは解像度が低下し、視覚的な品質が低下します。

上の図は、分割なしのシャドウマップ(左)と3分割のシャドウマップ(右)を示しています。

カスケード分割の数はcsmNumSplits プロパティで、分割の位置はcsmSplit1,csmSplit2,csmSplit3 プロパティで制御できます。また、csmBlendRatio プロパティで、分割間のブレンドの量を指定することができます。

上の図はカスケードシームを拡大したものです。

分割を追加するたびに、アプリケーションは別のシャドウマップをレンダリングする必要があり、パフォーマンスに悪影響を与えることに注意してください。ブレンド領域のサイズはパフォーマンスに影響するので、できるだけ小さくしてください。

ポイントライト

PointLight は球体として表現でき、ライトの中心から所定の半径までの全方向に等しい強さで光を放ちます。これは電球の発光に似ています。

PointLight 、シャドウマップをキューブマップにレンダリングします。これは6回のレンダリングパスを行うことを意味します。これはかなり計算コストがかかります。

スポットライト

SpotLight は、coneAngle プロパティで定義された円錐形の一方向に向かって光を放ちます。光の強さは、coneAngle に近づくと弱くなります。光の強さが弱くなり始める角度は、innerConeAngle で定義されます。これは、懐中電灯やスポットライトの発光方法と似ています。

PointLight とは異なり、SpotLight はシャドウマップを単一の深度マップにレンダリングします。

パフォーマンスとシーンの調整

Qtは、シャドウマップに関するプロパティに適切なデフォルト値を提供しようとしていますが、通常は、特定のシーンに合うように調整する必要があります。特に、シーンが想定よりもずっと小さかったり大きかったりする場合です。次のセクションでは、シャドウマップの見栄えを良くしつつ、できるだけ良いパフォーマンスを維持するために、値を微調整する方法について詳しく説明します。

シャドウバイアス

Shadow bias は、いわゆるシャドウアクネを除去する方法です。シャドウアクネとは、通常特定のパターンに現れる偽の影のことです。シャドウバイアスは、シャドウマップの深度テクスチャをオフセットして、シャドウイングオブジェクトから影が遠くに見えるようにします。難点は、シャドウバイアスがかかりすぎると、影が影を落としているオブジェクトから離れすぎてしまう、ピーターパンと呼ばれるエフェクトが発生することです。シャドウマップの解像度を上げることで、シャドウアクネを減らすことも可能です。

上の画像は、シャドウバイアスが0のシーン(左)と10のシーン(右)を示しています。左のシーンでは、円錐と円柱の上部に偽の影があります。

シャドウマップの解像度

シャドウマップの解像度/品質は、shadowMapQuality プロパティによって制御されます。シャドウマップの品質を高くすると、シャドウのブロック性が低下しますが、レンダリングにかかるコストが高くなるため、必要なビジュアル品質を維持しながら、できるだけ低く設定してください。

上の画像は、低いシャドウマップ解像度と高いシャドウマップ解像度のシーンを示しています。

ソフトシャドウの品質

ソフトシャドウは、実生活での影の見え方に近似する方法で、エッジで硬い影から柔らかい影へとフェードアウトします。ソフトシャドウの品質は、softShadowQuality プロパティによって制御されます。柔らかさのないハードシャドウと、さまざまな品質のパーセンテージクローズフィルタリング(PCF)ソフトシャドウをサポートしています。ハードシャドウはレンダリング費用が最も安く、PCFは品質が高くなるほど費用が高くなります。ソフトシャドウの半径を制御するには、pcfFactor プロパティを使用します。pcfFactor の値はレンダリング速度には影響しませんが、これが高いほど、ソフトシャドウの品質が高くなり、見栄えが良くなります。

上の画像は、左側にsoftShadowQuality Light.Hard のシャドウがあるシーン、右側にsoftShadowQuality Light.PCF32 と pcfRadius10 があるシーンを示しています。

シャドウマップ遠距離

プロパティshadowMapFar を使用して、シャドウマップの最大距離を制御できます。このプロパティは、PointLightSpotLightDirectionalLight で若干動作が異なります。

PointLight/SpotLight の場合、レンダリングされるシャドウのバウンディングボックスの大きさを決定しますが、DirectionalLight の場合、シーンのカメラからシャドウマップがシーン内でカバーする距離を定義します。

上の画像は、同じシーンで同じ指向性ライトを使用していますが、shadowMapFar に2つの異なる値を指定しています。

イメージベースライティングと ライトマップとグローバルイルミネーションの使用も参照してください

© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.