シャドウマッピングと透明なクワッド


10

シャドウマッピングでは、深度バッファーを使用して、シャドウを描画する場所を計算します。

私の問題は、いくつかの半透明のテクスチャクワッドに影を落としてほしいということです。深度値は、表示されている部分だけでなく、すべてのクワッドに設定されるため、クワッドシャドウが投影されますが、これは私が望んでいることではありません。

シャドウマッピングを使用して、透明なクワッドに正しいシャドウをキャストさせるにはどうすればよいですか?

回答:


15

あなたの問題は、1ビットアルファでのレンダリングを解決します。つまり、レンダリングされないソーステクスチャのアルファを指定します(ほとんどは0.5)。

ライトからの深度を節約して命令を使用するには、独自のシェーダーを作成する必要がありますdiscard。破棄は、hlsl、glsl、およびcgにも存在します。ピクセル/フラグメントシェーダーにのみ存在し、現在のフラグメントをレンダリングからbackBufferとz-bufferに破棄します。

if (texSample.a < 0.5)
   discard;

利点は、2番目のパスのレンダリングを変更する必要がなく、光の深度のレンダリングのみを変更することです。また、私はそれが機能することを証明しました: 1ビットアルファ

複数の透明なオブジェクトに正しい影をレンダリングしたい場合は、深度ピーリングを使用してレンダリングされた深度と不透明度の情報を使用して、複数の深度テクスチャを使用する必要があります。煙や髪の毛など。深い不透明度またはフーリエの不透明度マップが最善の解決策です(主にフーリエの不透明度マップをお勧めします)。

編集:私はクレジットを追加するのを忘れたことに気づきました。いつものように。ツリーモデルはloopixプロジェクトからのものです。これは、低ポリ、1つのテクスチャ、および植生の無料モデルを探している場合に最適です。


6

プログラム可能なパイプラインでは、@ notabeneがどのように指示したかを実行する必要があります。ただし、シェーダーを記述しなくても、固定パイプラインを使用するのは簡単です。OpenGLではglAlphaFuncが必要です。例えば:

glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER, 0.5f);

1
きちんと。固定パイプラインが嫌いです。だから私はシェーダーなしでこれを行うことができるすべての人に本当に感心します。確かに+1。
Notabene

@Notabene廃止予定のテクノロジーを使用することについて、称賛に値することは何もありません。
タラ

2

シャドウマップの生成にはカスタムシェーダーが必要なので、ピクセル/フラグメントの透明度が指定したしきい値よりも大きい場合に有効なオクルーダーを出力できます。これで、深度マップはポリゴンごとではなく、ピクセルごとに生成されます。


-1

私がこれを行うと考えることができる唯一の方法は、別のデプスマップテクスチャを作成し、ツリーをその中にレンダリングし、アルファ!= 0であるデプスを出力し、それ以外の場合はデプス= 1を出力してから、このシャドウマップテクスチャをシーンシャドウマップテクスチャと組み合わせる、それは十分に単純でなければなりません。2つの値の最小値を取り、それを最終的な深度マップに設定するだけです。

ただし、これはブレンド順序を解決しません。アルファテクスチャの背後に深度を出力する場合、その上にテクスチャを含むクワッドをレンダリングするとオーバーライドされます。この効果を機能させるには、各クワッドを個別に深度マップテクスチャにレンダリングする必要があります...

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.