問題タブ [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 - sampler2DShadow バイアス コンポーネントが GLSL で動作しませんか?
OpenGL コア 3.3 でシャドウ マップを実装しようとしています。GLSL のテクスチャ関数にバイアスを送信すると、まったく何もしないようです。私はそれを間違って使用していますか?
Linux、nvidia 独自のドライバー、および golang を使用しています。それと関係があるとは思えませんが、念のために言っておきます。
opengl - キューブマップの PCF (PCSS)
エンジンに PCSS を実装するために、この論文に従っています。
少し問題があります。私のエンジンは今のところ無指向性ライトしか許可していません – 後で追加しますが、それは問題ではありません. ということで、まずはハードシャドウマッピングを実装。勝利でした。
PCSS を使用してハード シャドウをソフト シャドウに変換することにしました。注意深い人として、私は足を濡らすためにPCFで最初のショットを作ることにしました. そして、それは失敗です。
2D textureでは、かなり簡単です。単純なカーネルを使用してライト深度マップからいくつかの値をサンプリングし、ボックス/ポアソン/ガウス/その他のフィルターでそれらを平均化します。
しかし、キューブマップでそれを行うにはどうすればよいですか?! オフセットは方向ですが、その方法がよくわかりません…</p>
c++ - シャドウ キューブマップのレイヤード レンダリング
レイヤード レンダリングを使用して、1 つのパスでシャドウ キューブマップをレンダリングしようとしています。
私は可能な限り徹底的にしようとしました:
- glFramebufferTexture を使用して、深度アタッチメント (GL_DEPTH_ATTACHMENT_32F) とカラー アタッチメント 0 (GL_R32F) の両方のキューブマップをバインドしました。
- テクスチャが FBO にアタッチされたら、フレーム バッファの完全性が完全であるかどうかを確認しました。
- 「layout(triangles, invocations=6) in;」を使用して、両方のジオメトリ シェーダーのインスタンス化を試みました。およびなし (for(int layer=0;layer<6;++layer) ループに頼り、gl_Layer = l を設定し、最初に各プリミティブに対して、次に各頂点に対して)
簡単に言えば、最初のレイヤー (つまり、この場合は X+) がレンダリングされますが、深度や色のアタッチメントなど、他のレイヤーはレンダリングされません。
階層化されたレンダリングに関するドキュメントはかなりまばらなようです。赤い本でさえ、せいぜい半分のページしか費やしていません...とにかく:
コード :
シェーダー :
バーテックス :
/li>ジオメトリ :
/li>フラグメント :
/li>
C++ (主に私のエンジンのクラスを使用します。これは実際に最低限のことを行い、FBO の場合は 2D (スポット) シャドウマップで既にテストされています):
シャドウマップ関連の変数の作成: https://gist.github.com/xtrium-lnx/77d8989b3c2370607cfc
シャドウマップのレンダリング: https://gist.github.com/xtrium-lnx/387b97c077525be60bb4
opengl - ディレクショナル ライト ビュー/プロジェクション マトリックス
ディレクショナル ライトのシャドウ マッピングの実装に問題があります。マトリックスを正しく設定する方法がわかりません... 影を左上から表示したいです(太陽が投げかけたように)。私が持っているのは、ワールド空間で錐台コーナーを生成する次のコードだけです。
太陽のビュー マトリックスを設定するにはどうすればよいですか?
opengl - 最新のアーティファクトのないシャドウ マッピング
ゲーム エンジンで使用する最適なシャドウ マッピング手法を見つけようとしています。これまでのところ、PCF を使用した標準のシャドウ マップ、カスケード シャドウ マップ、バリアンス シャドウ マップを実装してきました。しかし、どれも満足のいく結果をもたらしているようには見えません。
すべての状況に最適なシャドウ マッピング方法を見つけようとしています。背面の正しいジオメトリが必要なため、背面のレンダリングを使用できます。ただし、ローポリで滑らかな法線ジオメトリもかなりありますが、その結果、背面を描画するときでさえ、非常に醜いニキビができてしまいます。
重度のにきび、ピーターパン、または光のにじみがなく、ジオメトリに大きな制約を課さずに(背面のみ)、素敵なシャドウマップを取得するために使用できる他のテクニックは何ですか?
opengl - カスケード シャドウ マップが正しくない
Ok。それで、私は先週、自分のゲーム エンジンで影をいじっていました。私は主にカスケード シャドウ マップ (CSM) を実装しましたが、解決できないように見えるシャドウイングに少し問題があります。
このシーンの唯一のライトはディレクショナル ライト (太陽) で、{-0.1 -0.25 -0.65} を指しています。次のコードを使用して、CSM の 4 つの分割に対して 4 セットの錐台境界を計算します。
ライトの場合、次のようなビュー マトリックスを取得します。
次に、各錐台の境界から各オルソ マトリックスを作成します。
非常に単純な頂点シェーダー (フラグ無効またはパンチスルー アルファ) を使用してシーンを描画する 4 つのフレームバッファーにバインドされた 4 レイヤーの TEXTURE_2D_ARRAY があります。
その後、最後のシーンを描きます。頂点シェーダーは、4 つのシャドウ texcoords を出力します。
そして、使用する分割を決定するフラグメント シェーダー:
そして、この関数でシャドウ マップ配列をサンプリングします。
そして、これが私が得たシーンです (各分割がわずかに着色され、4 つの深度レイヤーがオーバーレイされています)
。いいね。
しかし、カメラを少し右に向けると、
影が消え始めます (角度によっては、影があるべきでない場所に現れます)。
GL_DEPTH_CLAMP を有効にしているので、それは問題ではありません。私は前面をカリングしていますが、それをオフにしてもこの問題に違いはありません。
私は何が欠けていますか?私の予測の 1 つに問題があるように感じますが、それらはすべて私には正しく見えます。ありがとう!
編集: 描画されたライトの錐台の 4 つすべて。それらはすべてそこにありますが、カメラに対して相対的に変化しているのは z だけです (以下のコメントを参照)。
編集: おそらくもっと便利です。これは、カメラが (0,0,0) にあり、前方 (0,1,0) を指しているときに、一度だけ更新したときに視錐台がどのように見えるかです。今回もデプステストで描きました。
重要な編集: この問題は、現在、ライトのビュー マトリックスに直接関連しているようです。
目とターゲットの値を変更すると、バグのある影に影響するようです。しかし、実際にこれを何に設定すればよいかわかりませんか?私よりも理解している人にとっては簡単なはずです:D
opengl - 遅延レンダリング、位置変換による OpenGL シャドウ マッピング
それに応じて目の空間の位置をテクスチャに保存する遅延レンダリングを使用しています。
バーテックス:
ジオメトリ:
断片:
次に、2 番目のパス (ライティング パス) で、この vec4 から計算された UV 座標を使用して、シャドウ マップをサンプリングしようとしています。
使用される位置は、位置テクスチャから保存およびサンプリングされた位置と同じです。この計算を行う前に、逆カメラ ビュー マトリックスを使用して位置を変換する必要がありますか? それをワールド空間に戻すには、どうすればよいですか?
c++ - 安定したシャドウ マッピング
3D レンダラーで影を安定させようとしています。CSMを使用しています。
これが私が手に入れたコードで、安定化を試みていません。ただし、ワールド空間での投影のサイズは少なくとも一定である必要があります。
それはうまくいきます。しかし、影はちらつき、狂ったように泳いでいます。したがって、どこでも推奨されているように見えますが、説明されていないように見えるように、テクセルサイズの増分にスナップしようとすることで、安定化を試みます。
これは、パターンに気付かないほど速くバウンスするのではなく、影がゆっくりと泳ぐという点で違いを生みます。しかし、それはたまたまのことであり、正しいものにまったくスナップしていないこと、または正しいものにスナップしていないことは確かです。
opengl - キューブマップ シャドウでバイアスを使用する方法
そのため、シャドウ マッピングにはさらに別の問題があります。キューブマップ シャドウを使用してポイント ライトを実装しようとしていますが、ほとんど機能しています。
影を DEPTH_COMPONENT16 タイプのキューブマップにレンダリングしています。ディレクショナル ライトとスポット ライトの場合とまったく同じシェーダーを使用して、6 つのパスを実行します。カラー出力はなく、深度バッファのみを使用します。キューブマップはスポットライトが 6 つしかないので、問題はないと思います。
ここで、ライティング シェーダーでシャドウ マップをサンプリングしようとすると、問題が発生します。私のレンダラーは延期されているので、深さからすべての位置を再構築する必要があります。
キューブマップからサンプリングするときは、次のようにします。
get_bias 関数:
sample_shadow 関数:
そして、これが私が得たものです。問題を簡単に確認できるように、ディスタンス ロール オフを無効にしています。
そのため、バイアスが適切に機能しません。より大きな値を返すように get_bias 関数を調整しても効果がないようです。にきびを取り除く唯一のことは、巨大な一定の偏りを加えることのようですが、これは明らかにオプションではありません.
比較のために、90 度の視野で同じ場所にレンダリングされたスポットライトを次に示します。シェーダーは同じ get_bias 関数を使用し、ニア プレーンとファー プレーンは同じ (0.2/5.0) です。
バイアスの問題はありません。6 つのスポットライト (丸みを帯びたエッジなし) を使用することもできますが、キューブマップを使用したいと思います。私は何を間違っていますか?