OpenGL - FBO和alpha混合

时间:2015-01-30 20:51:53

标签: opengl blend alphablending fbo render-to-texture

我找到了答案,但我无法回答我的问题。

我有FBO,我无法进行alpha混合和多重采样。 FBO将场景绘制到纹理,然后它被淹没到具有两个纹理三角形的默认帧缓冲区。直接绘制到默认的帧缓冲区很好。

这是默认帧缓冲区(顶部)和我的FBO(底部)之间的区别。

enter image description here

我使用带有2x颜色附件和1x深度附件的FBO。 (仅使用GL_COLOR_ATTACHMENT0,其次是其他功能)

深度测试:已禁用

混合:已启用

多重采样:已启用

混合功能:GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA

有什么想法吗?我究竟做错了什么?我不能混合任何透明物体,没有阿尔法。如果您需要更多代码,我可以编辑帖子。

修改

这段代码在代码结构方面更深入,我希望,我能正确地解析它。

设置FBO:

glGenFramebuffers(1, &_framebuffer);
glBindFramebuffer(GL_FRAMEBUFFER, _framebuffer);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, color0_texture_id, 0);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT1, GL_TEXTURE_2D, color1_texture_id, 0);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depth_texture_id, 0);

设置颜色纹理:

glGenTextures(1, &texture_id);
glBindTexture(GL_TEXTURE_2D, texture_id);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_FLOAT, NULL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

除了一行之外,深度纹理是相同的:

// This is probably wrong
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, width, height, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL);

修改

现在混合正在运行,但仍然没有多重采样。怎么做?

1 个答案:

答案 0 :(得分:3)

要在渲染到FBO时使用多重采样,您需要使用glTexImage2DMultisample分配多重采样纹理,并使用GL_TEXTURE_2D_MULTISAMPLE而不是GL_TEXTURE_2D将其附加到FBO。

来源:https://www.opengl.org/wiki/Multisampling#Allocating_a_Multisample_Render_Target