私は最終的に解決策を見つけました-実際にはいくつかの異なる解決策。私はしませんでした視点をプログラミング、グラフィックスから成果物の実際の原因を把握-しかし、私はいくつかの解決策を見つけました。
私の質問で以前に述べたように、アーティファクトは、worldspawn静的ジオメトリ(基本的にエンジンが移動しないことを知っているジオメトリであるため、事前に事前計算される)の事前計算されたシャドウボリュームでのみ発生しているように見えました-「dmap」と呼ばれるコンソールに入力されたコマンドを使用して、シャドウボリュームおよびその他のものを-timeします。なぜそれが静的なワールドスポーンジオメトリのシャドウのみにあり、どのASEモデルやLWOモデルにもないのかはわかりませんでした。
さて、私が気づいたのは、dmapコマンドで使用できるパラメーターがたくさんあるということです。これらのパラメーターの1つは "shadowOpt"と呼ばれ、シャドウ最適化レベルを表す必要があります。このパラメーターは列挙型を設定します-いくつかの異なるシャドウ最適化レベルがあるようです:
typedef enum {
SO_NONE, // 0 // NOTE: I haven't tried this one yet - should test this one.
SO_MERGE_SURFACES, // 1 // NOTE: this was the original default one - it causes some artifacts - the ones I have been trying to fix.
SO_CULL_OCCLUDED, // 2 // NOTE: this one works the best - takes a bit longer - but it has alot of unnecessary print statements that could probably be removed.
SO_CLIP_OCCLUDERS, // 3 // NOTE: I haven't tried this one yet - but it is not used anywhere.
SO_CLIP_SILS, // 4 // NOTE: I haven't tried this one yet - should test this one.
SO_SIL_OPTIMIZE // 5 // NOTE: this one doesn't seem to work well at all - and it takes an extrememly long amount of time - was probably an expirimental version.
} shadowOptLevel_t;
オプション2-"SO_CULL_OCCLUDED"で成功しました。それはすべてのアーティファクトを修正します-実行に少し時間がかかります-しかし、この時間の多くは大量の情報をコンソールに印刷するのに費やされていると思います-これらの印刷はおそらく削減されるか、取り除かれます。
手がかりを与えてくれた場所の1つは、tr_stencilshadow.cppのコメントです。
// if we are running from dmap, perform the (very) expensive shadow optimizations
// to remove internal sil edges and optimize the caps
if ( callOptimizer ) {
ここで、「dmap」中にこの「余分な」シャドウ最適化のみを実行する場合の問題は、これらのライトのいずれかが移動された場合(これは、実行しているプロジェクトのタイプに応じて常に可能です)、デフォルトで「最適化されていない」リアルタイムのシャドウボリューム作成プロセス(移動されたライト用)とアーティファクトがそのライトに対して再表示されます。したがって、これらのアーティファクトが表示されないことを保証する唯一の方法は、これらの静的なワールドスポーンシャドウに対して非常にコストのかかる最適化プロセスを常に実行することです。実際には非常に高価であるため、適切なグラフィックスソリューションを理解できない場合は、これが絶対的な最後の手段になります。(行う場合は、必ずここにソリューションを投稿してください。)
バニラドゥーム3エンジン用の大きなマップを作成し、worldspawnジオメトリを使用するすべての人に、最適化されたシャドウボリュームのリアルタイム作成のニーズに応じて変更できるcvarを作成することをお勧めします。私はcvar r_useExpensiveShadowOptimizationsを呼び出しました-これはoxymoronのようです。例えば:
// if we are running from dmap, perform the (very) expensive shadow optimizations
// to remove internal sil edges and optimize the caps
if ( callOptimizer || r_useExpensiveShadowOptimizations.GetBool() ) {
また、マップの大きさ(およびライトが移動しない場合)に応じて、dmapの「shadowOpt」パラメーターで静的シャドウボリュームの最適化レベルを上げることをお勧めします。
したがって、基本的に、大きなマップが必要であり、シャドウアーティファクトがないことが必要なものがすべて揃っています。使用するマップを決定するだけです。リアルタイムで実行するのは非常にコストがかかります。適切なグラフィックスソリューションが見つからない場合の最後の手段としてのみ実行してください。DMAPでこれを実行すると問題が解決し、マップのコンパイルに数秒しかかかりません。