2010-06-19 8 views
8

glCopyImage2D nasıl kullanılır

glEnable(texture_2d) 
glBindTexture 
glCopyTexImage2D 
glDisable(GL_TEXTURE_2D); 

gibi bir şey deniyorum glCopyTexImage2D iki görüntüden oluşan bir güçle çalışmaz diye düşünüyorum, bu bir problem; Ayrıca glReadPixels'i denedim, ama amaçlarım için çok yavaş.

+0

Sorun, doku oluştururken mi yoksa daha sonra oluşturuluyor mu, biliyor musunuz? "GlGopyTexImage2D" ve ardından "glGetTexImage" ifadesi "glReadPixels" ile aynı sonucu veriyor mu? (performans nedenleriyle uzun vadeli bir çözüm olarak değil, dokuda neler olduğunu görmek için bir sorun giderme adımı olarak önerilir) –

+0

2'ye kadar güç kısıtlaması için, doku bir güçle ayırmak için 'glTexImage2D 'özelliğini kullanabilirsiniz. -o-2 boyutu ve veri için 'NULL' iletme, sonra gç-of-2 boyutlarına izin veren' glCopyTexSubImage2D'. –

cevap

9

glReadPixels sizin için çok yavaşsa, o zaman glCopyTexImage2D ve glCopyTexSubImage2D çok daha hızlı olmayacaktır. IOS gibi framebuffer nesnelerini destekleyen platformlarda, GPU tarafından oluşturulan görüntü verilerinin bir dokuya alınması için önerilen (yani daha hızlı) yol, bu dokuyu bir framebuffer nesnesinin renk eki olarak kullanması ve doğrudan ona işlenmesidir. Bununla birlikte, eğer hala bu yöntemi takip etmek istiyorsanız, bunu düzeltmek için yapmanız gerekenler aşağıda belirtilmiştir:

İlk olarak, kötü argümanlar glCopyTexImage2D'a geçiyorsunuz. Üçüncü bağımsız değişken olan internalformat, 0 yerine GL_RGBA olmalıdır. glCopyTexImage2D'u aradıktan sonra glGetError'u aradıysanız, muhtemelen GL_INVALID_OPERATION'u kazanmış olursunuz. glCopyTexImage2D ve glCopyTexSubImage2D için OpenGL ES 1.1 sayfalarına bakın.

İkincisi, daha önce gözlemlediğiniz gibi, glCopyTexImage2D, genişlik ve yükseklik bağımsız değişkenlerinin de ikisinin birden olmasını gerektirir. Bununla başa çıkmanın doğru yolu, glTexImage2D kullanarak bir doku görüntüsünü ayırmaktır (pixels için NULL'u buradan geçirebilirsiniz), daha sonra, çerçevebuffer içeriğinizi bir dikdörtgene kopyalamak için glCopyTexSubImage2D kullanın. glCopyTexSubImage2D'un internalformat argümanını almamasına dikkat edin; çünkü dokunun bir alt dikdörtgenini güncellediği için, dokunun mevcut biçimini kullanır.

Kayıt için glGetTexImage, OpenGL ES 1.1 veya 2.0'da mevcut değil, bu nedenle örtülü bir bildirim alıyorsunuz.

+0

Çerçevebuffer nesnelere bakmam gerekiyormuş gibi geliyor ... Teşekkürler – Adam

1

Görüntü kartının ARB_texture_non_power_of_two uzantısını destekliyorsa 2 yaprağın güç kaynağını destekleyip desteklemediğini kontrol edebilirsiniz. See here for info.

0

şey "İki dışı güç" bir sorun olmadığını anlamaya yardımcı olmak için, böyle glGetError'da() kullanın:

printf("error: %#06x\n", glGetError()); 

Kodunuzdaki farklı yerlerde koy emin neyi çizgi yapmak için soruna neden olan, daha sonra burada hata kodunu kontrol: https://www.khronos.org/opengl/wiki/OpenGL_Error

yaptım bir doku kopyalamak için:

glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, TEXTURE_WIDTH, TEXTURE_HEIGHT, 0); 
glGenerateMipmap(GL_TEXTURE_2D); 

dokusunu bağlayıcı sonra. Daha fazla bilgi için bu iki işlevdeki dokümanları kontrol edin.