2017-02-22 12 views
0

私は全体の画像を含むGLvoid* dataを持っています。これは私のプログラムを通して定期的に更新されています。私はglTexImage2Dを使って、このデータでGPUのテクスチャを初期化します。glTexSubImage2Dに全部または一部の画像を提供する必要がありますか?

glTexSubImage2Dを使用して、必要に応じてテクスチャの一部を更新したいと考えています。 documentation for glTexSubImage2DのようなGLvoid* pixels引数説明:

をメモリ内の画像データへのポインタを指定します。

「画像データ」とはこれを期待していますか? GLvoid* data全体を提供できますか、またはにのみコピーされるデータが含まれていることを期待していますか?

部分データが必要な場合は、代わりにバッファ全体を提供する別の方法がありますか? WとHは、テクスチャの幅と高さがあり、全体のテクスチャがコピーされます

+0

これは逆です: 'glTexSubImage2D'はGPUメモリ内のテクスチャの一部を更新するために使用されず、GPUメモリに画像データバッファの一部をアップロードするために使用されます。 – Steeve

+0

glPixelStoreのGL_PACK_ROW_LENGTHは問題を解決しますか? (GL_PACK_SKIP_PIXELSとGL_PACK_SKIP_ROWS)。あまりにも深く自分自身を掘っていない、したがって答えではなくコメント。 – Columbo

答えて

3

それはデータのみをコピーするのですです

glPixelStorei(GL_UNPACK_ROW_LENGTH, W); 
glPixelStorei(GL_UNPACK_SKIP_PIXELS, offset_x); 
glPixelStorei(GL_UNPACK_SKIP_ROWS, offset_y); 

glTexSubImage2D(target, level, offset_x, offset_y, w, h, format, type, pixels); 

。または、画像の一部(現在の唯一の部分)をアップロードするために多くのメモリを無駄にする必要があります。

P.S.また、ストライドされたデータをサポートしていないことはむしろ痛いことです。したがって、完全なイメージを持っている場合は、それを小さなバッファにコピーせずに、左または右の半分をアップロードすることはできません。

+0

質問のコメントで述べたように、 'glPixelStore'はどんな助けになりますか?データを跨ぐのに使うことはできませんか? – Litty

+0

@Litty可能ですが、私はそれを試みたことはありません。 – BlueWanderer

0

あなたはコール

glTexSubImage2D(target, level, 0, 0, W, H, format, type, pixels); 

で全体の画像データを提供することができ、ピクセルは、W * H配列です。 < Wとoffset_y + Y < Y.画素W offset_x + *はhのアレイwがあるので、w及びhはweigthと変更されたデータの高さであるか、コール

glTexSubImage2D(target, level, offset_x, offset_y, w, h, format, type, pixels); 

でのみ変更されたデータを提供することができます。

編集:ピクセルがWの*のH

+0

後者の例では、 'pixels'は変更されたデータのみを含むべきですか?代わりに画像全体を渡す方法がありますか?そして、この機能が変更されたデータを「チェリーピック」するようにしますか? – Litty

+0

はい。第2の例では、ピクセルは、サイズw * h、w <= Wおよびh <= Hを有する変更されたデータのみを含む。 [glPixelStoref](https://www.khronos.org/opengl/wiki/GLAPI/glPixelStore) –

+0

GL_UNPACK_SKIP_PIXELSとGL_UNPACK_SKIP_ROWSが役に立ちますが、依然としてglTexSubImage2Dを呼び出す必要があります。 –

関連する問題