Fast Shadow Receiverには3つのタイプのレシーバー、InfinitePlaneShadowReceiver, MeshShadowReceiver, RaycastPlaneShadowReceiverがあります。

InfinitePlaneShadowReceiver

もしシーンが巨大な1枚の平面の地面と小さなオブジェクト(ビルとか木とかくらいの大きさ)で構成されているような場合、InfinitePlaneShadowReceiverを使うことができます。このレシーバーは無限平面に影を落とすために使われますが、依然として小さなオブジェクトに影を落とすことも可能です。というのも、小さなオブジェクト全体に影を描画するのにはそれ程負荷がかからないので、Projectorの機能で普通に影を描画すれば良いからです。そして巨大な地面に影を落とすのをやめて、InfinitePlaneShadowReceiverに影を落とすようにすることで、GPUにかかる負荷を大きく削減することができます。
下の図はInfinitePlaneShadowReceiverを使った場合の例です。この例ではPlaneオブジェクトが地面になっていて、InfinitePlaneShadowReceiverが影の落ちる場所に矩形ポリゴンを作っているのがわかると思います。その横に立っている円柱は小さなオブジェクトに相当します。InfinitePlaneShadowReceiverを使った場合でも、きちんと小さなオブジェクトに影を落とすことができるのが確認できると思います。

ScreenshotInfinitPlane

MeshShadowReceiver および RaycastPlaneShadowReceiver

もし、シーンが巨大な1枚の平面ではなく、デコボコした曲面を持つ大きな背景オブジェクトを持つ場合は、MeshShadowReceiverもしくはRaycastPlaneShadowReceiverを使います。

MeshShadowReceiverは大きな背景オブジェクトのメッシュの中から影の当たる部分だけを拾い出します。背景オブジェクトは単独のオブジェクトである必要はなく、複数のオブジェクトで構成されている場合でも、ひとつのMeshShadowReceiverで背景オブジェクト全体をカバーできます。このレシーバーはメッシュの中からポリゴンを探索するので、CPUの負荷は高くなります。それでも事前に探索用のツリーを作っておくので探索にかかる時間はそれほど長くはありません。

一方のRaycastPlaneShadowReceiverはレイキャストをして、レイの当たった場所に矩形ポリゴンを生成します。そのため、メッシュを探索するMeshShadowReceiverに比べればCPUの負荷は低くなりますが、矩形ポリゴンなので実際の地形にピッタリとフィットするわけではありません。

下の画像はこれらの2つのレシーバーを比較したものです。これらのサンプルでは、テレインオブジェクトを使っています。左側の画像はMeshShadowReceiverを使ったもので、右側の画像がRaycastPlaneShadowReceiverを使ったものです。この図からわかるように、MeshShadowReceiverは地面にピッタリくついたメッシュを生成していますが、RaycastPlaneShadowReceiverで生成された矩形ポリゴンは地面からちょっと浮いています。もし地面が窪んでいた場合、矩形ポリゴンは地面に突き刺さっていたでしょう。

ScreenshotTerrainMesh        ScreenshotTerrainPlane

MeshShadowReceiver vs InfinitePlaneShadowReceiver

次の画像はMeshShadowReceiverを使ったもうひとつの例です。このシーンは前のInfinitePlaneShadowReceiverのサンプルと同じものですが、円柱のオブジェクトも背景オブジェクトの一部としてMeshShadowReceiverでカバーされています。そのためMeshShadowReceiverは地面と円柱のメッシュの中から影の当たる部分を抜き出して影を描画しています。この方がGPUの負荷は軽減しますがCPUの負荷が上がるので、このようなケースではInfinitePlaneShadowReceiverを使うことを推奨します。

ScreenshotMeshShadowReceiver

Links

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

Anti Spam Code *