6

私は WebGL の初心者です。ND-Buffers と G-Buffers が WebGL 開発の戦略的な選択であるかのように、いくつかの投稿を読みました。

ND バッファーと G バッファーはパイプラインのレンダリングにどのように関連していますか? ND バッファーはフォワード レンダリングでのみ使用され、G バッファーは遅延レンダリングでのみ使用されますか?

両方を実装する JavaScript コード例は、違いを理解するのに役立ちます。

4

3 に答える 3

8

G バッファは、遅延レンダリングで一般的に使用されるバッファのセットです。

ウィキペディアは、g バッファーでよく見られる種類のデータの良い例を示しています。

拡散色情報

拡散色

ワールド空間またはスクリーン空間の法線

ワールド空間法線

深度バッファ / Z バッファ

深度バッファ

これら 3 つのバッファーの組み合わせは、「g バッファー」と呼ばれます。

ジオメトリとマテリアル データからこれら 3 つのバッファを生成すると、シェーダを実行してそれらを結合し、最終的なイメージを生成できます。

最終イメージ

実際に g-buffer に入る内容は、特定のエンジン/レンダラー次第です。たとえば、Unity3D の遅延レンダリングの1 つには、拡散色、オクルージョン、鏡面反射色、粗さ、法線、深度、ステンシル、放出、照明、ライトマップ、反射プローブが含まれています。

ND バッファーは、「通常の深度バッファー」の略であり、典型的な g バッファーで通常見られるもののサブセットになります。

SO には間違いなく大きすぎるサンプルについては、MDN の WebGL での遅延レンダリングに関する記事があります。

于 2016-06-11T09:21:00.583 に答える
1

以前の回答にさらに情報を追加したいと思います。

ND-Buffers と G-Buffers が WebGL 開発の戦略的な選択であるかのように、いくつかの投稿を読みました。

遅延レンダリングの最も重要な部分の 1 つは、特定のプラットフォームが MRT (複数のレンダー ターゲット) をサポートしている場合です。そうでない場合、各レンダリング間でシェーダーの部分的な計算を共有できず、「レイヤー」と同じ回数レンダリングを実行する必要があります (unity 3D の場合、最大 11 回になる可能性があります)。 ?)。これにより、プログラムが大幅に遅くなる可能性があります。

この質問の詳細を読む OpenGL ES 2.0 で延期されたレンダリング/シェーディングは可能ですか?

Webgl は MRT をサポートしていませんが、拡張機能があります: https://www.khronos.org/registry/webgl/extensions/WEBGL_draw_buffers/

また、深度テクスチャの拡張もあります: https://www.khronos.org/registry/webgl/extensions/WEBGL_depth_texture/

したがって、遅延レンダリング手法を使用できるはずですが、その速度を推測するのは困難です。

于 2016-06-12T12:46:31.037 に答える