私はシャドウイングのために次のテクニックを実行しようとしています。NVIDIAサイトでそれを読みましたが、それは良いテクニックのように思えました。CPUでシャドウボリュームを計算するよりも、「本当」のように見え、これをソフトシャドウに使用できるので、私はそれを好みます。:
1回目のパス:
- LIGHT0の観点からデプスバッファを埋めます。このデプスバッファを2回目のパス用にコピーします。(*)
2回目のパス:
- EYEから、およびフラグメントごとにビューをレンダリングします。
- (*)に格納されているデプスバッファのXY位置を取得します。対応する32ビット値を取得します。
- ライトまでの距離を計算します。
- この距離を、保存されている深度バッファ値と一致させます。
- 大きい場合、フラグメントはglDisable(LIGHT0)モードで描画されます。それ以外の場合、フラグメントはライトを有効にして描画されます。この目的のために、2つのフラグメントシェーダーを使用し、距離の比較に応じて2つのフラグメントをブレンド/切り替えます。
ここで、いくつかの理由で、フラグメントシェーダーの最後の手順を実行したいと思います。ひとつは、シャドウイングの「効果」を考慮したいということです。私のゲームでは、障害物までの距離が小さければ、シャドウは非常に「厳密」になると言っても過言ではありません。 。遠くにあると、グローバルイルミネーションがより強くなり、影がわずかになります。これは、カードゲームであるため、より複雑な「凹型」の形状には当てはまりません。
しかし、私はopenGLを初めて使用し、次のいずれかの方法を理解していません。
- 2Dテクスチャにコピーせずに、フラグメントシェーダーの1番目のパスの深度バッファーにアクセスする方法。それは不可能だと思いますか?
- 32ビットのデプスバッファを各R、G、B、Aコンポーネントに8ビットがあるテクスチャにコピーしてから、フラグメントシェーダーでその値を再アセンブルすることが、私ができる最も効率的な方法ですか?
- クロスプラットフォームの拡張機能がある場合は、これに使用できます。
誰かが私を助けてくれるか、私にいくつかのアイデアを与えることができれば、私は今ちょっと困惑しています。良いハードウェアと自由な時間がないので、すべてをデバッグ/試してみるのに疲れるプロセスになります。