我有一个 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 个被清除而没有错误,但从第四个开始我得到 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