レイヤードアルファクワッドを使用したグラウンドフォグの適合性


16

レイヤードアプローチでは、地面に平行に配置された一連の大規模なアルファテクスチャクワッドを使用して、介在するすべての地形ジオメトリを交差させ、霧の中にいるときに地面の霧を非常に効果的に上から見下ろし、やや効果を下げます地平線に向かっています(下の画像を参照)。

代わりに、主にシェーダーベースのアプローチは、代わりに、グラウンドフォグ基質へのビュー距離の関数として密度を計算し、それに基づいてフラグメント値を出力します。

各アプローチを自分パフォーマンステストする必要はありませんが、最初に、レイヤードアルファテクスチャアプローチがどのようなパフォーマンスに影響するかについて、他の人の経験(推測ではありません!)を聞きたいです。私は特に、頻繁に引用されるオーバードローの影響のためにお願いします(平均的なデスクトップシステムがどの程度充填率を制限しているかはわかりません)。このアプローチを使用するゲーム、特に古いゲームのリストは非常に便利です。これがDX9 / OpenGL2以前のハードウェアで実行可能であれば、私にとってはうまくいく可能性があります。

1つの大きな問題は、この種の効果に関するものです。

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

(画像クレジットはlume.comのLumeに送られます)

垂直霧のグラデーションが連続的/滑らかであることに注意してください。OTOHは、テクスチャ付きのクワッドレイヤーを使用して、レイヤーをウォークスルーするときにレイヤーが非常に明白になるとのみ想定できます。これは、フォグプレーンがフレームごとにプレーヤーに対面するように配置されている場所とは対照的です。


1
これにアルファクワッドレイヤーを使用したいのはなぜですか?「シェーダー重視のアプローチ」はより正確であるだけでなく、低速であることも正確には知られていません。
ニコルボーラス

1
@StephanvandenHeuvel確かに、それはビュースペースに合わせた、距離ベースのフォグです。地面に揃った霧ではありません。正しい?
エンジニア

1
@NickWiggillええ、あなたは正しいです。
ステファン・ヴァン・デン・ヒューベル

1
IIRCでは、Wiiの(半)固定パイプラインに地面に沿った霧がありました。どうやら、glFogCoord従来のOpenGL の拡張機能でも同じことができました。限定的に聞こえますが、地上ベースまたは距離ベースです。
ローランクーヴィドゥ

1
Quake 3は、GL1.1で動作する固定パイプラインアプローチを使用して、これに似た処理を行いました。私が抱える大きな懸念は、fillrate / overdrawがひどく山積みになる可能性があることですが、おそらくQ3ソースコードをダウンロードして実装を確認する価値があります。あなたはまったく同じことをしないかもしれませんが、少なくともそれはあなたが決定を下すのに役立つかもしれません。
マキシマスミニマス

回答:


15

あなたは経験を求めてきたので、ここに私のものがあります。

PS2ゲームをプログラミングしていた頃、「レイヤードアルファクワッド」アプローチは、フォグを実装する方法でした。時々グラウンドフォグとして使用されますが、より一般的にはフルスクリーンフォグとして使用されます。そして、どちらの場合でもうまくいきました。はい、そうです、フラグメントシェーダー前の時代には実行可能でした。

まあ、ちょっと。あなたが指摘したように、問題は、スクリーンショットに見られるような滑らかな霧が必要な場合、かなり不条理な数のアルファクワッドが必要なことでした。

PS2では、通常、3層から5層の間に余裕があります。それは間違いなくあなたの前に浮かぶ霧の「壁」のように見えました。それ以上になり、フィルレートがフレームレートを低下させ始めました。

通常、これらのクワッドはカメラの前に固定距離で描画されるため、それらの1つを「ウォークスルー」するような状況に陥ることはありません。一方、これらの固定距離を使用することにより、世界の他のすべてプレイヤーが動き回るときにそれらのプレーンを通過します。これは、かなり明らかなグラフィカルな不具合です。ほとんどすべての人が当時それをやったが、今では受け入れられないだろう(あなたが文体的な理由でやっていなければ)。(例外:一部の人々は、PS2の頂点シェーダーに相当するものの一部としてフォグ値を計算しました。これは機能し、はるかに高速でしたが、モデルを高度にテッセレーションする必要がありました。たとえば、フォグは長いため、壁の隅で計算され、壁の全面に塗りつけられます。たとえば、その真ん中の隣に立つと、壁は完全に曇っているように見えます。エンドポイント)

