0

私はシャドウイングのために次のテクニックを実行しようとしています。NVIDIAサイトでそれを読みましたが、それは良いテクニックのように思えました。CPUでシャドウボリュームを計算するよりも、「本当」のように見え、これをソフトシャドウに使用できるので、私はそれを好みます。:

1回目のパス:

  • LIGHT0の観点からデプスバッファを埋めます。このデプスバッファを2回目のパス用にコピーします。(*)

2回目のパス:

  • EYEから、およびフラグメントごとにビューをレンダリングします。
    • (*)に格納されているデプスバッファのXY位置を取得します。対応する32ビット値を取得します。
    • ライトまでの距離を計算します。
    • この距離を、保存されている深度バッファ値と一致させます。
    • 大きい場合、フラグメントはglDisable(LIGHT0)モードで描画されます。それ以外の場合、フラグメントはライトを有効にして描画されます。この目的のために、2つのフラグメントシェーダーを使用し、距離の比較に応じて2つのフラグメントをブレンド/切り替えます。

ここで、いくつかの理由で、フラグメントシェーダーの最後の手順を実行したいと思います。ひとつは、シャドウイングの「効果」を考慮したいということです。私のゲームでは、障害物までの距離が小さければ、シャドウは非常に「厳密」になると言っても過言ではありません。 。遠くにあると、グローバルイルミネーションがより強くなり、影がわずかになります。これは、カードゲームであるため、より複雑な「凹型」の形状には当てはまりません。

しかし、私はopenGLを初めて使用し、次のいずれかの方法を理解していません。

  • 2Dテクスチャにコピーせずに、フラグメントシェーダーの1番目のパスの深度バッファーにアクセスする方法。それは不可能だと思いますか?
  • 32ビットのデプスバッファを各R、G、B、Aコンポーネントに8ビットがあるテクスチャにコピーしてから、フラグメントシェーダーでその値を再アセンブルすることが、私ができる最も効率的な方法ですか?
  • クロスプラットフォームの拡張機能がある場合は、これに使用できます。

誰かが私を助けてくれるか、私にいくつかのアイデアを与えることができれば、私は今ちょっと困惑しています。良いハードウェアと自由な時間がないので、すべてをデバッグ/試してみるのに疲れるプロセスになります。

4

2 に答える 2

2

1つ目の方法は、GL_DEPTH_ATTACHMENTアタッチメントにGL_DEPTH_COMPONENTテクスチャがアタッチされたFBOを使用することです。

2番目の方法は、GL_DEPTH_COMPONENTテクスチャでglCopyTexImage2Dを再度使用することです。

FBOはクロスプラットフォームであり、ほとんどすべての最新のOpenGL実装で利用できます。FBOを利用できるようにする必要があります。

于 2010-10-14T15:25:51.023 に答える
0

その通りです。2回目のパスでこれらの値を使用するには、深度バッファの値から2Dテクスチャを作成する必要があります。

テクスチャ自体に関しては、32ビットのデプスバッファから8ビットのRGBAにコピーすると、キャストを使用してデータを変換しないと思います。デプスバッファのミッドレンジ値(たとえば0x80000000)の場合、R、G、 rgbaテクスチャのBとA:

RGBA[0] = 0x80;
RGBA[1] = 0x80;
RGBA[2] = 0x80;
RGBA[3] = 0x80;

期待していた場所:(キャスト)

RGBA[0] = 0x80;
RGBA[1] = 0;
RGBA[2] = 0;
RGBA[3] = 0;

したがって、正しい形式についてはわかりませんが、変換のオーバーヘッドが発生したくないため、コピー中に変更しないことをお勧めします。

于 2010-10-14T13:10:03.240 に答える