Gra*_*her 26 c++ opengl fbo multisampling
我正在尝试为FBO启用mutlisampling和alpha-to-coverage.使用默认的帧缓冲区,我所要做的就是调用glEnable(GL_MULTISAMPLE)和glEnable(GL_SAMPLE_ALPHA_TO_COVERAGE).但是,我无法使用自己的FBO达到同样的效果.
我的目标:将场景绘制到FBO,就像使用上述属性绘制到默认帧缓冲区一样.从那里我希望能够将图像用作未来通过着色器的纹理.
这适用:制作没有多重采样/ alpha到覆盖的FBO的代码,1种颜色附件,1种深度附件:
// 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);
Run Code Online (Sandbox Code Playgroud)
这不起作用.试图制作多重采样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);
Run Code Online (Sandbox Code Playgroud)
我试过通过OpenGL wiki查看,虽然它不完整(各种未完成的标题使它看起来不专业).glGetError从不抱怨.我试过搞乱这个,但我得到一个黑屏或一个充满垃圾像素的屏幕.
主要问题:为了使多重采样和alpha-to-coverage与FBO一起工作,我需要考虑/改变哪些内容(FBO创建,纹理,着色器)?
And*_*man 27
您需要为此分配一个多重采样深度缓冲区才能正常工作,并为其提供与颜色缓冲区相同数量的样本.换句话说,你应该打电话glRenderbufferStorageMultisample (...)而不是glRenderbufferStorage (...).
你的FBO应该没有完整性检查它现在分配的方式.调用glCheckFramebufferStatus (...)应该返回,GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE因为深度缓冲区只有 1个样本,而颜色缓冲区附件有4个.
由于您还在此FBO中使用多重采样纹理附件,因此您应该了解采样单采样纹理与GLSL着色器中多采样之间的差异.
多重采样纹理具有特殊的采样器统一类型(例如 sampler2DMS),您必须使用其整数(非标准化)纹素坐标和样本索引显式获取纹理中的每个样本texelFetch (...).这也意味着它们不能被过滤或mip映射.
在这种情况下,您可能不希望使用多重采样纹理,您可能希望使用glBlitFramebuffer (...)MSAA解析为单采样FBO.如果您这样做,您可以在着色器中读取消除锯齿的结果,而不必自己获取每个样本并实现抗锯齿.