2012-07-23 12 views
10

[IPAD-3] - [iOS 5.0] - [Objective-C] - [XCode 4.3.3] - [Cocos2D] - [OpenGL | ES 2.0]¿Por qué glBindFramebuffer (GL_FRAMEBUFFER, 0) daría como resultado una pantalla en blanco en cocos2D-iphone?

Estoy aprendiendo cómo utilizar OpenGL | ES 2.0 y han tropezado con objetos Frame Buffer (FBO) s

Info: estoy trabajando con Cocos2D que tiene una gran cantidad de manipulación extra de lujo para el dibujo. Me imagino que esto puede estar relacionado con el problema. Si el frame buffer 'por defecto' para los cocos es diferente de la memoria intermedia de fotogramas predeterminada real que llega a la pantalla, esto podría resultar en un mal dibujar

Mi Problema: en la función init de mi "holamundo. m "clase, si coloco" glBindFrameBuffer (GL_FRAMEBUFFER, 0); " en cualquier lugar, ¡simplemente obtengo una pantalla en blanco!

-(id) init 
{ 
if((self=[super init])) 
{ 

CGSize winSize = [CCDirector sharedDirector].winSize; 

glBindFramebuffer(GL_FRAMEBUFFER, 0); 


CCSprite * spriteBG = [[CCSprite alloc] initWithFile:@"cocos_retina.png"]; 
spriteBG.position = ccp(512,384); 
//[self addChild:spriteBG z:1]; 

[self scheduleUpdate]; 
_mTouchDown = NO; 


_mSprite = [CCSprite spriteWithTexture:_mMainTexture]; 
_mSprite.position = ccp(512,384); 
[self addChild:_mSprite]; 

self.isTouchEnabled = YES; 

} return self;} 

¿Me está faltando algo básico y obvio?

Por lo que he aprendido, la función "glBindFramebuffer (GL_FRAMEBUFFER, 0);" simplemente al establecer el Framebuffer en 0 se aplica el framebuffer predeterminado que se dibuja en la pantalla.

+0

Veo que eres nuevo aquí. ¡Bienvenido! La forma de indicar que su problema ha sido resuelto es aceptar una respuesta, no poner la respuesta en la pregunta y agregar la palabra "Resuelto" al título. Está perfectamente bien publicar y aceptar una respuesta a tu propia pregunta. (Es posible que tenga que esperar unas horas para hacer esto, existen algunas restricciones temporales para los usuarios nuevos.) –

+0

No sabía que la etiqueta (mala) no era una buena etiqueta. Lo he visto tantas veces como este, así que supuse que era como lo hacían por sí mismos. Traté de responderme, 8 horas de espera. y estoy trabajando y no tengo paciencia para tales cosas. Editaré ahora e intentaré nuevamente mañana para hacer la respuesta. si todavía no funciona, entonces simplemente lo dejaré. – JThora

+0

He editado su última línea; como está escrito, implicaba que no tienes una solución para el problema. –

Respuesta

24

El problema es que iOS o Cocos2D (o ambos) pueden tener un framebuffer único. El identificador de ese buffer único de cuadros sería diferente de 0, y puede ser diferente cada vez.

Para resolver esto, tengo que agarrar el mango del FBO actual, hacer mis cosas personalizadas de Framebuffer y luego volver a aplicar el mango del FBO después de que haya terminado.

crea una variable para hacer referencia al objeto Frame Buffer original de

GLint oldFBO; 

Asigna el mango utilizado actualmente de FBO (que es un 'destello') a la variable 'oldFBO'

glGetIntegerv(GL_FRAMEBUFFER_BINDING, &oldFBO); 

//here is when you would create or manipulate custom framebuffers.// 

Después de eso, configura el FBO original como el Framebuf actual fer

glBindFramebuffer(GL_FRAMEBUFFER, oldFBO); 
+1

¡SÍ! ¡Gracias! Esto funciona en Android también. – Tyguy7

+0

Esto me estaba volviendo loco ... ¡Gracias por salvarme! – Matferib

+0

GAH! Perdí medio día a esta idiotez ... muchas gracias por la pista vital. –

Cuestiones relacionadas