問題タブ [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.

0 投票する
1 に答える
5767 参照

graphics - 複数の点光源に対して単一のシャドウ マップを使用する方法は?

私が理解しているように、シャドウ マッピングは、ライトの視点からシーンをレンダリングして深度マップを作成することによって行われます。次に、カメラの POV からシーンを再レンダリングし、シーン内の各ポイント (GLSL のフラグメント) について、そこから光源までの距離を計算します。シャドウ マップにあるものと一致する場合は光の中にあり、そうでない場合は影の中にあります。

このチュートリアルを読んで、ポイント/全方向ライトを使用してシャドウ マッピングを行う方法を理解しました。

セクション 12.2.2 では、次のように述べています。

すべての光源に対して単一のシャドウ マップを使用します。

そして、12.3.6の下では次のように書かれています:

1) 現在のピクセルから光源までの二乗距離を計算します。
...
4) 計算された距離の値とフェッチされたシャドウ マップの値を比較して、影の中にいるかどうかを判断します。

これは大まかに上で述べたことです。

私が得られないのは、すべてのライトを 1 つのシャドウ マップに焼き付けた場合、どのライトとの距離を比較する必要があるかということです。マップに焼き付けられた距離は、すべてのライトのブレンドであるため、何にも対応していてはなりませんね。

私は何かが欠けていると確信していますが、誰かが私にこれを説明してくれることを願っています.


また、単一のシャドウ マップを使用している場合、それをすべての光源に対してどのようにブレンドするのでしょうか?

単一の光源の場合、シャドウ マップはライトに最も近いオブジェクトの距離 (つまり、深度マップ) を格納するだけですが、複数の光源の場合、シャドウ マップには何が含まれますか?

0 投票する
1 に答える
2246 参照

opengl-es - OpenGL|ES シャドウの追加 / シャドウ マッピング

3d オブジェクトに影を追加する最も簡単な方法は何ですか?

オブジェクト情報 (頂点、texCoordinates、法線、インデックス) を配列に格納しています。

ユーザーが 3d .obj ファイルを読み込んで影を追加できるようにする iOS 用のisgl3dのようなフレームワークがいくつかありますが、それらは多くの役に立たないものを追加し、マルチプラットフォーム (iOS + android) ではありません。

3D オブジェクトに影を追加する最も簡単な方法は何ですか?
実際の例 (iOS/Android) を表示/リンクしていただけますか?

0 投票する
1 に答える
1349 参照

opengl-es - シャドウマッピング-光に直交する薄壁のアーティファクト

背面(光に対して)とシャドウマッピングに問題があり、通過できないようです。私はまだエンジンの最適化の比較的初期の段階にありますが、この1つのジオメトリに合わせてすべてを手作業で調整しても、まだゴミのように見えるため、そこに到達できないようです。

それが何であるかは、壁の約5つの異なるチャンクを介して「湾曲」している細い壁です。デプスマップを作成するときは、前面を(光に対して)カリングしています。これは間違いなく役立ちますが、壁の反対側の前面がZファイティング/プロジェクティブシャドウイングを引き起こしているように見えます。

曲がった壁のアーティファクト

スクリーンショットのいくつかのメモ:

  • (ライトからの)深度テクスチャが描画されているときに、前面がカリングされます
  • このジオメトリのチャンク(それぞれ20と25に設定)に合わせて、ニアプレーンとファープレーンを調整しました。
  • シーンの右側に向かってわずかな角度で下がる1つの指向性光源。壁をシャドウイングする必要があることを示すのに十分ですが、ほとんどが真っ直ぐです。
  • ばかばかしいほど大きな4096x4096シャドウマップテクスチャを使用する
  • すべての照明が無効になっていますが、この壁でもソフト照明(したがって頂点の頂点法線)を実行していることを知っています

