2016-06-10 82 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

相關問題