反射

現実の世界では、ほぼすべてのサーフェスは少なくとも何らかのスペキュラ反射を示します。Stingray の物理ベースのレンダリング システムでは、各マテリアルの金属の設定が、特定の表示角度にあるマテリアルが示すスペキュラ反射の量を決定します。さらに粗さの設定ではそれらの反射がどのくらいシャープまたはブラーであるかを決定します。

しかし、反射光が必要な場合、これらの反射はどこから取得するのでしょうか?

シーン内の他のオブジェクト(これらのオブジェクト自体もシーンの他の部分を反射する場合があります)を正確に反射するには、シーン内の光線のパスを、複数のバウンスを追ってトレースする必要があります。関係するサーフェスの数、および反射の相互作用がいかに複雑であるかを考えると、このような種類のシミュレーションに必要な計算をゲームでリアルタイムに行うと、処理に時間がかかり過ぎます。

ただし、レベルでの反射光に十分に近い近似を作成する方法はいくつかあります。どの方法が自分のゲームに適しているかを、その利点のバランスを考慮して決定する必要があります。一般的に、使用するマテリアルがスムーズで平坦であればあるほど、十分な精度の反射を作成するには、より多くの作業が必要になります。

非金属のサーフェスに示されるスペキュラ ライトのカラーは変化しないことに留意してください。金属のサーフェスでは、マテリアルのカラーに基づいて反射するライトに色合いを付けます。

グローバル スペキュラ ライト

シェーディング環境のグローバル ライト設定では、オブジェクトがスペキュラ反射を表示する必要のあるときに、常に既定で使用されるテクスチャを指定できます。これは 1 つのボリュームマップで、通常、レベルの代表的な位置に反射プローブを配置して、テクスチャにその反射プローブをベイク処理することで生成します。この手順の詳細については、「グローバル環境ライティング」を参照してください。

このアプローチは、1 つの場所でレベル内のすべてのサーフェスに基本的なスペキュラ ライティングを設定する簡単な方法です。レベルに比較的一貫性のあるライティング条件があり、サーフェスが過度にスムーズではなく反射が大きくない場合は、この方法を使用して、物理ベースのマテリアルに、本物らしく見える反射光を適切な色で十分表現できる場合があります。

たとえば、次のシーンでは、グローバル スペキュラ マップが、反射率の高い氷で覆われた地面のハイライトを提供しています。

このグローバル ライト マップがあらゆる場所に適用されるという事実は、このアプローチの欠点でもあります。つまり、ボリューム マップが、レベル内の特定の場所を不適切なスペキュラ ライトのカラーやレベルで表現することが多々あります。たとえば、グローバル スペキュラ マップをベイク処理するライト プローブに空が表示されている場合、建物内や他のオブジェクトの下にあるサーフェスなどで、空がサーフェスから遮断された場合でも、空が反射に表示されます。次のイメージでは、この角度では空は壁と天井で遮断されるため、氷には空は反射されるべきではありません。

配置された反射プローブ

グローバル スペキュラ ライティングに使用するプローブ以外に、シーンに追加のライト プローブを配置することができます。

反射オブジェクトがレベルの反射プローブに設定された境界の内側にある場合、常にオブジェクトのサーフェスは、そのプローブによってベイク処理された反射マップをグローバル マップの代わりに使用します。通常、これらのローカライズされた反射マップは、1 つのグローバル スペキュラ マップより、そのプローブに近いオブジェクトに対してより正確になります。

たとえば、次のイメージでは、プローブは球の位置に配置されます。そのベイク処理された反射は、球の視点からシーンを正確に表示するために、グローバル スペキュラ反射マップをオーバーライドします。

さらに、複数の反射プローブの境界がオーバーラップし、サーフェスがオーバーラップした領域内にある場合は、そのサーフェスはそれらの反射マップ、および反射マップの相対的な位置に基づいた、その間にある補間の両方を選択します。これにより、常にできるだけリアルな反射を維持しながら、複数のプローブでベイク処理された反射間をシフトするために、反射サーフェスを持つオブジェクトを移動できます。

反射プローブを配置したレベルを設定する手順については、「ベイク処理された反射プローブを設定する」を参照してください。

