0
是否有可能使用glBlitFramebuffer將讀取幀緩衝區中的alpha分量與RGBA顏色附件複製到具有R8顏色附件的繪製幀緩衝區的紅色分量?如果不是,你會如何做到這一點?glBlitFramebuffer&swizzle
glBlitFramebuffer顯然不使用swizzle掩碼。
是否有可能使用glBlitFramebuffer將讀取幀緩衝區中的alpha分量與RGBA顏色附件複製到具有R8顏色附件的繪製幀緩衝區的紅色分量?如果不是,你會如何做到這一點?glBlitFramebuffer&swizzle
glBlitFramebuffer顯然不使用swizzle掩碼。
執行此操作的唯一方法(無需將內存從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);
感謝您的快速回復很多尼科爾。因爲我不能使用最近的opengl,所以我嘗試使用不同的選項來使用片段着色器:gl_FragColor = texture(samp,tc.xy); 這將採取當前紋理swizzle源,但不採取dest的swizzle。我想我需要在着色器中執行dest swizzle mask:vec4(texture(samp,tc.xy).a)for ex。 – elmarco