問題タブ [deferred-shading]

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 投票する
2 に答える
1033 参照

opengl - ディファード シェーディング - 複数のライト (OpenGL/GLSL)

私はディファード シェーディング プログラムに取り組んでおり、シーンに 50 の異なるライトを設定する必要があります。そのために、次のコードを使用して属性 (位置、拡散色、反射色) をランダムに生成しています。

ただし、複数のライトでライティングを実行する方法がよくわかりません。アンビエント ライトはディフューズ ライトと等しくなければならず、スペキュラー ライトは白であるべきだと言われました。

Phong Ilumination を実行するために必要だったシェーダーを適応させると、次のようになります。

ただし、次の図に示すように、(間違っていない場合でも) 醜い結果が得られます。

ここに画像の説明を入力 ここに画像の説明を入力

この結果は 2 つのライトのみを使用しています。50を使わないといけないので、真っ白な画面ばかりだと思いますが…

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

opengl - OpenGL と GLSL を使用したステンシル バッファーと遅延レンダリング

遅延レンダリング コンテキストでのステンシル バッファの使用に関して 1 つ疑問に思っているのは、スクリーン スペース上のすべてのフラグメント シェーダが「オクルード」領域内で使用されているかということです。

Web サイトhttp://www.learnopengl.com/#!Advanced-OpenGL/Stencil-testingの例を次に示します(ステンシル バッファーのトピックのみで、遅延レンダリングとは関係ありません)。

ここに画像の説明を入力

質問: ここで「他は捨てる」という表現は何を意味していますか? これは、マスク サンプラーで値が 0 の場合、ピクセル シェーダーが呼び出されないことを意味します。または、画面上の各フラグメントに対してピクセル シェーダーが呼び出されますが、値が 0 の場合、ピクセルの塗りつぶしを破棄する条件が適用されます。

左の最初の画像が、ステンシル バッファリングなしの結果であるとします。情報のサポートは、2 つの三角形で構成されるクワッドです (遅延レンダリング手法を適用するため、画面空間で作業しています。画面の寸法は 500x500 です)。そのため、ラスタライズ後、500 * 500 のフラグメント シェーダーが呼び出されてフレーム バッファーが満たされ、光のない暗い領域でもそれらのすべてが使用されます。これは、ブリンフォン シェーディング モデルを適用すると、この最後のモデルが画面のどこにでも適用され、暗い領域でも適用されることを意味し、パフォーマンスの無駄だと思います。

したがって、この場合に行う論理的なことは、マスクを作成し (ステンシル バッファーを使用するか、他のフレーム バッファーを使用してマスクを塗りつぶす外部カスタム マスク レンダー パスを使用して)、最後に blinn-phong シェーディング モデルのみを使用することです。ここで、スクリーン スペースのマスク サンプラーのピクセルの値は 1 です。このようにして、フォン シェーディング モデルは、この例でのみ 2 つのボックスとプレーンに適用されます。

最初のアプローチでジョブを正しく行うための秘訣は、フラグメント シェーダーに条件を追加して、現在のフラグメントのブリンフォン シェーディングを計算する必要があるかどうかを、サンプリングされたマスク テクスチャの値に従って判断することです。

しかし、(上の 3 番目の図を見ると) 色付きの領域のみに関係するフラグメント シェーダーを呼び出すように OpenGL API に指示できるかどうか疑問に思っています! (つまり、フラグメント シェーダーのメインには入らないということです)。この場合、使用されるフラグメント シェーダーの数が大幅に削減され、パフォーマンスが向上します。または、上記のようにフラグメント シェーダーに条件を入れることが唯一の解決策ですか?

0 投票する
2 に答える
421 参照

opengl - あるフレーム バッファから別のフレーム バッファへの読み取りに関する問題

しばらくの間、ディファード シェーディング/レンダリングをエンジンに実装しようとしてきましたが、実際にその最終成果物を見ることができませんでした。

