2012-02-22 6 views
31

Estoy tratando de portar el ejemplo GLPaint de Apples para usar GLKit. Usando un UIView, es posible devolver CAEAGLLayer de la vista y establecer drawableProperties para incluir kEAGLDrawablePropertyRetainedBacking. Esto tiene el efecto de retener los contenidos dibujables después de presentar el buffer de renderización, como se esperaba. Al eliminar esta propiedad, se produce un parpadeo después de la llamada al sorteo y parte del contenido dibujable se dibuja aparentemente en diferentes búferes.GLKView establece las propiedades dibujables

El problema es que este es exactamente el problema que ahora tengo en mi GLKView, pero no parece haber una manera de establecer las propiedades dibujables. Devolver un CAEAGLLayer y establecer las propiedades no tiene ningún efecto y no veo ninguna propiedad relevante de GLKView para establecer el respaldo retenido.

¿Alguien más ha encontrado esto o tiene una solución?

+0

no tengo una solución, pero tenga en cuenta que hay un error del controlador en el nuevo iPad en modo Retina, donde el modo de respaldo retenido se desordena por completo. hay una discusión y una solución alternativa aquí: http://stackoverflow.com/questions/9753230/ipad-3-opengl-bug-with-keagldrawablepropertyretainedbacking-and-retina –

+0

¿Está dibujando en el método delegado? ¿Estás usando un paso claro? – nielsbot

+0

No recuerdo ser honesto. Terminé usando solo CAEAGLLayer pero utilicé GLKit para la carga matemática de la matriz y la textura. – Brett

Respuesta

2

No estoy seguro si esto va a funcionar, pero aquí hay un código que tenemos:

GLKView * const view = (GLKView *)self.view; 
view.context = self.context; 
view.delegate = self; 
view.drawableColorFormat = GLKViewDrawableColorFormatRGBA8888; 
view.drawableDepthFormat = GLKViewDrawableDepthFormat24; 
view.drawableMultisample = GLKViewDrawableMultisampleNone; 
self.preferredFramesPerSecond = 30; 

[EAGLContext setCurrentContext:self.context]; 
CAEAGLLayer * const eaglLayer = (CAEAGLLayer*) view.layer; 
eaglLayer.opaque = YES; 

usted debería ser capaz de acceder a eaglLayer.drawableProperties. Con suerte, eso te permite establecer el parámetro que deseas.

+0

¡Gracias por la recompensa! – Liron

+0

Esta respuesta en realidad no funciona para configurar kEAGLDrawablePropertyRetainedBacking (al menos, en iPad 3). GLKView sobrescribe las propiedades de capa cuando genera el renderBufferStorage a partir del contexto. He publicado una respuesta a continuación que te permite solucionar esto. – simeon

-2

Hola Por favor, intente éste

GLKView * const view = (GLKView *)self.view; 
view.context = self.context; 
view.delegate = self; 
view.drawableColorFormat = GLKViewDrawableColorFormatRGBA8888; 
view.drawableDepthFormat = GLKViewDrawableDepthFormat24; 
view.drawableMultisample = GLKViewDrawableMultisampleNone; 
self.preferredFramesPerSecond = 10; 

[EAGLContext setCurrentContext:self.context]; 
CAEAGLLayer * const eaglLayer = (CAEAGLLayer*) view.layer; 
+1

¿Cuál es la información nueva aquí? –

8

Si desea obtener kEAGLDrawablePropertyRetainedBacking en un GLKView, agregue la siguiente categoría a su proyecto.

@interface CAEAGLLayer (Retained) 

@end 

@implementation CAEAGLLayer (Retained) 

- (NSDictionary*) drawableProperties 
{ 
    return @{kEAGLDrawablePropertyRetainedBacking : @(YES)}; 
} 

@end 

Ajuste de los drawableProperties en la CAEAGLLayer mantenidos por el GLKView no funciona debido a que el GLKView sobrescribe esas propiedades cuando se une a su estirable y genera su almacenamiento render. El uso de este método obliga al GLKView a usar en su lugar las DrawableProperties devueltas de su categoría.

+0

¿Funcionaría esto también para leer el búfer de profundidad? Intenté con y sin este código, pero los valores de Z leídos son siempre 0? – Bram

7

La respuesta de Simeon funciona pero cambia el comportamiento de todas las vistas basadas en EAGL en una aplicación. Tengo algunos puntos de vista que necesitan el respaldo forzado y otras que no lo hacen, por lo que se me ocurrió una solución ligeramente diferente mediante la creación de subclases de GLKView y CEAGLLayer, así:

@interface RetainedEAGLLayer : CAEAGLLayer 
@end 

@implementation RetainedEAGLLayer 
- (void)setDrawableProperties:(NSDictionary *)drawableProperties { 
    // Copy the dictionary and add/modify the retained property 
    NSMutableDictionary *mutableDictionary = [[NSMutableDictionary alloc] initWithCapacity:drawableProperties.count + 1]; 
    [drawableProperties enumerateKeysAndObjectsUsingBlock:^(id key, id object, BOOL *stop) { 
     // Copy all keys except the retained backing 
     if (![key isKindOfClass:[NSString class]] 
     || ![(NSString *)key isEqualToString:kEAGLDrawablePropertyRetainedBacking]) 
      [mutableDictionary setObject:object forKey:key]; 
    }]; 
    // Add the retained backing setting 
    [mutableDictionary setObject:@(YES) forKey:kEAGLDrawablePropertyRetainedBacking]; 
    // Continue 
    [super setDrawableProperties:mutableDictionary]; 
    [mutableDictionary release]; 
} 
@end 

y esto

@interface RetainedGLKView : GLKView 
@end 

@implementation RetainedGLKView 
+ (Class)layerClass { 
    return [RetainedEAGLLayer class]; 
} 
@end 

Ahora puedo usar RetainedGLKView en lugar de GLKView para aquellas vistas en las que quiero forzar un respaldo retenido.

+0

Gracias, su solución funcionó para mí. – lppier

1

En su GLKView archivo de implementación:

- (id)initWithCoder:(NSCoder *)aDecoder 
{ 
    if ((self = [super initWithCoder:aDecoder])) 
    { 
     _eaglLayer = (CAEAGLLayer *)self.layer; 

     _eaglLayer.opaque = TRUE; 
     _eaglLayer.drawableProperties = @{ kEAGLDrawablePropertyRetainedBacking : [NSNumber numberWithBool:NO], 
              kEAGLDrawablePropertyColorFormat  : kEAGLColorFormatRGBA8}; 

    } 
    return self; 
} 

No sé cómo las personas logran hacer las cosas tan complicadas; es así, y solo esto.

Cuestiones relacionadas