2010-12-21 9 views
6

Ich versuche, die avTouch-Beispielcode-App auf dem Retina-Display laufen zu lassen. Hat jemand das getan?openGL ES Retina-Unterstützung

In der CALevelMeter Klasse, ich habe folgendes versucht:

- (id)initWithCoder:(NSCoder *)coder { 
if (self = [super initWithCoder:coder]) { 
     CGFloat f = self.contentScaleFactor; 
     if ([self respondsToSelector:@selector(contentScaleFactor)]) 
     { 
      self.contentScaleFactor = [[UIScreen mainScreen] scale]; 
     } 
     f = self.contentScaleFactor; 

     _showsPeaks = YES; 
     _channelNumbers = [[NSArray alloc] initWithObjects:[NSNumber numberWithInt:0], nil]; 
     _vertical = NO; 
     _useGL = YES; 
     _meterTable = new MeterTable(kMinDBvalue); 
     [self layoutSubLevelMeters]; 
     [self registerForBackgroundNotifications]; 
} 
return self; 

}

und es setzt den contentScaleFactor auf "2". Großartig, das wurde erwartet. Aber dann ist der CALevelMeter-Rahmen in den Layoutsubviews immer noch die Hälfte dessen, was er sein sollte.

Irgendwelche Ideen?

Antwort

11

Frames sind in Punkten, nicht Pixel. Wenn auf den UIView, der den CAEAGLLayer hostet, ein Skalierungsfaktor angewendet wird, sind es doppelt so viele Pixel, aber die Bildpunktgröße bleibt gleich.

Wenn man sich die Trägerbreite und -höhe sucht die Farbe renderbuffer an den CAEAGLLayer angebracht Code wie folgt verwendet:

glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_WIDTH_OES, &backingWidth); 
glGetRenderbufferParameterivOES(GL_RENDERBUFFER_OES, GL_RENDERBUFFER_HEIGHT_OES, &backingHeight); 

Sie sollten sehen, dass die Breite und die Höhe des renderbuffer auf einem Retina-Display sind doppelt so viele Werte wie auf einem Standard-iPhone-Display.

Der Code, den Sie oben zeigen, sollte zu einem schönen, scharfen Rendering auf einem Retina-Display führen.

EDIT (12/22/2010): Als Antwort auf Ihre weitere Frage zeigt der Blick auf den AvTouch-Beispielcode, dass die aktuelle Version dieses Codes einen Fehler beim Nachschlagen der Grenzen der OpenGL-Hosting-Ansicht macht als die Breite und Höhe des Renderpuffers zu verwenden. Mit einem Skalierungsfaktor von nicht-1,0 wird der OpenGL-Inhalt in halber Größe gezeichnet.

Um dies zu beheben, innerhalb _drawView in GLLevelMeter mit dem folgenden Code den entsprechenden Abschnitt ersetzen:

if (_vertical) 
{ 
    glTranslatef(0., _backingWidth, 0.); 
    glScalef(1., -1., 1.); 
    bds = CGRectMake(0., 0., _backingWidth, _backingHeight); 
} else { 
    glTranslatef(0., _backingHeight, 0.); 
    glRotatef(-90., 0., 0., 1.); 
    bds = CGRectMake(0., 0., _backingHeight, _backingWidth); 
} 

Dies alles in dem entsprechenden Pixelraum zu arbeiten verursachen und führt zu machen in der richtigen Größe und gestochen scharfen in der Ausgleicher. Ich habe dazu einen Fehlerbericht eingereicht.

+0

Aber verdoppelt das Retina-Display nicht die Bildgröße, um die höhere Auflösung zu berücksichtigen? Selbst nachdem ich den Code, den ich erwähnt habe, hinzugefügt habe, bekomme ich nur einen Meter, der 1/2 der Höhe ist. Dies ist nur für den openGL-Meter der Fall. Der UIView-Meter funktioniert gut mit der Netzhaut. Ich bin ratlos. – Bryan

+1

@Bryan - Wenn Sie sich den AvTouch-Beispielcode ansehen, scheint Apple einen Fehler bei der Implementierung von '_drawView' in GLLevelMeter gemacht zu haben. Sie verwenden die Grenzen der Ansicht, die in Punkten ist, um Größen von Dingen in OpenGL zu bestimmen, wenn sie stattdessen die Instanzvariablen '_backingWidth' und' _backingHeight' verwenden sollen. Ersetzen Sie die Verweise auf die Größe und Höhe der Begrenzungen durch "_backingWidth" und "_backingHeight". Dies wird auf einem Retina-Display korrekt dargestellt. Ich werde einen Fehlerbericht über den Beispielcode einreichen. –

+0

@Bryan - Ich habe den Code, der innerhalb der Bearbeitung geändert werden muss, auf meine Antwort lokalisiert. –