Contact Shadows
Contact Shadows Volume Override (コンタクトシャドウボリュームオーバーライド) は、コンタクトシャドウの動作を制御するプロパティーを特定します。コンタクトシャドウとは HD レンダーパイプライン (High Definition Render Pipeline、HDRP) が深度バッファ内のスクリーンスペースで レイマーチ するシャドウです。コンタクトシャドウを使用する目的は、通常のシャドウマッピングアルゴリズムではキャプチャしきれない、詳細をキャプチャすることです。
コンタクトシャドウの有効化
まずプロジェクトに対して有効にしてから、Cameras でも有効にして、シーンでこの機能を使います。プロジェクト内で機能を有効にするには、HDRP Asset を使い、Cameras で有効化するには、フレーム設定 を使います。すべての Cameras に対して機能を有効にするには、Default Frame Settings を利用し、特定の Cameras に対して機能を有効にするには、各 Camera の個別 Frame Settings をオーバーライドします。
この機能に関して、 HDRP アセットで有効化するプロパティーは Lighting > Shadows > Use Contact Shadows です。 フレーム設定で有効化するプロパティーは Lighting > Contact Shadows です。
コンタクトシャドウの使用
コンタクトシャドウ は Volume フレームワークを使います。そのため、Contact Shadow プロパティーを有効化し変更するには、Contact Shadow オーバーライドをシーンの Volume に追加しなければなりません。Volume に Contact Shadow を追加する手順は以下の通りです。
- シーンまたは Hierarchy ウィンドウで、Volume コンポーネントを含むゲームオブジェクトを選択し、Inspector で表示します。
- Inspector で Add Override > Shadowing へ行き、Contact Shadows をクリックします。 これで HDRP はボリュームが影響を与えるすべてのカメラに対して Contact Shadows を適用します。
コンタクトシャドウは、ディレクショナル、ポイント、およびスポットライトと、ライトベースで有効化できます。各ライトの Shadows セクションで Contact Shadows ドロップダウンの下にある Enable チェックボックスを有効にすると、HDRP がそのライトに対してコンタクトシャドウを計算します。
一度に 1 つのライトだけがコンタクトシャドウを投影できます。つまり、コンタクトシャドウを投影するライトが画面上に 1 つ以上ある場合、主要なライトのみがコンタクトシャドウを描きます。HDRP はライトのバウンディングボックスのスクリーンスペースサイズから主要ライトを選択します。コンタクトシャドウを投影するディレクショナルライトは、常に主要ライトとなります。
ノート: ライトは深度バッファに書きこむマテリアルを使うメッシュレンダラーすべてに、コンタクトシャドウを投影します。これはメッシュレンダラーで Cast Shadows プロパティーが有効になっているかに左右されません。つまり、小さなゲームオブジェクトや小道具に Cast Shadows を無効にしたとしても、コンタクトシャドウを投影し続けるということです。これは、HDRP にシャドウマップでゲームオブジェクトをレンダリングして欲しくない場合に便利です。この動作を希望しない場合は、シェーダグラフを使って深度バッファに書きこまないマテリアルを制作してください。
API
ランタイム中このオーバーライドにアクセスし制御するためには、Volume スクリプティング API を使用します。Volume システムの仕組みにより、プロパティーは標準 Unity コンポーネントとは異なる方法で編集されます。また、各プロパティーに overrideState があるなど、他にも注意する点があります。これは Volume システムが、設定したプロパティー値と Volume Profile に保存されているデフォルト値のうち、どちらを使うかを指示します。API を正しい利用法についての詳細は、 Volume スクリプティング API を参照してください。
プロパティー
Volume コンポーネントのオーバーライドのプロパティーを編集するには、プロパティーの左にあるチェックボックスを有効にします。これにより HDRP も Volume コンポーネントに対して、デフォルト値ではなく特定されたプロパティー値を使うことになります。チェックボックスを無効にすると、HDRP は設定されたプロパティーを無視し、Volume のデフォルト値を代わりに使います。
プロパティー | 説明 |
---|---|
Enable | チェックボックスを有効にすると、HDRP はこの Volume に対するコンタクトシャドウを処理します。 |
Length | スライダーを使って、HDRP がトレーシングに使う光線の長さをメートル単位で設定します。光線がディテールをキャプチャできる最大距離としても機能します。 |
Distance Scale Factor | HDRP は距離に応じてコンタクトシャドウを拡大します。スライダーを使って、HDRP がスケールを減衰させアーティファクトと距離のバイアスを回避するために使う値を設定します。 |
Min Distance | HDRP がコンタクトシャドウをフェードインし始める、メートル単位のカメラからの距離です。 |
Max Distance | HDRP がコンタクトシャドウをゼロにフェードアウトし始める、メートル単位のカメラからの距離です。 |
Fade In Distance | Min Distance を超過した際に HDRP がコンタクトシャドウをフェードインする、メートル単位の距離です。 |
Fade Out Distance | Max Distance で HDRP がコンタクトシャドウをフェードアウトする、メートル単位の距離です。 |
Opacity | スライダーを使って、コンタクトシャドウの不透明度を設定します。値が低いほど、よりソフトであまり目立たないシャドウになります。 |
Bias | コンタクトシャドウを得るためにスクリーンスペースレイキャストに適用されるバイアスを制御します。値が高いほど、自己シャドウイングを減少させますが、過度に高い値はシャドウがベースから離れることに繋がる場合があり、特にコンタクトシャドウには望ましくありません。 |
Thickness | 光線沿いにあるオブジェクトの厚みを制御し、主にコンタクトシャドウを厚くします。シャドウにある穴を埋めるために利用できますが、過度に大きなシャドウを作ってしまう可能性もあります。 |
Quality | このエフェクトのクオリティーレベルを特定します。各クオリティーレベルは異なるプリセット値を適用します。Unity はプリセットがオーバーライドするプロパティーの編集ができないようにしています。各プロパティーに独自の値を設定したい場合は、Custom を選択してください。 |
Sample Count | スライダーを使って、HDRP がレイキャスティングに使うサンプル数を設定します。値を増やすとクオリティーは上がりますが、パフォーマンスが犠牲になります。 |
詳細
Mesh Renderer コンポーネントに関しては、Cast Shadows を Off に設定すると、コンタクトシャドウを適用しません。
コンタクトシャドウのコストは、基本的な PS4 の 1080p で 0.5 - 1.3 ミリ秒の間で変動します。