2013-12-09 66 views
24

我试图为FBO启用mutisampling和alpha-to-coverage。使用默认帧缓冲区,我所要做的就是拨打glEnable(GL_MULTISAMPLE)glEnable(GL_SAMPLE_ALPHA_TO_COVERAGE)。但是,我无法使用我自己的FBO达到同样的效果。如何使用OpenGL FBO多重采样

我的目标:将场景绘制到FBO的方式与使用上述属性绘制到默认帧缓冲区的方式相同。从那里我希望能够将图像用作未来穿过着色器的纹理。

这工作:代码用于制造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); 

这不起作用。代码试图使多重采样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的维基,虽然它不完全(未完成各种标题,使它看起来不专业)。 glGetError从不抱怨。我试过用这个来搞乱,但是我得到一个黑屏或者一个充满垃圾像素的屏幕。

主要问题:我需要考虑/更改哪些内容以及为了获得多重采样和alpha-to-coverage与FBO一起工作而在哪里(FBO创建,纹理,着色器)?

+0

你有没有试过调用glFramebufferTexture2D(GL_FRAMEBUFFER,GL_COLOR_ATTACHMENT0,GL_TEXTURE_2D_MULTISAMPLE,defaultColorAttachment0,0);而不是glFramebufferTexture(GL_FRAMEBUFFER,GL_COLOR_ATTACHMENT0,defaultColorAttachment0,0);? – Jherico

+0

@Jherico是的,我仍然得到一个黑屏。 – GraphicsMuncher

回答

22

您需要分配一个多重采样深度缓冲使其正常工作并给它同一批样品作为你的颜色缓冲区。换句话说,您应该致电glRenderbufferStorageMultisample (...)而不是glRenderbufferStorage (...)

你的FBO应当未能通过完整性检查,现在的分配方式。拨打glCheckFramebufferStatus (...)的电话应返回GL_FRAMEBUFFER_INCOMPLETE_MULTISAMPLE,因为您的深度缓冲区正好是 样本和您的颜色缓冲区附件有。


既然你也在这个FBO使用多次采样质感附件,您应该知道的抽样GLSL着色器多重采样单采样与质感之间的差异。

多重采样纹理有一个特殊采样均匀类型(例如sampler2DMS),你必须明确地获取在纹理由其整数每个样品(非归一化)的纹理像素坐标,并使用texelFetch (...)样本索引。这也意味着它们不能被过滤或者mip-mapped。

在这种情况下,您可能不希望使用多重采样纹理,但您可能希望使用glBlitFramebuffer (...)将MSAA解析为单个采样的FBO。如果你这样做,你可以阅读着色器中的反锯齿结果,而不必去获取每个样本并自己实现反锯齿。

+0

drat,我现在就自己找到了。呃,好吧。 – Jherico

+1

是!这非常有帮助。我现在正在工作!我不得不让另一个FBO将多重采样图像转移到,但没关系。我用颜色缓冲区排列了深度缓冲区(多重采样,RGBA => 32)。非常感谢。 – GraphicsMuncher