0

最初の私の問題:FBOの複数のバッファにレンダリングしようとしています。を使用して複数のバッファを設定glDrawBuffersし、適切なを使用してそれらにレンダリングしますgl_FragData。すべて順調ですが、私の状況では、バッファの1つを正確に4分の1ずつダウンサンプリングする必要があります(w/2h/2)。

もちろん、後でこれらの特定のバッファーをブリットすることでこれを行うことも、CPUでダウンサンプリングを行うこともできます(現在のソリューション)。しかし、それから私はビューポート配列について読み、ARB仕様でこの引用を見つけました。これは、余分な変換なしで、まさに私が望むもののようです。

さらに、複数のフレームバッファアタッチメントと組み合わせると、それぞれに異なるビューポートの長方形を選択できます。

もちろん、仕様では、後でこれを行う方法や実際の意味については言及されていませんが、multiple framebuffer attachments非常に一般的です。特定のビューポートをジオメトリシェーダーの出力(output gl_ViewportIndex)として設定できることに気づいただけです。したがって、配列内のビューポートごとにジオメトリを2回呼び出すことができます。しかし、私が理解している限り、これは、ターゲットバッファーごとに1つではなく、別のビューポート変換が適用されたフラグメントシェーダーを呼び出すだけです。もちろん、これは私のユースケースにはあまり意味がありません。また、これがフレームバッファの添付ファイルごとにビューポートを選択するのにどのように役立つかわかりません。

私の状況では、ジオメトリシェーダーを追加することはあまり意味がありません。また、ビューポート変換はフラグメントシェーダーの後にのみ適用されるため、レンダリングターゲットごとにビューポートを設定することは理にかなっています。これは、前の引用で確認されているようです。これは実際に可能ですか?もしそうなら、どうすればこれを達成できますか?

ああ、私はすでに明らかなことを試しました:そのターゲットのレンダーバッファのサイズをGL_COLOR_ATTACHMENT1ダウンサンプリングしたバージョンにサイズ変更し(たとえば、使用します)、ビューポート配列のインデックス1をそれに応じたサイズに設定します。最終的に、画像の左下の象限の写真が表示され、ビューポートは変更されていないことがわかりました。

4

1 に答える 1

4

ビューポート配列は、ジオメトリ シェーダーでのみ使用できます。それらがないと、配列インデックス 0 がすべてのレンダリングに使用されます。

覚えておいてください: ビューポートの変換は、ラスタライズの前に行われます。したがって、三角形を複数のビューポートで変換する場合は、その三角形を複数回レンダリングするようシステムに効果的に要求していることになります。これを行う唯一の方法は、プリミティブを複数回出力するジオメトリ シェーダーを使用することです。

于 2012-08-01T20:58:56.190 に答える