2012-02-22 12 views
31

Sto provando a portare l'esempio GLPaint di Apple per utilizzare GLKit. Utilizzando un UIView, è possibile restituire il CAEAGLLayer della vista e impostare DrawableProperties per includere kEAGLDrawablePropertyRetainedBacking. Ciò ha l'effetto di mantenere i contenuti disegnabili dopo aver presentato il buffer di rendering, come previsto. La rimozione di questa proprietà genera uno sfarfallio dopo la chiamata di estrazione con parte del contenuto estraibile che sembra essere disegnato su buffer differenti.GLKView set proprietà selezionabili

Il problema è che questo è esattamente il problema che sto avendo ora nel mio GLKView, ma non sembra essere un modo per impostare le proprietà drawable. Restituire un CAEAGLLayer e impostare le proprietà non ha alcun effetto e non vedo alcuna proprietà rilevante di GLKView per impostare il backing conservato.

Qualcun altro ha trovato questo o ha una soluzione?

+0

Non ho una soluzione, ma sappi che c'è un bug del driver nel nuovo iPad in modalità retina, in cui la modalità di mantenimento non funziona. c'è una discussione e una soluzione qui: http://stackoverflow.com/questions/9753230/ipad-3-opengl-bug-with-keagldrawablepropertyretainedbacking-and-retina –

+0

stai disegnando nel metodo delegate? Stai usando un passaggio chiaro? – nielsbot

+0

Non ricordo di essere onesto. Ho finito per usare solo un CAEAGLLayer ma ho usato GLKit per la matematica delle matrici e il caricamento delle texture. – Brett

risposta

2

Non sono sicuro se questo funzionerà, ma qui è un codice che abbiamo:

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; 

si dovrebbe essere in grado di accedere a eaglLayer.drawableProperties. Speriamo che questo ti permetta di impostare il parametro che desideri.

+0

Grazie per la taglia! – Liron

+0

Questa risposta non funziona per impostare kEAGLDrawablePropertyRetainedBacking (almeno su iPad 3). GLKView sovrascrive le proprietà del layer quando genera il renderBufferStorage dal contesto. Ho pubblicato una risposta qui sotto che ti permette di aggirare questo. – simeon

-2

Ciao Si prega di provare questo

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

Quali sono le nuove informazioni qui? –

8

Se si desidera ottenere kEAGLDrawablePropertyRetainedBacking in un GLKView, aggiungere il seguente categoria al progetto.

@interface CAEAGLLayer (Retained) 

@end 

@implementation CAEAGLLayer (Retained) 

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

@end 

Impostazione dei drawableProperties sul CAEAGLLayer mantenute dal GLKView non funziona perché il GLKView sovrascrive tali proprietà quando si lega la sua drawable e genera il suo stoccaggio rendering. L'uso di questo metodo costringe GLKView a utilizzare invece le proprietà drawable restituite della categoria.

+0

Questo dovrebbe funzionare anche per la lettura del buffer di profondità? Ho provato con e senza questo codice, ma i valori Z letti sono sempre 0? – Bram

7

La risposta di Simeon funziona ma modifica il comportamento per tutte le viste basate su EAGL in un'applicazione. Ho alcuni punti di vista che hanno bisogno del sostegno forzato e altri che non lo fanno, così mi si avvicinò con una soluzione leggermente diversa con la creazione di sottoclassi di GLKView e CEAGLLayer, in questo modo:

@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 

e questo

@interface RetainedGLKView : GLKView 
@end 

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

Ora posso usare RetainedGLKView invece di GLKView per quelle viste in cui voglio forzare un backing conservato.

+0

Grazie, la tua soluzione ha funzionato per me. – lppier

1

Nel GLKView file di implementazione:

- (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; 
} 

Non so come le persone riescono a fare le cose così complicate; è così e solo questo.

Problemi correlati