シャドウマッピング
はじめに
シャドウマッピングは、3Dシーンにリアルタイムの影を提供するための一般的なテクニックです。これは、光源の視点から深度マップテクスチャをレンダリングすることによって動作します。次に、3Dモデルのピクセルをシェーディングするときに、その深度値が深度マップと比較され、影になっている場合はより暗く、光に照らされている場合はより明るくシェーディングされます。
影はシーンの知覚的リアリズムを高め、オブジェクトの相対的な位置を判断しやすくします。
画像の左のシーンでは、オブジェクトが平面からどのくらい離れているのかが分かりませんが、右のシーンでは影があるため簡単に分かります。
Qt では、3 種類のライト(DirectionalLight 、PointLight 、SpotLight )のシャドウマッピングをサポートしています。シーンで影を有効にするには、まずcastsShadow をtrue
に設定して、影を落とすようにライトを設定する必要があります。次にcastsShadows とreceivesShadows をtrue
または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 を使用して、シャドウマップの最大距離を制御できます。このプロパティは、PointLight とSpotLight 対DirectionalLight で若干動作が異なります。
PointLight/SpotLight の場合、レンダリングされるシャドウのバウンディングボックスの大きさを決定しますが、DirectionalLight の場合、シーンのカメラからシャドウマップがシーン内でカバーする距離を定義します。
上の画像は、同じシーンで同じ指向性ライトを使用していますが、shadowMapFar に2つの異なる値を指定しています。
イメージベースライティングと ライトマップとグローバルイルミネーションの使用も参照してください 。
©2024 The Qt Company Ltd. 本書に含まれるドキュメントの著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。