(可能性として言及するように)フォグクワッドを静的にワールドに配置すると、提供する画像のように、非常に滑らかなフォグの外観を得ることができません。視聴者の向きに応じて隣接するクワッド。これらのオーバーラップは、ストライプまたは台形(クワッドがテクスチャ化されていない場合)または塊(テクスチャ化されている場合)として表示される場合があります。

しかし、私たちがこの地上の霧を行うためにスクリーンに面した広いクワッドを使用し、カメラを真正面から見て、この方法を使用して本当に滑らかな霧を作る方法についていくつかの計算を行うと仮定しましょう-それが理想的な状況です。HD解像度:1920x1080を想定します。これにより、水平線がスキャンライン540になります。また、水平線までずっと可視性があると仮定します(つまり、水平線に達する前に霧が完全に不透明になると仮定します)。(スムーズなフォグを得るために)各スキャンラインで1つのフォグクワッドが開始し、1つが停止すると、(540 * 2 ==)1080フォグクワッドが必要になります。これらの1080個のフォグクワッドはそれぞれ、画面の水平方向の広がり全体をカバーし、

低く見積もってみましょう。平均すると、フォグプレーンは約300行のピクセルをカバーします。最も近いものはより少なくカバーし、最も遠いものはより少なくカバーし、中央の列はより多くカバーします。

この見積もりでは、平均フォグクワッドが接触する(1920x300 ==)576,000ピクセルになります。合計すると、「576,000 * 1080 ==)622,080,000ピクセルが「たくさんの半透明のジオメトリをレンダリングすることによる滑らかな霧」エフェクト全体で合計されます。そして、その数は、より高い解像度で実行している人々のために上がります。さらに、これらすべての透明レイヤーが何度も繰り返し描画されるため、zバッファーに対して同じ数のテストと、ほぼ同じ数のピクセルブレンド操作が行われます。それはたくさんのピクセルです。

そして、それが最良のケースのシナリオです。ユーザーが見下ろしたり、しゃがんだりすると、フォグクワッドの画面がはるかに広くなります。

1080個のクワッドをオーバーラップしているので、それぞれに約(1.0 / 1080〜=)0.0009のアルファ値を設定して、1080個のクワッドをすべて見ると霧が完全に不透明になるようにする必要があることに注意してください。(それよりも高くすることもできますが、これは可能な限り範囲を広げたいと仮定した値です)。この値は、32ビットカラー値のアルファ成分として表すことができないことに注意してください(256 * 0.0009〜= 0.237なので、試してみると0に切り捨てられます)。これがまったく機能しないためには、浮動小数点値として0.0009値をOpenGLに提供する必要があります。(実際には、それぞれに同じ値を設定する必要はないことに注意してください-滑らかな霧を得るために、水平線の下の各スキャンラインで1つのクワッドを開始し、1つのクワッドを終了することを定義しましたが、

また、モダンシェーダーの場合のように、このアプローチを使用するとフォグブレンドはまったく正しく機能しないことに注意してください。「この割合を使用してベースオブジェクトの色とフォグの色をブレンドする」という1つの計算を取得する代わりに、1080 「これまでの色と霧の色を霧の割合でブレンドする」の計算。これは、霧が対数フォールオフ後のオブジェクトに影響することを意味します。(つまり、20個のフォグクワッドの影響を受けるオブジェクトは、10個のフォグクワッドの影響を受けるフォグの2倍未満に見えます。これは、最初のフォグクワッドがブレンド操作により大きな影響を与えるためです)。

すべては言うことです: フラグメントシェーダーを使用してください。

いいえ、本当に。実装がより簡単で、安く、より速く、より速く、エラーが起こりにくく、実際にゲームを作成することに戻ることができ、あらゆる点で優れています。PS2の時代にそれが漠然と可能であったとしても、それを完全にやり直していたでしょう。


1
現実世界の経験に基づいた包括的な回答のために+1。
concept3d

3
この質問を書いた1年1か月前、私はまだ満腹率でチキンをプレーしたいと思っていました。ここで、3Dパーリンノイズによって決定される絶えず変化する密度で地面の霧のボリュームを表す粗い3Dテクスチャを選択し、これを画面スペース効果の基礎として使用します。
エンジニア
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.