通常、ローカライズされた反射プローブを使用すると、1 つのベイク処理されたグローバル スペキュラ テクスチャを使用した場合よりも改善されます。ただし、グローバル ライティングを使用した場合と同様のアーティファクトが引き続き発生することがあります。つまり、スペキュラ ライトが実際には到達できない場所に、スペキュラ反射が表示されたり、反射に期待どおりのオブジェクトが表示されなかったりします。

たとえば、次のイメージでは、ボックスは非常にメタリックな材質として作成されているため、プローブによってベイク処理したスペキュラ反射を取り込みます。この例では、反射が正確に表現されていません。背の高い方のボックスは、赤い壁を反映する必要があります。

レベルに対して反射をベイク処理するときに、ライト プローブを使用する最大の欠点は、ベイク処理されたテクスチャが静的であることです。レベルに表示される反射には、ベイク処理された時点でそのレベルにあるオブジェクトだけを含むことができます。ゲームの過程で動的に発生したオブジェクトは、反射されません。たとえば、ゲームで建物が破壊された場合でも、近隣のサーフェスの反射にその建物が表示され続けます。変更が予測可能である場合は、複数のライト プローブ セットをベイク処理することでこの制限事項を回避できることがあります。1 つは建物が存在するプローブ セット、もう 1 つは建物が存在しないプローブ セットを作成して、フローまたは Lua ゲームプレイ コードからその反射プローブを切り替えます。ただし、この方式も拡張性がありません。

画面空間反射

ほとんどのゲーム レベルは時間の経過とともにさまざまに変化します。プレイヤー キャラクタ、プレイヤー以外のキャラクタ、および車両が動き回り、パーティクル エフェクトが開始したり停止したりし、オブジェクトが作成されたり破壊されたりします。これらの動的なオブジェクトを反射サーフェスに表示させるために、画面空間反射を追加できます。これは各フレームのレンダリング後のポスト効果として動的な反射を「フェイク」する手法です。

Stingray でフレームをレンダリングするときに、深度バッファも作成されます。これはフレーム内のカメラからシェーディングされたさまざまなサーフェスまでの距離の記録です。この深度情報を使用して、レンダラーはサーフェスがフレーム内でレンダリング済みでないものを反射していることを検出できます。次に、反射サーフェスにシェーディングされたオブジェクトを反射できます。

ここでは、静的なターゲットとランプが反射されているだけではなく、動的なキャラクタも確認できます。

画面空間反射は、動的に移動するオブジェクトを追加し、サーフェスに周囲を正確に反射させることで、ベイク処理されたプローブを補完します。また、実際に表示される内容に従ってスペキュラ ハイライトの明暗を調節することで、ベイク処理されたプローブを補完できます。たとえば、このバージョンでは、上に示すイメージの場合、画面空間反射により地面上に表示されるべきではないスペキュラ ハイライトが薄暗くされています。

シェーディング環境で画面空間反射を設定します。詳細については、「シェーディング環境のプロパティ」を参照してください。

ただし、画面空間反射が完璧であるわけではありません。ギザギザが非常に目立つアーティファクトを生成することがあるため、通常、少なくともやや粗さのあるサーフェスでの使用に最適です。通常、完全にスムーズな金属では不完全さが浮き彫りになります。

さらに、画面空間反射は本質的に、フレーム内の他の場所にサーフェスが既に表示されていない場合は反射できません。これは、オブジェクトの画面外の部分は表示されず、カメラから遠ざかる方向を向いているオブジェクトのあらゆる面も表示されないことを意味します。また、レンダリングされたオブジェクトの厚さに関する情報も提供されません。したがって、画面空間内でフォアグラウンド オブジェクトが反射サーフェスとそれが反射するべきオブジェクト間に介入している場合に、バックグラウンド オブジェクトがレンダリングされるべきかを判断できない場合があります。シェーディング環境では、これらのアーティファクトを最小限に抑えるために使用できるいくつかのパラメータを提供します。

反射ソースを結合する

ゲーム内で 3 つすべてのアプローチを同時に使用することができます。次のように、レンダラーはこれらの効果を各ピクセルに適用します。