あなたは経験を求めてきたので、ここに私のものがあります。
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の時代にそれが漠然と可能であったとしても、それを完全にやり直していたでしょう。