シャドウマップアーティファクト


16

3D XNAゲームに影を追加してみたい。1つのライトと1つのカメラでテスト環境をセットアップしました。しかし、私は自分のアプローチでアーティファクトに直面しています。

私はhttp://pastebin.com/zXi0hmsUのシェーダーコードを使用して最終結果をレンダリングし、http://pastebin.com/rY4Gcj9Nを使用してシャドウマップを作成しています。コードは非常に単純で、ライトの観点から深度マップを生成し、それをカメラ空間に投影し、オクルージョンをチェックする必要があります。

しかし、ほとんどの角度から私はかなりresultsい結果を得ていますこのスクリーンショットのように

シーンは、いくつかの単純なキューブ(手で構成され、外側を向き、背面がカリングされます)、1つのライト(左上隅に表示されるシャドウマップ-大丈夫に見えます)、1つのカメラで構成されます。

シャドウマップのRenderTargetは、以下によって初期化されます

int shadowMapSize = 512;
RenderTarget2D shadowMap = new RenderTarget2D(GraphicsDevice, shadowMapSize,
    shadowMapSize, true, GraphicsDevice.PresentationParameters.BackBufferFormat,
    DepthFormat.Depth24Stencil8);
GraphicsDevice.SetRenderTarget(shadowMap);
GraphicsDevice.Clear(Color.White);
GraphicsDevice.DepthStencilState = DepthStencilState.Default;

その後、CreateShadowMapエフェクトが適用され、続いてLambertWithShadowsエフェクトが適用されます。最後に、を使用してシャドウマップが描画されSpriteBatchます。

残りのコードは、シェーダーに正しい値を提供するだけで構成されています。必要に応じて、私はそれをうまく提供できます。

回答:


19

これは、シャドウマップにきびと呼ばれる典型的な問題です。これは、シャドウマップの投影ピクセル(深さ)が画面上のピクセルよりも大きいためです(eq。は深度を正しく表現できません)。

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

これには多くの解決策があります。最初に最も簡単なのはバイアスです(コード内で見るので、問題ではありません)。2番目の簡単な解決策は、より高い解像度のシャドウマップです。現在のハードウェアで2048x2048の解像度のシャドウマップを使用するのは、実際より一般的です。(編集:それは真実ではない、私は映画のレンダリングに取り組んでいたときに書いた。ゲーム開発では、シャドウマップをできるだけ小さくしたい)

より高度な技術を研究するためのリソース。


編集:


このトピックに関する作業中の資料がいくつかあります。興味がある場合は共有します。
ノタベン

大きな解像度の主な問題は、最終ゲームでは約3〜4個のライトが無向であるということです。そこで、キュービックシャドウマップを使用する必要があり、24個のシャドウマップが作成されます。追加の資料がある場合は、私と共有する努力を本当に感謝します:
エタン

少なくともそれが重要な場合、私は興味があります:)
ジェームズ

1
@Etan。ええ、オムニ指向性ライトは、影について話すと本当に痛いです。(私はそれについて何か知っています: ) gamedev.stackexchange.com/questions/6203/…)。デュアル放物面マップを使用してみてください。または、キューブマップが好きな場合は、すべての面/レンダリングに対してfrustum-camera_frustum交差カリングを使用してスペースを節約してください。常にすべての方向に影を必要としないことをお勧めします(特に屋外)
-Notabene

1
@Etan @Jamesもう少し追加しました。このトピックに興味がある場合は、両方を読む価値があります。
ノタベン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.