問題タブ [shadow-mapping]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
opengl - PCF とグレージング ライト、別名射影エイリアシング
現在、シャドウ マッピングの代替バイアス ソリューションをいくつか実装および修正しています。そしてもちろん、それらをさまざまなソフト シャドウのテクニックと組み合わせています。
そして、PCFにいくつかの問題があります。光の方向とフラグメントの法線の内積が 0 より大きいかどうかをテストすることで、サーフェスの背面をシャドウイングしています。ハード シャドウの場合は問題なく動作します。
したがって、基本的に、フラグメント シェーダーのこのコード行は、任意のオブジェクトの背面をシェーディングします。
前述のように、ハード シャドウで問題なく動作します。PCF に関して言えば、私の最初の意図は、これを上記のように使用して、フィルター カーネルの現在のテクセルが影にあるかどうかを確認することでした。これは、PCF フィルター カーネルの現在のテクセルをシャドウ テストするための次のステートメントです。
ただし、オブジェクトの前面からオブジェクトの背面までの「影のエッジ」は、依然としてハードな「影のエッジ」です。PCF フィルター カーネルの任意のテクセルでは、常に現在のフラグメントの法線がテストされるため、これは当然のことです。したがって、フラグメントがオブジェクトの裏側にある場合、このフラグメントは完全に影になります。しかし、「ドット積テスト」を削除すると、オブジェクトの前面から背面へのフェードで、かすかな光のためにアーティファクトが表示されるという問題があります。
「内積テスト」の場合: ご覧のとおり、実際にキャストされた影はきれいに見えますが、オブジェクトの背面にある影はハード シャドウです。
「ドット プロダクト テスト」なし: 「裏側の影」のエッジは明るい前面に向かって柔らかくなり始めますが、それでもハード エッジで終わります。また、その領域のアンダーサンプリングに起因すると思われるいくつかのアーティファクトも確認できます。
「裏側の影」の端に良い(または少なくとも良い)柔らかい影を付けるにはどうすればよいですか? 「照会された仮想シャドウ マップ」のような非常に複雑なアルゴリズムを導入しなければ、もちろんその場合には完璧なソリューションになりますが、これはインタラクティブなアプリケーションのためのものであるため、このような手順を使用することはできません。
それとも、対話型アプリケーションでこのようなエイリアシングを行う可能性がないのでしょうか。
そして、「裏側の影」のハードエッジが許容できると思うかどうか興味がありますか?
opengl - OpenGL での正規化された深度バッファ書き込み
ディレクショナル ライトのシャドウ マッピングを行っていますが、標準の深度バイアス マトリックスでは、異なるハードウェアで同じ結果が得られません。
いくつかのデバッグの後、いくつかの gpu-s が深度バッファの正規化された値 [0, 1] といくつかの正射投影値 [-1, 1] に書き込むことを確信しています。
すべての gpu に同じ間隔で値を書き込むように強制するにはどうすればよいですか? OpenGL コマンドはありますか?
c++ - シャドウ マッピングを使用して OpenGL シーンを黒でレンダリング
このチュートリアルを使用して、OpenGL エンジンにシャドウ マッピングを実装しようとしています: http://www.fabiensanglard.net/shadowmapping/index.php
シャドウ マップの作成中に問題はありません (と思います)。しかし、それを使用すると、シーンは完全に影になります。
シーンをレンダリングする方法は次のとおりです。
深度 FBO を設定する
ライトの視点から ModelViewProjection マトリックスを作成し、shadowMatrix 変数に格納します。
私が使用する機能:
深度フレームバッファでシーンをレンダリングします。シェーダー:
頂点シェーダー:
フラグメント シェーダー:
私の 3 つのボックスのシーンでは、線形化された深度は次のようになります。
http://www.2shared.com/photo/IExy9aUo/Depth.html
だから、shadowMatrix と深度レンダリングは正しいと思います。
最後のパスは、シャドウ マップを使用してシーンを描画するだけです
頂点シェーダー:
フラグメント シェーダー:
結果 ?私のシーンはすべて影になっています!
opengl - キューブマップ (OpenGL/GLSL) を使用したポイント ライトでソフト シャドウは可能ですか?
スポット ライトのシャドウ マッピングを管理する 3D アプリケーションをコーディングしました。これを行うには、従来のシャドウ マッピング手法を使用します (最初のレンダー パスで深度テクスチャを塗りつぶし、2 番目のレンダー パスで、ライトから最初のオクルーダーまでの距離とライトから頂点位置までの距離を比較して、フラグメントが影にあるかどうか)。
スクリーンショットを次に示します (スポット ライト/2D 深度テクスチャ シャドウ マッピング)。
この例では、関数「textureProjOffset」を使用して PCF シャドウ マッピング手法を使用します。私のフラグメントシェーダーのコードは次のとおりです。
使用したサンプラー:
ハード シャドウの場合:
PCF ソフト シャドウの場合:
また、ポイント ライトに現在適用されている全方向シャドウ マッピングを管理するために、基本的なキューブマップ シャドウ マッピングも管理しました。最初のレンダー パスでこれを行うには、ジオメトリ シェーダーを使用して、6 つのシャドウ錐台によって提供される投影マトリックスとビュー マトリックスの両方をディスパッチします (すべて 1 つのパスで! 今回は 6 つのレンダリング ステートで 6 つの別個のテクスチャを埋めるためのテクニックとは異なります) )。
スクリーンショットは次のとおりです (スポット ライト/キューブ深度テクスチャ シャドウ マッピング)。
ご覧のとおり、ハード シャドウ マッピングのみです。キューブマップにエンコードされた深度値を復元するには、今回は関数 'texture' を使用する必要があります ('samplerCube' と 'samplerCubeShadow' には textureProj は存在しません)。次に、ワールド空間でのライト位置と頂点位置の間の距離を計算し、それをクリップ空間に変換する必要があります。これは、テクスチャに含まれる深度値が既にクリップ空間にあるためです。
プロセスを確認するためのフラグメント シェーダーのコードを次に示します。
使用したサンプラー:
ハード シャドウの場合:
そして、 cubemap を使用した PCF SOFT シャドウはどうですか? 私はいくつかの調査を行いましたが、単純な 2D テクスチャを使用し、フラグメント シェーダーでキーワード「sampler2DShadow」を使用して可能なように、テクスチャ オフセットを回復する関数は明らかに存在しません。私が間違っている ?(そうだといい!)。
私は解決策を持っていると思います(もちろん、キューブマップを使用した解決策が存在しない場合):
どうやら、テクスチャ オフセットを回復するには、6 つの個別のテクスチャを使用する必要があります (したがって、「samplerCubeShadow」ではなく、サイズが 6 の「sampler2DShadow」の配列)。したがって、最初のケースでスポット ライト シャドウ マッピングで行ったように、ライト空間での世界の表現を表す matrix4x4 の配列を均等に均一にします。そして、6 つのテクスチャに対してメソッド「textureProjOffset」を使用します。
それで、あなたはどう思いますか?キューブマップを使用して PCF ソフト シャドウを作成することは可能ですか? そうでない場合、私の解決策は正しいですか? 「samplerCube」または「samplerCubeShadow」を使用して「textureProjOffset」のような関数を使用することは可能ですか? または、代替手段はありますか?
ご協力いただきありがとうございます。
opengl - Small artifacts with simple hard shadow mapping technique using OpenGL and GLSL
I have a strange behaviour with my hard shadows I have never seen before because of the somber color of the textures I used (these artifacts was not visible). Here's some screenshots of my problem with 3 different shadowmap resolutions:
1) Shadowmap 160 * 120
As you can see, there are kind of teeth on the surface of the cube.
Here's the view of the scene from light position:
Here's the shadowmap:
2) Shadowmap 640 * 480
With a higher resolution the artifacts are less visible because the shadow map brings more precision.
Here's the view of the scene from light position:
Here's the shadowmap:
I tried with higher other resolution. Of course the artifacts are smaller and smaller but if you zoom on the surface they are still visible.
Here's the code I use in my fragment shader during the second pass:
So I wonder if it's possible to remove these artifacts on the edges of the cube. I tried to play with the shadow bias without real success (for information I use FRONT_FACE culling during the first pass (filling of the depth texture)).
opengl - OpenGL と GLSL を使用した基本的なシャドウ マッピング アーティファクト
基本的なシャドウ マッピング手法に関する簡単な OpenGL テスト アプリケーションを作成しました。
オクルーダーの背面にあるものを除いて、ほとんどのアーティファクトを削除しました。最初のレンダリング パス (シャドウ深度マップの塗りつぶし) で前面のカリングを有効にしているため、この背面にはアーティファクトが関係しています。その結果、セルフ シャドウイングの Z ファイティング アーティファクトがあります。
この種の問題を解決するには、いくつかのチュートリアルで、ライト空間の頂点位置の深さを 0.0005f のような非常に小さなオフセットでバイアスする必要があると述べています。
これが私の問題のスクリーンショットです(見やすくするために、ボックスの周囲光の値を増やしました)。ここでは深度オフセットなし:
ご覧のとおり、強い自己シャドーイングがあります。
フラグメント シェーダーで使用するコードの一部を次に示します。
0.0002f に等しいオフセットを使用するとどうなるか見てみましょう。
スクリーンショット:
ご覧のとおり、セルフ シャドウイングが減少しています。0.0003f に等しいオフセットで試してみましょう:
スクリーンショット:
ご覧のとおり、自己の影が消えました! しかし、オクルーダーと影の間の境界に向かってズームすると、影のない領域が見えます。このアーティファクトは、ピーター パニング アーティファクトと呼ばれます。
したがって、これは奇妙な状況です。セルフ シャドウ アーティファクトを回避するには、ライト スペースで頂点の深度値を変更する必要があります。しかし、深度値トレインのこの変更により、ピーター パニング アーティファクトが発生します。
オフセット値を大きくすると、問題はさらに悪化します。
アップデート
オフセットも入れてみました。例えば:
スクリーンショット:
セルフ シャドウイングは少なくなりますが、ピーター パニング アーティファクトはありません。残念ながら、立方体の前面にいくつかのアーティファクトが表示されます。前面に影があふれています。
オフセットを増やすと:
スクリーンショット:
セルフ シャドウ アーティファクトは完全に消えましたが、前面のシャドウ オーバーフローはさらに悪化しています。
では、セルフ シャドウ アーティファクトとピーター パニング アーティファクトの両方なしでレンダリングすることは可能でしょうか?
c++ - 複数のライト シャドウ マッピング
問題は、シェーダーにいくつかのライトを渡すことですが、最初のライトだけに影が表示されることです。影が見えないライトにも照明が適用されます。シャドウ マップを確認したところ、正しく渡されました。フラグメント シェーダ:
opengl - Deferred Renderer によるシャドウ マッピング (OpenGL 4.1、GLSL)
私は、stackoverflow といくつかの本でいくつかの記事を読みました。しかし、コードにエラーが見つかりません。遅延レンダラーがあり、g バッファー内にアルベド、深度、および法線 (スペックを含む) を保存しました。さらに、シーンの上から光源からシャドウ マップを作成しました。
次のようになります。
アルベド (R8G8B8A8):
通常 (R8G8B8A8):
直線深度 (F32):
光源からのシャドウ マップ (線形深度) (カメラから 500 メートル上):
Ok。シャドウ マッピングを使用した遅延のシェーダー コードは次のようになります。
頂点シェーダー:
フラグメント シェーダー:
最後に、私の結果は次のようになります。
誰かが私の間違いを見ることができましたか?
いくつかの測定結果:
ShadowCoord.xy は常に 0.5、0.5 です。
ShadowCoord.z の継ぎ目が 1.0f になる
いくつかの変数値を次に示します。