OpenGL und höhere Auflösung für iPhone 4

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

Macoun 2019 - Frühbucherrabatt bis 26.7.2019

  • Mac & i Test Abo
  • Die einzige Veränderung sind 3 Zeilen im init (initWithFrame: oder initWithCoder: ) deines Views, welcher die CAEAGLLayer enthält:

    Quellcode

    1. if ([UIScreen instancesRespondToSelector:@selector(scale)]) {
    2. self.contentScaleFactor = [[UIScreen mainScreen] scale];
    3. }
    Widgetschmie.de • Life is too short for gadgets
  • Hi,

    Nun gut, ich werde also hier mal meine Fragen stellen =)

    Apples Vorgaben zur Einbindung hochauflösender Grafiken habe ich natürlich befolgt - meine Dateien heißen beispielsweise background.png und background@2x.png, in der EAGLView.m rufe ich zunächst

    Quellcode

    1. if ([UIScreen instancesRespondToSelector:@selector(scale)]) {
    2. self.contentScaleFactor = [UIScreen mainScreen].scale;
    3. }


    und dann

    Quellcode

    1. [context renderbufferStorage:GL_RENDERBUFFER_OES fromDrawable:(CAEAGLLayer*)self.layer];

    auf und die anscließende Ausgabe erfolgt auch entsprechend der angepassten Auflösung. Damit meine ich, dass alte, geringauflösende Grafiken nur noch ein Viertel so groß gerendert werden und angepasste Grafiken in der richtigen Größe. Soweit so gut, dabei gibt es jedoch 2 Probleme:

    (1) Nur ein Viertel des Screens wird gerendert. und (2) Die Grafiken rendern abhängig von Pixel- und nicht Punkt-Abständen. (Soll heißen, ein Bild das ich mit renderAt:(10|10) aufrufe rendert bei Punkt (5|5) )

    Zur Veranschaulichung:
    Das iPhone befindet sich im Landscape Modus. Ich betrachte mal das Hintergrundbild background.png das in 480x320 und in 960x640 vorliegt.
    Versuch 1: ich rendere es in geringer Auflösung am Punkt (0|0)
    -> Ausgabe:
    [IMG:http://dl.dropbox.com/u/7835525/Bildschirmfoto 2010-07-04 um 20.53.31.png]

    Anschließend mit hoher Auflösung an Punkt (0|0)
    -> nur das linke untere Viertel des Bildes wird gerendert:
    [IMG:http://dl.dropbox.com/u/7835525/Bildschirmfoto 2010-07-04 um 21.00.54.png]

    Ein Button, den ich in der rechten oberen Ecke positionieren würde, würde in der rechten oberen ecke dieses Viertel gerendert werden und nicht des Screens, würde aber auf Taps in die rechte obere Ecke des Screens reagieren.

    Ich frage mich nun halt, wo der Fehler in meinem Code liegt. Zum rendern von Images benutze ich die Image-Klasse von 71squared, vielleicht liegt das Problem dort? Ich habe sie mal hier hochgeladen: Image.h, Image.m

    Die EAGLView Klasse liegt hier: EAGLView.h, EAGLView.m

    Es wäre wirklich sehr nett, wenn sich jemand einmal anschauen könnte, wo das Problem liegt, denn ich kriegs einfach nicht gelöst <.<

    Danke,
    Nils
  • Mit der Auflösung hat das denk ich nix zu tun, sondern damit wie Du deine "Ausgabe" einstellst, den Viewport musst Du doch je nach Orientierung des Gerätes mitdrehen

    PHP-Quellcode

    1. glViewport(0, 0, backingHeight, backingWidth);

    und

    PHP-Quellcode

    1. glViewport(0, 0, backingWidth, backingHeight);

    Ist jetzt aus dem Bauch raus, ich hab mir nicht den ganzen Quelltext angeschaut.
  • Das Problem liegt bei dir am OpenGL code und wie du die Position deiner Objekte berechnest; mir fehlt leider die Zeit mich durch den Code zu wühlen. Jedenfalls mappe ich meine Projection Matrix auf die Höhe und Breite des Viewports, und egal ob iPhone 3G, iPhone 4 oder iPad, sieht immer gleich aus.
    Widgetschmie.de • Life is too short for gadgets
  • Pascal schrieb:

    Das Problem liegt bei dir am OpenGL code und wie du die Position deiner Objekte berechnest; mir fehlt leider die Zeit mich durch den Code zu wühlen. Jedenfalls mappe ich meine Projection Matrix auf die Höhe und Breite des Viewports, und egal ob iPhone 3G, iPhone 4 oder iPad, sieht immer gleich aus.

    Ist wohl genau das, was ich schon gesagt habe ;)