如何在OpenGL FBO中使用多重采样
我试图为FBO启用mutisampling和alpha-to-coverage。 使用默认帧缓冲区,我所要做的就是调用glEnable(GL_MULTISAMPLE)
和glEnable(GL_SAMPLE_ALPHA_TO_COVERAGE)
。 但是,我无法使用我自己的FBO达到同样的效果。
我的目标是:将场景绘制到FBO,就像使用上面的属性绘制到默认帧缓冲区一样。 从那里我希望能够将图像用作未来穿过着色器的纹理。
这是有效的 :用于制作没有多重取样/ alpha-to-coverage,1个颜色附件,1个深度附件的FBO的代码:
// Generate the color attachment
glGenTextures(1,&defaultColorAttachment0);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D,defaultColorAttachment0);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,screenWidth,screenHeight,0,GL_RGBA,GL_UNSIGNED_BYTE,NULL);
// Bind the texture to the FBO
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, defaultColorAttachment0,0);
// Generate the depth attachment
glGenRenderbuffers(1,&defaultDepthBuffer);
glBindRenderbuffer(GL_RENDERBUFFER, defaultDepthBuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, screenWidth, screenHeight);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, defaultDepthBuffer);
这不起作用 。 试图制作多重采样FBO的代码:
// Generate the color attachment
glGenTextures(1,&defaultColorAttachment0);
glBindTexture(GL_TEXTURE_2D_MULTISAMPLE, defaultColorAttachment0);
glTexImage2DMultisample(GL_TEXTURE_2D_MULTISAMPLE, 4, GL_RGBA, screenWidth, screenHeight, GL_FALSE);
glFramebufferTexture(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, defaultColorAttachment0,0);
// Generate the depth attachment
glGenRenderbuffers(1,&defaultDepthBuffer);
glBindRenderbuffer(GL_RENDERBUFFER, defaultDepthBuffer);
glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, screenWidth, screenHeight);
glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, defaultDepthBuffer);
我已经尝试通过OpenGL wiki来查看,尽管它不完整(各种未完成的标题使它看起来不专业)。 glGetError
从不抱怨。 我试过用这个来搞乱,但是我得到一个黑屏或者一个充满垃圾像素的屏幕。
主要问题:我需要考虑/更改哪些内容以及在哪里(FBO创建,纹理,着色器)以获得多抽样和Alpha到覆盖范围以与FBO一起使用?
您需要分配一个多采样深度缓冲区才能正常工作,并为其提供与您的颜色缓冲区相同数量的采样。 换句话说,你应该调用glRenderbufferStorageMultisample (...)
而不是glRenderbufferStorage (...)
。
你的FBO应该没有完整性检查它现在被分配的方式。 对glCheckFramebufferStatus (...)
调用应返回GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE
因为深度缓冲区只有1个样本,并且您的颜色缓冲区附件有4个 。
由于您在此FBO中也使用了多采样纹理附件,因此您应该了解在GLSL着色器中采样单采样纹理与多采样之间的差异。
多重采样纹理具有特殊的采样器统一类型(例如sampler2DMS
),并且必须使用texelFetch (...)
通过整数(非标准化)纹理texelFetch (...)
坐标和采样索引显式提取纹理中的每个采样。 这也意味着它们不能被过滤或者mip-mapped。
在这种情况下,您可能不希望使用多重采样纹理,您可能需要使用glBlitFramebuffer (...)
将MSAA解析为单个采样的FBO。 如果你这样做,你可以阅读着色器中的反锯齿结果,而不必去获取每个样本并自己实现反锯齿。