2016-06-10 20 views
0

是否有可能使用glBlitFramebuffer将读取帧缓冲区中的alpha分量与RGBA颜色附件复制到具有R8颜色附件的绘制帧缓冲区的红色分量?如果不是,你会如何做到这一点?glBlitFramebuffer&swizzle

glBlitFramebuffer显然不使用swizzle掩码。

回答

1

执行此操作的唯一方法(无需将内存从GPU拉回CPU)采用某种形式的渲染操作。 blit不能做到。如果可用,您可以使用compute shader。只需通过Image Load Store绑定源图像和目标图像,并根据计算着色器的调用索引对其进行读写。

但是,目前尚不清楚您希望通过执行此复制操作获得什么。如果您只打算从GL_R8纹理中读取纹理作为绑定纹理/图像,则您只需创建RGBA图像的view texture即可。创建视图的原因是能够给视图提供不同的swizzle mask。只需将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); 
+0

感谢您的快速回复很多尼科尔。因为我不能使用最近的opengl,所以我尝试使用不同的选项来使用片段着色器:gl_FragColor = texture(samp,tc.xy); 这将采取当前纹理swizzle源,但不采取dest的swizzle。我想我需要在着色器中执行dest swizzle mask:vec4(texture(samp,tc.xy).a)for ex。 – elmarco

相关问题