ここで述べたように、光の裏側にあるポリゴンをシャドウイングするべきではないと結論付けています。私はこの特定の問題に苦労しています。なぜなら、顔の法線をフラグメントシェーダーまで通過させて、そこにある光の真の背面を除外したくないからです。ただし、誰かがこれが最善/唯一の解決策であると感じた場合このジオメトリの場合、それが私がしなければならないことです。パイプラインが法線を通過するのを簡単/明白にしないことを考えると、これは最も抵抗の少ないパスではないように感じます。また、通過する法線は頂点法線であり、エッジの周りのよりソフトなライティング効果を可能にすることに注意してください(シャドウされていないサーフェスとシャドウされたサーフェスの両方が含まれる可能性があります)。

いくつかの厄介なパースペクティブエイリアシングがあることに注意してください、しかし私の次のステップがカスケードされたシャドウマップで作業することであることを望んでいます、しかしこれを修正せずに私はビューを手で締めたので避けられないことを遅らせているように感じます私ができる最善のこと(またはそう思う)。

とにかく何かが足りない気がするので、何か考えや助けがあれば大歓迎です!

編集

明確にするために、光がどこから来ているかに基づいて、壁は技術的に影になってはいけません。

俯瞰図

以下は、シャドウイングがオフになっている画像です。これは、頂点法線を使用して拡散反射光を計算しているだけです-きれいではありません(あまりにも多くのジオメトリが表示されています)が、エッジの一部がいくらか表示されていることを示しています。

シャドウイングなしでオン

そうです、壁は影になっている必要がありますが、エッジに拡散照明を適用できるように、スムージングをより適切に機能させることができると期待しています。完全にシャドウにする必要がある場合、それをシャドウに置くシャドウマップ、または顔の法線が離れているために特にシャドウに置くコードの場合は、それで問題ありませんが、顔の法線を通過させます私の頂点/フラグメントシェーダーには、抵抗が最も少ないパスのようには見えません。

おそらく、これらは私の問題をよりよく説明するのに役立つか、あるいは私が欠けているいくつかの基本的な理解を明らかにするのに役立つでしょう。

編集#2

以下にデプステクスチャを含めました。問題の壁は左下に表示され、スクリーンショットから、深度値を〜0.4->1にトリミングした方法を確認できます。これは、その壁の深さの値が0.4の範囲から始まることを意味します。したがって、完全にクリップされているわけではありませんが、近いです。それは合理的だと思いますか?完全な24ビットまたは32ビットの深度バッファ、iOSのDEPTH_COMPONENT拡張機能であると確信しています。@starmoleの場合、これは私の投影でのスケーリングエラーかどうかを判断するのに役立ちますか?私の地図がカバーするサイズ/面積が大きすぎると思いますか?それで、それがより近くに焦点を合わせるならば、それは助けになるかもしれませんか?

ここに画像の説明を入力してください

0 投票する
1 に答える
1033 参照

opengl - 無指向性シャドウ マッピング スポット ライト

遅延レンダラーで全方向シャドウ マッピングを実装していましたが、この問題の解決に問題があります。

ここに写真があります:影の問題の例

これは、各軸に沿って正と負の方向を指す 6 つのスポット ライトを配置したときに起こったことです。この問題は、スポット ライトの計算がライトの円錐内に照明を維持することによって引き起こされることを知っています。それが円形である理由です。

私が最初に考えたのは、円錐の計算を無効にすることでしたが、明らかに、あるライトから別のライトを見るとライトがブレンドされているため、オーバーラップが発生します。ライト用にレンダリングされているジオメトリを円錐形から四角形ベースのピラミッドに変更すると (とにかくこれを行う必要があると思いますか?)、代わりにライトのフラスタム (既に持っているもの) を使用できます。現在のピクセルが円錐台の内側にあるかどうかをテストするための円錐計算のことですよね?

もしそうなら、ピクセルシェーダーでこれを行う最良の方法を知っている人はいますか? ポイントが錐台の各平面の前にあるかどうかを確認することだけを考えましたが、これをピクセル シェーダーで行うにはコストがかかるようです。

