2012-02-28 5 views
6

私はCUDAによって各フレームが更新されるPBOを持っています。その後、私はglTexSubImage2dを使ってこのPBOを使ってテクスチャを更新したいと思います。私は、全体のテクスチャを更新するのはコストがかかり、PBOのデータ全体が更新されている間は、そのテクスチャの可視領域だけを更新したいと思います。データオフセットをサポートするglTexSubImage2dの代替品を探す

glTexSubImage2dはオフセット、幅、高さをパラメータとして受け取りますが、それらはテクスチャにペイントするときにのみ使用され、バッファデータは線形にレイアウトする必要があります。バッファのデータを準備するのは非常に高価かもしれません(実際には私のPBOがGPUのメモリにあるので、実際には非常に高価になります)。glTexSubImage2dには、バッファオフセットのパラメータも必要ですか?一度にテクスチャ全体を更新し続けますか?

答えて

7

glPixelStoreで設定したピクセルストアのパラメータをお読みください。パラメータはGL_UNPACK_ROW_LENGTHGL_UNPACK_SKIP_PIXELSGL_UNPACK_SKIP_ROWSはあなたのために最も関心のある:

Pixel Store Parameters

これらの値は、プログラマの便宜のために提供されています。 glDrawPixels、glTexImage1D、glTexImage2D、glTexSubImage1D、glTexSubImage2D、glBitmap、またはglPolygonStippleに渡されるポインタをインクリメントすることによって複製できない機能は提供しません。 GL_UNPACK_SKIP_PIXELSをiに設定することは、ポインタをn個のコンポーネントまたはインデックスでインクリメントすることと等価であり、nは各ピクセル内のコンポーネントまたはインデックスの数である。 GL_UNPACK_SKIP_ROWSをjに設定することは、GL_UNPACK_ROW_LENGTHセクションでちょうど計算されたように、jk個のコンポーネントまたはインデックスによってポインタをインクリメントすることと等価である.kは行当たりのコンポーネントまたはインデックスの数である。

あなたはまだデータ転送にglTexImageおよび/またはglTexSubImageを使用します。

+0

驚くべきことに、私は必要なものとまったく同じように見えます。ありがとう! – kaoD

+0

さらに読んだ後、なぜ「ポインタを増やすことによって複製できない機能を提供していない」と言うのでしょうか? ROWSとPIXELSのSKIPを同時に設定すると、私は期待どおりに動作しますか? – kaoD

+1

@kaoD:それはそれが本当だからそう言います。これらのSKIP値は、ポインタをインクリメントすることによって定義されます。したがって、ポインタをインクリメントするのと同じです。あなた自身ではできないROW_LENGTHです。 –

0

glTexSubimage2Dは、テクスチャ内の選択されたROIがテクスチャサイズ全体と等しくない場合、PBOからデータを取得する際にエラーが発生します。 これは修正されない可能性がある既知の問題です(例:opengl forum thread)。