Blogこの広告は、90日以上更新していないブログに表示しています。2022-06-28URPで丸影を真下に落とす方法の検討はじめにShader好きなエンジニアのおうどん(@oudon)です。キャラクターの影を軽量化するため丸影にしつつ真下に落とす、かつ数も多く表示したいという要件でShadowMap拡張とDecalの2パターンほど試してみました。ShadowMapをそのまま利用できないか軽量にということで、標準のShadowMapを利用してなんとかできないかというところからスタートしました。特定のオブジェクトだけ常に真上から光を受け取れる状態がつくれば真下に落ちそうです。Onlyとする方法にしました。ついでに常に上から光を受けた2Dの円表現になる想定なので一旦Yは0にしてつぶしておきます。RenderingPipelineの方でその情報を元に実際にShadowMapに書き込んでくれてるようです。いうことでCaster側でオブジェクトの影が常に真下に落ちるように位置を偽装してやればいけそうな気がします。URPの標準パッケージ内のコードを参考に改造していきます。RP/Shaders/ShadowCasterPass.hlslワールド座標からクリップ座標を計算している該当の処理がGetShadowPositionHClip関数にありました。positionCS;}ここのpositionWS(ワールド座標)を弄ってxzのライトによる影響を無効化、yの高さでの変動を無効化してやりました。lightDirectionWS));一旦これでメインライトの向きを無視してオブジェクトの真下に影を落とせました。地面の高さが0以外だと影が動いてしまいます。ShadowReceiverということで今度は地面側を工夫して高さの影響を受けない(常にワールド座標のYが0地点の影情報を参照する)ようにしてみます。地面はShaderGraphでカスタマイズします。ShadowMapの情報を直接取得するノードがないのでカスタム関数を作成して受け取る必要があります。MainLight_half」ですね。Shadows」を無効にします。無効にすると影が表示されなくなってしまいました。false);#endif}どうやらここで戻り値が常に1(影を受けない)でshadowAttenuationにセットされてしまうようです。Shadows」を無効にした場合、未定義になるようです。該当の行を削除して強制的に計算してくれるよう変更します。まとめるとこんな感じです。カスタム関数に渡すワールド座標のYに0固定にします。Caster側でサイズ調整もやってみました。lightDirectionWS));のような感じで、0位置からの相対でサイズを計算してます。結果と、ここまでやってそれなりに軽くてそれっぽく表現はできたのですが完全にこの丸影専用の床です。他の通常の影も拾えますが、Yが0地点の影しか拾えなくなってます。場合によっては使えるかもしれませんが、やはりちゃんと自前で丸影専用のマップ作って合成した方が良さそうです。サイズ調整も地面の高さが0ベースなのでこれもなんとかしないとダメそうです。床が2重の場合両方に同じ影が反映されます。Lightのみ想定の検証でした。Lightサポートしないので実現できず。機会があれば、Pipeline側での拡張やCustomFeature等も模索してみたいと思います。DecalURPのサンプルにそのままあったので試してみました。importからダウンロード可能です。FeatureでDecalを追加します。Projector」コンポーネントを追加します。Decalに対応したShaderのMaterialをセットします。以上のようにとても簡単です。以下のパラメータで投影する範囲を決定するバウンディングボックスを調整できます。投影する範囲の長さPivotでバウンディングボックス:positionをoffsetで調整します。ShaderGraphでDecal対応のShaderを作ることで簡単に差し替えることができます。補足ですが、下に投影する場合transformでX軸のRotationを90にしないと正しく投影されませんでした。扱いが容易ただしProjectorのバウンディングボックスのサイズとシーンオブジェクトの配置をうまく調整しないとShadowMapの時と同様、床が2重の場合両方に同じ影が反映されたりします。別物なので標準のShadowMapの影と馴染まない。Distance(描画距離)が個別に判定されない不安定な印象でした。-20fps程度と思ったよりそこまで大きな差はなさそうで、Decalが汎用的に活躍できそうな印象でした。(もちろん飲めるメリット・デメリット次第ではありますが)またどちらのパターンもチューニングしていない状態なので改善の余地はありそうです。最後にShadowMapの利用に関しては結果というよりか、弄る際の参考になれば幸いです。Decalに関してはURPの新しめの機能ということもあり、今後も色々試してみたいです。表題に関しても他のアプローチがあればまた試してみたいと思います。5はてなブログをはじめよう!Synamonさんは、はてなブログを使っています。ブログを報告する引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。