2013-12-09 99 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