OpenGL - FBO 和 alpha 混合

OpenGL - FBO and alpha blending

我正在寻找答案,但我的问题找不到答案。

我有 FBO,但无法使用 alpha 混合和多重采样。 FBO 将场景绘制到纹理,然后将其淹没到带有两个纹理三角形的默认帧缓冲区。直接绘制到默认帧缓冲区就可以了。

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

我使用带有 2 个颜色附件和 1 个深度附件的 FBO。 (仅使用GL_COLOR_ATTACHMENT0,第二个用于其他功能)

深​​度测试:已禁用

混合:已启用

多重采样:已启用

混合函数:GL_SRC_ALPHA、GL_ONE_MINUS_SRC_ALPHA

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

编辑:

这段代码的代码结构比较深,我希望,我提取得当。

设置 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);

编辑:

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

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

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