問題がどこにあるのかをテストするために、glBlitFramebuffer() コマンドを使用して、ターゲット FBO が実際にデフォルト FBO との間で読み取られているかどうかを確認する実験を考案しました。

デフォルトの FBO 自体がクリアされる前に、クリア カラーがblackに設定され、ターゲット FBO がクリアされる前に、クリア カラーがredに設定されるようにしました。

その結果、シーンをレンダリングすると、黒しか見えなくなります。

私の質問はこれです:

1 つの fbo が read_framebuffer に設定され、デフォルトが draw_framebuffer に設定されている場合、「glBlitFramebuffer」操作中に「クリアカラー」ピクセルもコピーされますか?

いいえの場合、その色はとにかくコピーされないため、ターゲット FBO が実際にレンダリングされているかどうかはわかりません。

はいの場合、赤色が表示されているはずで、FBO の設定の何が問題なのかわかりません...


前に述べたように、私はディファード シェーディング システムに取り組もうとしています。そのシステムでは、すべての操作を FBO で実行し、その全体をデフォルトの FBO に戻す必要がありました。

うまくいかなかったので、基本的なシーンをデフォルトの FBO に直接レンダリングする (動作する) か、ターゲット FBO にレンダリングし、手順に従ってその FBO をデフォルトの FBO にコピーする手順を簡略化しました (これは機能しません)。

私が使用しようとしているフレーム バッファの設定は、私が従ってきたチュートリアルと同じです。

そして、私は自分のシーンを次のようにレンダリングします (簡略化):

すべてのステップでフレーム バッファのステータスを確認しましたが、エラーは発生しませんでした。


私は実際の問題を発見しました。完全に理解できたら、この投稿を更新して詳細情報を追加します。

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

c++ - FBO による OpenGL シェーディング パイプラインの効率化

シーンに少なくとも 20 個のライトが必要なため、ディファード シェーディングの実装に取り​​組んでいます。私はそれを十分に速くするのに問題を抱えていました(そして今でもそうです)が、遅くなると思っていた変更を加えましたが、実際にはフレームレートがほぼ2倍になりました.

初期コード:

ジオメトリ パス中にピクセルが設定されている場合 (つまり、法線 = 0,0,0、位置 = 0,0,0、色 = 0 の背景) にのみライティング パスを実行するようにステンシル テストをセットアップしていました。 ,0,0.

ただし、結合された深度/ステンシル バッファーをデフォルトの深度/ステンシル バッファーにコピーするのは困難でした。システムの深度/ステンシル バッファがどのような形式になるかがわからないため、これはうまく機能しないようです。そのため、深度/ステンシル バッファ フォーマットを指定し、これにレンダリングしてから、スクリーン クワッドをブリットまたはレンダリングして画面に出力できる別の FBO をセットアップする方がよいと読んでいました。

そのため、ステンシルを追加する前に、新しい FBO を追加して、そのビットが機能するようにしました。

私の新しいコードは次のようになります。

これは期待どおりに機能します。予想外だったのは、フレーム レートが 25 FPS から 45 FPS に急上昇したことです。

どうしてこれなの?スクリーン クワッドに追加のシェーダー パスを実行しなければならないことは、実行しないよりも効率的ですか?

簡単なフォローアップの質問。シンプルな頂点シェーダーとフラグメント シェーダーを使用して gl_FragCoord に基づいてテクスチャをサンプリングすることと、カラー アタッチメントをシステム FBO に直接ブリットすることのどちらが効率的ですか?

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

opengl - コンピューティング シェーダーを使用しないタイル張りの遅延シェーディング

私はディファード レンダラーを構築しています。シーンで大量のライトをサポートしたいので、タイル張りのディファード シェーディングを調べました。

問題は、OpenGL 3.3 ハードウェアをターゲットにする必要があり、GLSL 計算シェーダーをサポートしていないことです。

通常のシェーダーでタイル遅延シェーディングを実装する可能性はありますか?