15

私はしばらくの間、この ES 拡張機能を使用してきましたが、これらのシャドウ サンプラーが何であるか、およびそれらを何に使用できるかについてはまだよくわかりません。グーグルで調べても、読みやすい結果が得られなかったので、ここに投稿します。

これらができることを本当に理解するのに役立つ何かを探しています。これは、実際の使用例でも、これらが通常のサンプラーとどのように異なるかを示すものでもかまいません。つまり、深度データを保存します。しかし、そのデータはどのように生成されるのでしょうか? 深度アタッチメントにバインドされたテクスチャから作られているだけですか?

また、私の質問は DT (デスクトップ) GL と ES の両方に当てはまり、おそらく WebGL にも当てはまります。正確な呼び出しや列挙についてはあまり気にしません。仕様で簡単に見つけることができるからです。

4

1 に答える 1

18

シャドウ サンプラー」は、深度比較テクスチャに使用されるサンプラーです。通常、深度テクスチャにアクセスすると、そのテクスチャ座標で (フィルタリングされた) 深度値が取得されます。ただし、深度比較モードでは、実行しているのは別の操作です。

テクスチャから取得したサンプルごとに、深度を特定の値と比較します。比較に合格すると、フェッチされるサンプルは事実上 1.0 になります。比較に失敗した場合は 0.0 です。フィルタリングは、この比較のサンプルで機能します。したがって、線形フィルタリングを行っていて、サンプルの半分が比較に合格し、半分が不合格である場合、得られる値は 0.5 です。

これを行うには、使用しているサンプラ オブジェクト/テクスチャ オブジェクトで深度比較をアクティブにする必要がありますが、シェーダでシャドウ サンプラも使用する必要があります。これは、テクスチャ アクセス関数が追加の値、つまりテクスチャ アクセスと比較する値を取得する必要があるためです。

これは主にシャドウ マップに使用されるため、この名前が付けられました。シャドウ マップは、ライトから最も近いサーフェスまでの深度を格納します。したがって、ライトからレンダリングされるサーフェスまでの深度と比較します。レンダリングされるサーフェスがシャドウ マップ内のものよりもライトに近い場合、シャドウ サンプラーから 1.0 を取得します。サーフェスがライトから遠い場合は 0.0 になります。いずれの場合も、値にライトの色を掛けてから、そのライトのすべてのライティング計算を通常どおりに実行します。

サンプリング前に比較する理由は、「Percentage Closer Filtering」と呼ばれるものです。深度値の間でフィルタリングしても、妥当な結果は得られません。それはあなたが望むものではありません。最初に比較を行い、次に比較されたブール結果をフィルタリングします。次に得られるのは、比較に合格した深度テクスチャからのサンプル数の測定値です。これにより、影のエッジに沿ってより良い結果が得られます。

于 2013-03-06T17:44:07.043 に答える