2009-04-19 28 views
7

Oluşturduğum ve daha sonra glReadPixels() kullanarak okuduğum bir renk ve derinlik ekine sahip bir FBO nesnesine sahibim ve çok örnekleme desteğine eklemeye çalışıyorum. glRenderbufferStorage()

Yerine glRenderbufferStorageMultisampleEXT(), hem renk eki hem de derinlik eki için arıyorum. Çerçeve arabellek nesnesi başarıyla oluşturuldu ve tam olarak bildirilmiş gibi görünüyor.
Oluşturduktan sonra glReadPixels() ile okumaya çalışıyorum. Numune sayısı 0 olduğunda, yani çoklu örnekleme devre dışı bırakır, mükemmel çalışır ve istediğim resmi alırım. Örneklerin sayısını başka bir şeye ayarladığımda, 4 deyin, çerçeve arabelleği hala Tamam ama glReadPixels() bir INVALID_OPERATIONFBO'dan glReadPixels çoklu örnekleme ile başarısız oluyor

ile başarısız olur Burada neyin yanlış olabileceği hakkında bir fikriniz var mı?

DÜZENLEME: glReadPixels kod:

glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, ptr); 

burada genişlik x yükseklik uints bir dizi ptr işaret eder.

+0

sen (vs, biçim, tip) sizin glReadPixels() çağrısı için tam bir çizgi gönderebilir miyim? –

cevap

23

GlReadPixels() ile çok örnekli bir FBO'dan okuyabileceğinizi sanmıyorum. Multisampled FBO'dan normal bir FBO'ya bloke etmeniz, normal FBO'yu bağlamanız ve ardından normal FBO'dan pikselleri okumanız gerekir. Böyle

şey: bir GL_INVALID_OPERATION hatası getireceğini beri

// Bind the multisampled FBO for reading 
glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, my_multisample_fbo); 
// Bind the normal FBO for drawing 
glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, my_fbo); 
// Blit the multisampled FBO to the normal FBO 
glBlitFramebufferEXT(0, 0, width, height, 0, 0, width, height, GL_COLOR_BUFFER_BIT, GL_NEAREST); 
//Bind the normal FBO for reading 
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, my_fbo); 
// Read the pixels! 
glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, pixels); 
+0

"Çoklu örneklemden okuyabileceğinizi sanmıyorum" - Bunun için herhangi bir referans var mı? – shoosh

+2

Buradan başlıyorsunuz (aşağıya doğru ilerleyin): http://www.opengl.org/wiki/GL_EXT_framebuffer_multisample –

+0

'my_fbo' başlangıçta nasıl başlamalı? –

1

Sen glReadPixels doğrudan multisample tampon okuyamaz. GPU'nun bir alt örnek yapabilmesi için başka bir yüzeye karıştırmanız gerekir. Backbuffer'a karışabilirsin, ama "piksel sahibi gemi testi" problemi var. Başka bir FBO yapmak en iyisidir. Başka bir FBO yaptığınızı ve şimdi de bloke olmasını istediğinizi varsayalım. Bu GL_EXT_framebuffer_blit gerektirir. Genellikle, sürücünüz GL_EXT_framebuffer_multisample'i desteklediğinde, GL_EXT_framebuffer_blit'i, örneğin nVidia Geforce 8 serisini de destekler.

//Bind the MS FBO 
glBindFramebufferEXT(GL_READ_FRAMEBUFFER_EXT, multisample_fboID); 
//Bind the standard FBO 
glBindFramebufferEXT(GL_DRAW_FRAMEBUFFER_EXT, fboID); 
//Let's say I want to copy the entire surface 
//Let's say I only want to copy the color buffer only 
//Let's say I don't need the GPU to do filtering since both surfaces have the same dimension 
glBlitFramebufferEXT(0, 0, width, height, 0, 0, width, height, GL_COLOR_BUFFER_BIT, GL_NEAREST); 
//-------------------- 
//Bind the standard FBO for reading 
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fboID); 
glReadPixels(0, 0, width, height, GL_BGRA, GL_UNSIGNED_BYTE, pixels); 

Kaynak: GL EXT framebuffer multisample

İlgili konular