レイヤー間にキャストされた2Dシャドウを実装するにはどうすればよいですか?


10

別のレイヤーのオブジェクトによってキャストされる2Dシャドウを実装するにはどうすればよいですか?

Catalin Zimaの有名なチュートリアルの動的照明とは異なります。

ここに画像の説明を入力してください

しかし、このビデオのパイプの影のように:

ここに画像の説明を入力してください

そして、このビデオのプラットフォームの影とキャラクターのように:

ここに画像の説明を入力してください

多くのレイヤーとさまざまな色の多くのライトがあるシーンで同じ種類のライティングを使用したいと思います。

レイヤーの背後にあるレイヤーの上にレイヤーの黒いコピーを描画し、影がキャストされているレイヤーの穴に応じて調整することで、これを想像できます。しかし、私はこれのためのより安価な、ピクセルシェーダーベースのアプローチがあることを願っています。

回答:


1

これはマスキングで行うことができます。それを行うには複数の方法があります。

1つの方法は、前景要素のシャドウバージョンをレンダリングする方法を持つことです。背景を描きます。次に、前景の要素を描画します。黒の色のみを出力するように、照明の移動方法に応じて少しオフセットします。次に、通常の方法でフォアグラウンドを描画します。

別の方法は、フォアグラウンドをバッファーにレンダリングすることです。実際に表示されるよりも少し多いです。次に、「黒に」パスを実行し、おそらくぼかしパスを実行します。次に、このパスのセットの出力をレンダリングしてから、フォアグラウンドバッファーの可視セクションをレンダリングします。

さまざまな角度で複数のライトをサポートするには、前のステップを複数回実行するか、それらすべてを単一のバッファーに蓄積します。数学はあなたが達成しようとしていることに基づいて異なりますが、その最初のビデオで何が起こっているかについての最初の推測は、カメラの位置(可視領域の中心)に対して光の位置をとるだけであり、次に、そのベクトル(スケーリングされた)を使用して、影のオフセット方法を決定します。何かのようなもの:

draw background
for each light intersecting viewing bounds:
  offset = light.position - camera.position
  offset *= SCALE FACTOR (0.25 maybe)
  draw shadow foreground at offset
draw foreground

シーンに「より近い」ライトは、より小さいスケール係数を持ちます。複数の深度が必要な場合は、簡単な幾何学的なもので計算できます。


ええ、これはまさに私が思いついたものです。正しい用語がマスキングされていることを知りませんでした。しかし、私は多分、シャドウボリュームは3D空間でどのように機能するかをより同様のアルゴリズム...があることを望んだ
ベリー

穴のあるサーフェスに影を落とす場合は、その背後にあるレイヤーの上に常駐影を落とす必要があります。また、透明度の操作は少し注意が必要になります。私はこれらの問題のすべての解決策をすでに考えました!しかし、特に大量のレイヤー(20)と大量のライト(50)を扱う場合、リアルタイムで適用するにはコストがかかりすぎると思いました。だから私は別のアプローチを望んだ。
Berry、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.