0

GLSLシェーダーでOpenGLを使用して、画像処理を行っています。私は基本的に、正射投影でフレームバッファを使用して、画像を複数回レンダリングしています(フラグメントシェーダの設定はそれぞれ異なります)。

次に、テクスチャがアタッチされた 2 つのフレームバッファがあり、その間で前後にレンダリングします (たとえば、tex1 は fb1 にアタッチされ、tex2 は fb2 にアタッチされます。最初のパスは入力テクスチャを fb1 にレンダリングし、2 番目のパスは tex1 を fb2 にレンダリングし、3 番目のパスは tex1 を fb2 にレンダリングします。 tex2 を fb1 にレンダリングします... 前後に) 最終パスが任意のテクスチャから出力フレームバッファにレンダリングされるまで。

これはすべて、正投影を使用して行われるため、画像が欠落することはありません。ウィンドウのサイズが変更されるまで、これはすべて正常に機能します。ウィンドウの高さを半分に減らすと、画像は残っているウィンドウの上半分にのみ描画されます (これは 1 回のパス、2 回のパスで、ウィンドウの上 1/4 にのみ表示されます) )。なぜこれが起こっているのか誰にも理解できますか?

2 番目の写真は、ウィンドウのサイズを元の高さの 3/4 に変更した後です。

http://i567.photobucket.com/albums/ss112/davidc538/rtip1.png

http://i567.photobucket.com/albums/ss112/davidc538/rtip2.png

4

1 に答える 1

1

サイズ変更が発生したときにテクスチャの寸法を更新していないようです。つまり、ウィンドウのサイズが変更されましたが、まだ初期のサイズにブリットしています。

  • パス 1 は tex1 を書き込みます (これは fb1 にアタッチされています)
  • パス 2 は、tex1 (fb1 にアタッチされている) を tex2 (fb2) に書き込みます。
  • Pass 3 は tex2 を tex1 に書き戻します
  • Pass 3 は tex1 を tex2 に書き戻します

これは、パスごとに画像を縮小/拡大していることを意味します。

サイズ変更中にfboを更新するか(最も近い2のべき乗に丸めることをお勧めします)、またはfboを固定サイズのままにして常にフルウィンドウにレンダリングすることでこれを回避できます(ただし、画像は大きなウィンドウにレンダリングするとぼやけます)。

于 2013-10-08T16:06:50.267 に答える