7

テクスチャにバインドされたオフスクリーン フレーム バッファ オブジェクトへのオフスクリーン レンダリングは非常に簡単なはずですが、頭が回らない問題が発生しています。

私の完全なサンプル プログラム (今のところ 2D のみ!) は次のとおりです。

http://pastebin.com/hSvXzhJT

いくつかの説明については、以下を参照してください。

rgba テクスチャ オブジェクト 512x512 を作成し、FBO にバインドします。この時点では深度やその他のレンダー バッファーは必要なく、厳密には 2D です。

次の非常に単純なシェーダーがこのテクスチャにレンダリングされます。

頂点シェーダー:

varying vec2 vPos; attribute vec2 aPos;
void main (void) {
    vPos = (aPos + 1) / 2;
    gl_Position = vec4(aPos, 0.0, 1.0);
}

aPos では、クワッドの 4 つの xy 座標 (-1、-1 :: 1、-1 :: 1、1 :: -1、1) を含む VBO を取得します。

したがって、フレームバッファの解像度は理論的には 512x512 である必要がありますが、シェーダーはその「テクスチャ」を「フル (オフ) スクリーン クワッド」にレンダリングし、GLs -1..1 座標パラダイムに従います。

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

varying vec2 vPos;
void main (void) {
    gl_FragColor = vec4(0.25, vPos, 1);
}

そのため、0 から 1 の間の x/y に応じて、赤が 0.25 に固定され、緑/青で完全に不透明な色が設定されます。

この時点で、512x512 のテクスチャがレンダリングされ、-1..1 フル (オフ) スクリーン クワッドのみが表示され、0..1 から緑/青のフラグメント シェーディングが行われると仮定しています。

これが私のオフスクリーン設定です。画面上には、4 つの xyz 座標 { -1, -1, 1 ::: 1, -1, 1 ::: 1, 1, 1 ::: -1, 1, 1}。繰り返しますが、今のところこれは 2D なので行列はなく、z は常に 1 です。

このクワッドは別のシェーダーによって描画され、テキスト GL-101 スタイルの特定のテクスチャを単純にレンダリングします。上にリンクされている私のサンプル プログラムでは、単純なブール値のトグル doRtt があります。これが false (デフォルト) の場合、render-to-texture はまったく実行されず、このシェーダーは単に現在のディレクトリの texture.jpg を使用していることを示しています。

この doRtt=false モードは、画面上の 2 番目のクアッド レンダラーが現在の要件に対して「正しい」ことを示しており、必要に応じてテクスチャリングを実行します。それ以外の場合は、テクスチャ フィルタリングやミップマッピングなしでスケーリングします。

したがって、ウィンドウ (およびビュー ポート) のサイズがどのように変更されても、単一のテクスチャが水平方向に 2 回、垂直方向に 2 回繰り返されるフルスクリーン クワッドが常に表示されます。

ここで、doRtt=true を使用すると、2 番目のシェーダーは引き続き機能しますが、テクスチャが完全に正しくスケーリングまたは描画されることはありません。残念ながら、「ねえ、この FBO をディスクに保存してデバッグ目的」。

RTT シェーダーは一部のレンダリングを実行します (または完全なレンダリングで、画面外で何が起こっているのかわかりません...)。非常に単純な RTT フラグメント シェーダーから期待されるすべての色が実際に表示されるわけではありません。

(A) いずれか: 512x512 テクスチャは正しく作成されていますが、私のコードでは正しくマッピングされていません (しかし、doRtt=false を使用すると、まったく同じ単純な textured-quad-shader を使用して特定の texture.jpg ファイルが正常に表示されるのはなぜですか?)

(B) または: 512x512 のテクスチャが正しくレンダリングされず、ウィンドウの解像度に応じて rtt フラグ シェーダが出力を変更しますが、なぜでしょうか? オフスクリーン クワッドは常に x と y に対して -1..1 であり、頂点シェーダーは常にこれをフラグメント座標 0..1 にマップし、RTT テクスチャはこの簡単なテストのために常に 512x512 のままです!

オフスクリーンのクワッドとオンスクリーンのクワッドの両方が座標を変更することはなく、常に「フルスクリーン」(両方の次元で -1..1) であることに注意してください。

繰り返しますが、これは非常に単純なはずです。一体何が欠けているのですか?

仕様: OpenGL 4.2 (ただし、コードには明らかに 4.2 の機能は必要ありません!)、Nvidia Quadro 5010M、openSuse 12.1 64 ビット、Golang Weekly 2012 年 2 月 22 日。

4

1 に答える 1

12

まず、OpenGL エラーをチェックしてみてください。各 OpenGL 関数の後に glGetError() を呼び出します。また、描画用に正しいビューポートを設定する必要があります。FBO に描画する前に、glViewport(0, 0, 512, 512) を呼び出します。画面に描画する前に、glViewport(0, 0, display_width, display_height) を呼び出します。

また、FBO を使用してレンダリングする場合、rttFrameTex をバインドする必要はありません。バインディング テクスチャは、シェーダーでテクスチャを読み取る場合にのみ必要です。

于 2012-03-09T07:56:12.340 に答える