是否可以使用glBlitFramebuffer将带有RGBA颜色附件的读取帧缓冲区中的alpha组件复制到带有R8颜色附件的draw framebuffer的红色组件?如果没有,你会怎么做?
显然,glBlitFramebuffer并没有使用混合模板。
答案 0 :(得分:1)
执行此操作的唯一方法(不将内存从GPU拉回CPU)是采用某种形式的渲染操作。一个blit无法做到。
如果有compute shader,您可以使用Image Load Store。只需通过view texture绑定源图像和目标图像,然后根据计算着色器的调用索引对它们进行读/写。
然而,通过执行此复制操作,您并不清楚您希望获得什么。如果您只打算从GL_R8
纹理读取作为绑定纹理/图像,那么您需要做的就是创建一个swizzle mask RGBA图像。创建视图的原因是能够为视图提供不同的{{3}}。只需将alpha调整为红色,然后将绿色/蓝色/ alpha设置为0,0,1。
显然,它不会像真正的GL_R8
纹理一样高效地访问。但是你也不必执行可能很昂贵的复制操作。
使用GL 4.5直接状态访问调用:
GLuint alpha_tex;
glCreateTexture(GL_TEXTURE_2D, &alpha_tex);
glTextureView(alpha_tex, GL_TEXTURE_2D, rgba_tex, GL_RGBA8, 0, num_mipmaps(rgba_tex), 0, 1)
GLint swizzleMask[] = {GL_ALPHA, GL_ZERO, GL_ZERO, GL_ONE};
glTexureParameteriv(alpha_tex, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask);