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 です