1

OpenGL を使用して単純な遅延レンダラーを実装しようとしています。トピックを説明するさまざまなチュートリアルや論文を読みましたが、ほとんどの場合、G バッファーの構造について非常に最小限または抽象的な説明しか提供していません。通常は、拡散、深度、および法線バッファーを含みます。

しかし、単純なグラフィックス エンジンでさえ、テクスチャや調整可能なスペキュラー ライティングなどを使用した何らかのマテリアル レンダリングがなければ完成しません。すべてのプロパティに追加のバッファを追加すると、明らかに G バッファが大量に肥大化するので、2 番目のレンダリング パスでマテリアルごとのデータをすべて取得するための推奨される方法は何ですか?

私の OpenGL 実装では、フレームバッファを使用して、拡散、法線、および深度をそれぞれ および にレンダリングGL_COLOR_ATTACHMENT0GL_COLOR_ATTACHMENT1ますGL_DEPTH_ATTACHMENT。できればOpenGL 3.3コアにIDなどを保存する方法はありますか?

4

1 に答える 1

2

マテリアル ID を格納する 1 つの方法は、その ID をフラグメント シェーダーに均一に渡し、それを G バッファーに書き込むことです。バッファが 4 チャネル RGBA8 で、マテリアル ID が unsigned 8 ビット int で、265 のマテリアルをサポートすると仮定すると、G バッファ パスのフラグメント シェーダは次のようになります (疑似)。

uniform uint inMatId;
uniform sampler2D inTexture;
void main()
{
    outputColor = vec4(texture(ourTexture, TexCoord).rgb, inMatId/255); 
}

もちろん、このように描画する最良の方法は、オブジェクトをマテリアル別に分類してから描画することです。[0,1] の範囲にマッピングするために、マテリアル ID を 255 で除算したことに注意してください。シェーディング パス中に、255 を乗算することでそれを読み取ることができます。同じアプローチを、必要な他のほとんどすべてのタイプのデータに使用できます。

于 2015-03-04T12:54:15.563 に答える