0

TEXTURE_2D のテクスチャ 2D 配列があります。各描画パスの前にテクスチャのコンテンツをクリアする必要があります。PBO でそれを実行しようとしていますが、INVALID_OPERATION エラーが発生します。

画像の配列を作成する方法は次のとおりです。

glGenTextures(1,&_texID);
glBindTexture (GL_TEXTURE_2D_ARRAY,_texID);
glTexStorage3D(GL_TEXTURE_2D_ARRAY,1,GL_RGBA32F,width,height,numTextures);      
glBindTexture (GL_TEXTURE_2D_ARRAY,0);
glBindImageTexture(0, _texID, 0, GL_FALSE, 0, GL_READ_WRITE, GL_RGBA32F);

これが私がそれをクリアする方法です:

glBindBuffer(GL_PIXEL_UNPACK_BUFFER, clearBuffer);
glBindTexture(GL_TEXTURE_2D_ARRAY, itexArray->GetTexID());
for(int i =0; i <numTextures ;++i) {
    glTexSubImage3D(GL_TEXTURE_2D_ARRAY,1,0, 0, 0, _viewportWidth, _viewportHeight, i , GL_RGBA, GL_FLOAT, NULL);
}
glBindTexture(GL_TEXTURE_2D_ARRAY, 0);

私は numTextures = 8 を持っているので、配列内に 8 つのテクスチャ レイヤーがあります。ループでそれらをクリアし始めると、最初の 4 つはエラーなしでクリアされますが、4 つ目からは INVALID_OPERATION が発生します。

アップデート:

PBO サイズを 2048x2048 から 4096x4096 に拡大することで PBO INVALID_OPERATION 問題を解決しましたが、その結果、テクスチャ配列のテクスチャがまだ適切にクリアされていません。ビューポート内を移動します。

PBO をクリアするためのセットアップは次のとおりです。

GLint frameSize =MAX_FRAMEBUFFER_WIDTH * MAX_FRAMEBUFFER_HEIGHT * sizeof(float);
glGenBuffers(1, &clearBuffer);
glBindBuffer(GL_PIXEL_UNPACK_BUFFER,clearBuffer);
glBufferData(GL_PIXEL_UNPACK_BUFFER,frameSize,NULL,GL_STATIC_DRAW);
//fill the buffer with color:
vec4* data = (vec4*)glMapBuffer(GL_PIXEL_UNPACK_BUFFER,GL_WRITE_ONLY);
memset(data,0x00,frameSize);
glUnmapBuffer(GL_PIXEL_UNPACK_BUFFER);
glBindBuffer(GL_PIXEL_UNPACK_BUFFER, 0);

MAX_FRAMEBUFFER_WIDTH と MAX_FRAMEBUFFER_HEIGHT はどちらも 4096 です

4

2 に答える 2

2

glTexSubImage3D通話が切断されました。

glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 1, 
                0, 0, 0,                              //offset (first image)
                _viewportWidth, _viewportHeight, i,   //size (getting larger)
                GL_RGBA, GL_FLOAT, NULL);

まず第一に、もちろんVasakaは、mipmap レベル1(存在すらしていません) に書き込むべきではないという点で正しいですが、0. しかし、それでもこの呼び出しは、サイズの 3D 画像を_viewportWidth * _viewportHeight * i最初の配列インデックスに配置しようとしますが、これは確かにあなたが望むものではありません。_viewportWidth * _viewportHeight 代わりに、位置のサイズの 2D イメージをクリアしたいとしますi。したがって、呼び出しは実際には次のようになります。

glTexSubImage3D(GL_TEXTURE_2D_ARRAY, 0, 
                0, 0, i,                               //offset (ith image)
                _viewportWidth, _viewportHeight, 1,    //size (proper 2D image)
                GL_RGBA, GL_FLOAT, NULL);

また、必要以上に大きな PBO が必要になるという問題は4、 の計算に a を含めることで簡単に解決できframeSizeます。あなたの PBO は s の 4-vector を含むものとして扱われます (そしてあなたによって説明されます) がfloat、単一の s だけが含まれているかのようにサイズをバイト単位で計算しますfloat。これが、必要に応じて PBO のサイズを 4 倍に適切に増加させるため、2 倍の次元に対して魔法のように機能する理由ですが、サイズ計算でコンポーネント数を忘れるという実際の問題を隠すだけです。

EDIT:ちなみに、0sだけを含む巨大なPBOを維持する代わりに、それぞれの画像レイヤーをFBOにアタッチしてglClear、各ループ反復で単純に実行することもできます。どちらがより効率的かはわかりませんが (glClearイメージ全体のコピーよりも最適化されていると思います)、少なくともこの大きな PBO は時代遅れになります。

于 2013-07-03T15:32:17.583 に答える