0 投票する
1 に答える
3990 参照

c++ - 最新のOpenGLシャドウキューブマッピングへのポインタ?

バックグラウンド

私はC++と最新のOpenGL(3.3)を使用して3Dゲームに取り組んでいます。現在、ライティングとシャドウレンダリングに取り組んでおり、指向性シャドウマッピングを正常に実装できました。ゲームの要件を読んだ後、ポイントライトシャドウマッピングが必要になると判断しました。いくつかの調査を行った後、全方向性シャドウマッピングを実行するには、方向性シャドウマッピングと同様のことを実行しますが、代わりにキューブマップを使用することを発見しました。

私はキューブマップについてこれまでの知識はありませんが、キューブマップは6つのテクスチャであり、シームレスに接続されていることを理解しています。私は周りを見回しましたが、残念ながら、現代のOpenGLの主題に関する決定的な「チュートリアル」を見つけるのに苦労しました。ソースコードの抜粋や概念だけから学ぶのに真剣に苦労したので、最初から最後まで説明するチュートリアルを最初に探しますが、試してみました。

現在の理解

これが私の一般的な考え方ですが、専門性はありません。訂正してください。

  • ポイントライトごとに、指向性シャドウマッピングのようにフレームバッファが設定されます
  • 次に、単一のキューブマップテクスチャが生成され、。でバインドされglBindTexture(GL_TEXTURE_CUBE_MAP, shadowmap)ます。
  • キューブマップは、次の属性で設定されます。

    /li>

(これも指向性シャドウマッピングに似ています)

  • glTexImage2D()これで、顔ごとに1回ずつ、6回繰り返されます。私はこのようにします:

    /li>
  • テクスチャは、への呼び出しでフレームバッファにアタッチされます

    /li>
  • シーンをレンダリングする場合、指向性シャドウマッピングのように、2つのパスでレンダリングされます。

  • まず、シャドウフレームバッファがバインドされ、ビューポートがシャドウマップのサイズ(この場合は1024 x 1024)に調整されます。
  • カリングは前面に設定されていますglCullFace(GL_FRONT)
  • アクティブなシェーダープログラムは、頂点とフラグメントのシャドウシェーダーに切り替えられます。これらのシェーダーは、さらに下のソースを提供します。
  • 6つのビューすべてのライトビューマトリックスが計算されます。これを行うには、glm::mat4とpush_back()行列のベクトルを次のように作成します。

    /li>
  • デフォルトのフレームバッファがバインドされ、シーンは正常に描画されます。

問題

さて、シェーダーに。これは私の理解が枯渇するところです。私は自分が何をすべきか完全に確信が持てません。バージョンが異なるため、私の研究は互いに矛盾しているようです。結局、ランダムなソースからコードを無造作にコピーして貼り付け、それが黒い画面以外の何かを達成することを望んでいました。私はこれがひどいことを知っていますが、何をすべきかについて明確な定義がないようです。どのスペースで働いていますか?指向性ポイントライティングで使用したように、別のシャドウシェーダーも必要ですか?シャドウキューブマップのタイプとして何を使用しますか?samplerCube?samplerCubeShadow?上記のキューブマップを適切にサンプリングするにはどうすればよいですか?誰かが私のためにそれを片付けて、いい説明をしてくれることを願っています。シェーダー部分についての私の現在の理解は次のとおりです。-シーンがキューブマップにレンダリングされているとき、頂点シェーダーは、C ++コードで計算したdepthMVPユニフォームを取得し、それらによって入力頂点を変換します。-キューブマップパスのフラグメントシェーダーは、シングルアウト値をに割り当てるだけです。gl_FragCoord.z。(この部分は、指向性シャドウマッピングを実装したときから変更されていません。シェーダーはキューブマップと相互作用しないため、キューブマッピングでも同じだと思いました。OpenGLは、シェーダーからの出力をキューブマップにレンダリングするだけですよね?フレームバッファ?)

  • 通常のレンダリングの頂点シェーダーは変更されていません。
  • 通常のレンダリングのフラグメントシェーダーでは、頂点の位置は、ライトの投影とビューマトリックスを使用してライトの空間に変換されます。
  • これは、キューブマップテクスチャルックアップで何らかの形で使用されています。???
  • 魔法の手段を使用して深度が取得されると、指向性シャドウマッピングのように、頂点までのライトの距離と比較されます。それより少ない場合は、そのポイントをシャドウする必要があり、その逆も同様です。

