このページでは

シャドウマッピング

はじめに

シャドウマッピングは、3D シーンにリアルタイムの影を付けるための一般的な手法です。これは、光源の視点から深度マップテクスチャをレンダリングすることで機能します。 その後、3D モデルのピクセルにシェーディングを行う際、その深度値が深度マップと比較され、影になっている場合は暗く、光に照らされている場合は明るくシェーディングされます。

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

影を無効にした場合と有効にした場合のシーンの比較

画像の左側のシーンでは、オブジェクトが平面からどれほど離れているのか判断できませんが、右側のシーンでは影のおかげで簡単に判断できることに注目してください。

Qtは、3つのライトタイプすべて(DirectionalLight 、PointLight 、SpotLight )でシャドウマッピングをサポートしています。シーンで影を有効にするには、まずcastsShadow をtrue に設定して、ライトが影を落とすようにする必要があります。その後、castsShadows およびreceivesShadows をtrue またはfalse に設定することで、どのモデルが影を落とし、どのモデルが影を受けるかを制御できます。

指向性ライト

指向性ライトは、無限遠にある特定できない光源から一方向に光を放ちます。これは現実世界での太陽光の働きに似ています。指向性ライトの照射範囲は無限であり、光量は減衰しません。

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

DirectionalLight ( )の課題の一つは、シーン全体を光源の視点からレンダリングしてしまう点です。これにより、シャドウマップのサイズが不十分な場合、影がブロック状に見えてしまうことがあります。レンダリング品質を向上させるための選択肢の一つとして、Cascaded Shadow Maps (CSM) の使用が挙げられます。 Qtは、Parallel Split Shadow Maps(PSSM)と呼ばれるCSMのバージョンをサポートしています。PSSMは、ビューフラスタムをいくつかの部分に分割し、各部分ごとにシャドウマップをレンダリングすることで機能します。

シャドウマッピングのためにビューフラスタムをカスケードに分割した図

この図は、PSSMによる分割が施されたビューフラスタムの概念図を示しています。2つの分割が行われ、その結果3つのカスケードが形成されています。

これにより、視覚的な品質がより顕著に感じられるカメラに近い場所ではシャドウマップの解像度を高め、視覚的な品質がそれほど気にならないカメラから遠い場所では解像度を低く設定することができます。

0カスケードおよび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 およびpcfFactor の10 が適用されたシーンを示しています。

シャドウマップの最大距離

shadowMapFar プロパティを使用すると、シャドウマップの最大距離を制御できます。このプロパティの動作は、PointLight およびSpotLight と、DirectionalLight では若干異なります。

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

近面および遠面の影の調整を示した比較

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

シャドウマップのビット深度

シーンが非常に大規模な場合、シャドウマップの深度軸上で広範囲をカバーすることになる場合があります。例えば、カメラの視野から遠く離れた位置にありながら、依然として影を落とし、シャドウマップの範囲に含まれる必要があるオブジェクトが多数存在する場合などです。 この場合、shadowBias の値を高く設定しても、シーンにバンディングアーティファクトが発生することがあります。これを解決する1つの方法は、シャドウマップに32ビットの深度を使用することです。プロパティ「use32BitShadowmap 」を「true 」に設定することで、その特定のライトに対してこの機能を有効にできます。

32ビットと16ビットのシャドウマップの精度の比較

上の画像は、同じ方向性ライトを使用した同じシーンですが、一方は32ビットのシャドウマップを使用し、もう一方は16ビットのシャドウマップを使用しています。

「イメージベースライティング、ライトマップ、グローバルイルミネーションの使用」および「Qt Quick 3D - カスケードシャドウマップの例」も参照してください 。

© 2026 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.