glBlitFramebuffer 和 swizzle

glBlitFramebuffer & swizzle

是否可以使用 glBlitFramebuffer 将 alpha 分量从带有 RGBA 颜色附件的读取帧缓冲区复制到带有 R8 颜色附件的绘制帧缓冲区的红色分量?如果没有,你会怎么做?

显然 glBlitFramebuffer 没有使用 swizzle 掩码。

执行此操作的唯一方法(无需将内存从 GPU 拉回到 CPU)是使用某种形式的渲染操作。一个blit做不到。

您可以根据计算着色器的调用索引对它们使用 compute shader, if that's available. Just bind the source and destination images via Image Load Store 和 read/write。

但是,不清楚您希望通过执行此复制操作获得什么。如果您只打算从 GL_R8 纹理读取作为绑定 texture/image,那么您需要做的就是创建一个 view texture of the RGBA image. The reason to create a view of it is to be able to give the view a different swizzle mask。只需将 alpha 调整为红色,然后将 green/blue/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);