それはあまり理解されていません。頂点がどのように変換され、キューブマップを検索するために使用されるかについては空白になっているので、人々がこれを明確にできることを期待して、シェーダーのソースを貼り付けます。このコードの多くはブラインドコピーと貼り付けであることに注意してください。理解を損なうことのないように、私は何も変更していません。

シャドウ頂点シェーダー:

シャドウフラグメントシェーダー:

標準の頂点シェーダー:

標準フラグメントシェーダー:

ComputerShadowFactorとVectorToDepthValueの関数コードがどこから来たのか思い出せません。今はラップトップで調べていたのですが、これはこれらのシェーダーの結果です。

これらのシェーダーの結果

影のある空間に囲まれた影のない空間の小さな正方形です。

チュートリアル以外から学ぶのは難しいので、このテーマに関する知識が不足しているため、おそらくシェーダーを中心に、ここで多くの間違いをしていることは明らかです。申し訳ありません。私が間違っていること、なぜそれが間違っているのか、どうすれば修正できるのか、そしておそらくいくつかのコードについても明確に説明して、誰かがこれに光を当てることができれば素晴らしいと思います。問題は私が間違った場所で働いていることが原因かもしれないと思います。

0 投票する
1 に答える
753 参照

opengl - OpenGL 深度テクスチャ アーティファクト

小さな 3D エンジンにシャドウ マッピングを実装しています。ただし、深度テクスチャにアーティファクトがあるようです。これは、テクスチャを使用して影を観察するか、クワッドに深度テクスチャを描画することで確認できます。

クワッドに描画されたときの深度テクスチャは次のようになります。

はい、それらの小さな白い四角形はそこにあるべきではありません。

それで、それを引き起こしている可能性があるのは何ですか?

glfw ウィンドウを開く:

深度フレーム バッファとテクスチャの作成:

深度テクスチャへのレンダリング:

0 投票する
1 に答える
240 参照

opengl - シャドウマッピングopenglglslシェーダーグラフィックス数学

異なるシェーダーステージ間の計算を理解するのに苦労しています。

ライトの観点から見たフラグメントシェーダーでは、基本的にfragDepthをrgbカラーに書き込みます。

上記のシェーダーを使用してシーンをレンダリングすると、シーンはすべて白色で表示されます。gl_FragCoord.zが1より大きいためだと思います。うまくいけば、1で最大になりませんが、今のところその質問はそのままにしておくことができます。

カメラの観点からのジオメトリシェーダーでは、基本的にすべてのポイントを四角形に変換し、おそらく「正しくない」テクスチャ位置を書き出して、lightTextureでルックアップします。ここでの数学が問題です。また、次のシェーダーステージで補間値が正しいかどうかについても少しわかりません。

カメラの観点からのフラグメントシェーダーでは、基本的にlightTextureでルックアップし、ライトパースペクティブからどの色が表示されるかを調べ、同じ色を書き出します。

カメラの観点からレンダリングすると、シーンが適切に描画されているのがわかりますが、不適切なテクスチャ座標が適用されて繰り返されます。テクスチャの繰り返しは、テクスチャ座標が0から1の範囲外にあることが原因である可能性があります。

私はいくつかのことを試みましたが、それでも数学がどうあるべきか理解できません。コメントアウトされたコードの一部と不明な例の1つは次のとおりです。

左下隅に。他のコーナーへのsimilairコード

ソリューションから、シーンはカメラの視点からライトの視点とまったく同じ色でレンダリングされると思います。おそらくいくつかの精度エラーがあります。

0 投票する
1 に答える
801 参照

opengl - ShadowMapは混乱します

シャドウマッピングについて混乱しています。これが私が理解したことです(以下の手順は機能していません:))

利益を得る方法(コードについて混乱しないでください。Javaで書いているからです):

1.パラメータを使用して空のdepthTexture(私のものは1024x1024)を作成します

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE)

glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, width, height, 0, GL_DEPTH_COMPONENT, GL_FLOAT, GL_NULL)

2. FBOを作成し、そのテクスチャをそれに添付します

glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, depthTexture, 0)

3.照明カメラの新しい投影とビューマトリックスを設定します

シーンが良く見えるので、メインカメラと同じものを別の座標で使用しました(試してみたので、問題はありません...と思います)。

4.新しい小さなシェーダーを作成してFBOのgl_Positionを決定し、メインシェーダーを派手なもので変更します(バイアス行列* lightCamera行列*頂点、sampler2Dshadowなど)

5.もちろん、すべてを統一して何かをします。

そして今、レンダーループ

1.もちろん、すべてを統一し、(もう一度)何かをします。

2. FBOをバインドし、小さなシェーダーをバインドglViewport(0, 0, 1024, 1024)します、、 colorMaskをfalseにバインドし、深度バッファーをクリアしますglCullFace(GL_FRONT)、、glBindTexture(GL_TEXTURE_2D, 0)

3.頂点位置属性のみを使用してすべてを完全に無料でレンダリングします

4. FBOのバインドを解除し、プログラムをメインシェーダー(派手なものを含むもの)に再バインドしglViewport、colorMaskを有効にします。glCullFace(GL_BACK)

5.sampler2DShadow 「バインドしたり、均一にしたり、触れたりしないので、メインシェーダーがどうなるか」を考えずに、通常どおりにシーンをレンダリングします。

6.数え切れないほどのグリッチ、バグ、ピクセル乱交を見る

実際、サンプラーにdepthTextureを均一にしようとしましたが、黒い画面しかありません。また、FBOをレンダリングしなくても、レンダリングすると同じ画像が表示されます。

誰かが説明できますか、私は何が欠けていますか?

シェーダーがディフューズテクスチャをディフューズテクスチャとdepthTextureの2回使用しているように感じますが、そのdepthTextureを与える方法がわかりません。

0 投票する
1 に答える
1577 参照

c++ - OpenGL シャドウ マッピングの動作がおかしい

C++ と OpenGL 3.2 で SFML を使用して 3D ゲームを作成しています。ポイント ライト シャドウ マッピングの実装に苦労しています。私がこれまでに行ってきたことは、私が学んだことや見た例と一致しているように見えますが、それでも影はありません.

私が行ったことは、使用するすべてのコードの単純化されたリストを、使用する正確な順序で作成することですが、完全なソース コードとしてではなく、関連するコードのみを記述します (私のプロジェクトはいくつかのクラスに分割されているため)。

これが私のコードが今何をするかの写真です:

壊れたシャドウ マッピング

これは奇妙な効果ですが、私が意図したものに近いようです。0, 0, 0 の光にさらされたサーフェスには、その中心に影のない円があり、他のすべては影がないように見えます。

0 投票する
1 に答える
2438 参照

opengl - シャドウマッピングのバイアス行列は混乱します

シャドウマッピングのバイアス行列について混乱しました。この質問によると:シャドウマッピングのバイアス行列、バイアス行列はスケールダウンして[0..1]xと[0..1]yに変換するために使用されます。バイアスマトリックスを使用しない場合、テクスチャは1/4のシーンサイズで埋められると思いますか?本当?それともここに魔法がありますか?