Har*_*rry 0 opengl qt textures texture2d
我正在使用 2D 纹理数组来存储一些数据。由于我经常想要绑定这个 2D 纹理数组的单层,因此我为每个层创建单独的GL_TEXTURE_2D纹理视图:
for(int l(0); l < m_layers; l++)
{
QOpenGLTexture * view_texture = m_texture.createTextureView(QOpenGLTexture::Target::Target2D,
m_texture_format,
0,0,
l,l);
view_texture->setMinMagFilters(QOpenGLTexture::Filter::Linear, QOpenGLTexture::Filter::Linear);
view_texture->setWrapMode(QOpenGLTexture::WrapMode::MirroredRepeat);
assert(view_texture != 0);
m_texture_views.push_back(view_texture);
}
Run Code Online (Sandbox Code Playgroud)
这些 2D 纹理视图工作得很好。但是,如果我想使用该纹理视图从 GPU 端检索 2D 纹理数据,则它不起作用。
换句话说,以下代码不复制任何数据(但不会引发 GL 错误):
glGetTexImage(GL_TEXTURE_2D, 0, m_pixel_format, m_pixel_type, (GLvoid*) m_raw_data[layer] )
Run Code Online (Sandbox Code Playgroud)
但是,检索整个GL_TEXTURE_2D_ARRAY确实有效:
glGetTexImage(GL_TEXTURE_2D_ARRAY, 0, m_pixel_format, m_pixel_type, (GLvoid*) data );
Run Code Online (Sandbox Code Playgroud)
当仅修改单个层的数据时,如果我需要在 2D 纹理数组的所有层之间进行复制,显然会造成性能损失。
有没有办法将 GPU->CPU 仅复制GL_TEXTURE_2D_ARRAY的单层?我知道有相反的情况(即CPU->GPU),所以如果没有的话我会感到惊讶。
看起来您找到了使用glGetTexSubImage()OpenGL 4.5 的解决方案。还有一个适用于 OpenGL 3.2 或更高版本的简单解决方案。
您可以将纹理层设置为FBO附件,然后使用glReadPixels():
GLuint fboId = 0;
glGenFramebuffers(1, &fboId);
glBindFramebuffer(GL_READ_FRAMEBUFFER, fboId);
glFramebufferTextureLayer(GL_READ_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
textureId, 0, layer);
glReadPixels(...);
glBindFramebuffer(GL_READ_FRAMEBUFFER, 0);
Run Code Online (Sandbox Code Playgroud)