2012-04-03 12 views
3

Ich habe gerade einen Renderer für meine Cross-Plattform-Framework (iOS und Android) mit OpenGL es gestartet. Als ich zu den Viewport-Sachen kam (was für Splitscreen-Sachen benötigt wird) und bemerkte, dass es einen Unterschied zwischen iOS und Android gibt. Hier sind zwei Bilder.glViewport anderes Ergebnis in Android und iOS

Android Es gibt tatsächlich einen anderen Fehler. Es scheint sich zu wickeln.

Android quarter sized viewport

iOS

iOS quarter size viewport

Meine Frage. Welcher der beiden ist richtig? Ich habe keine Transformationen angewendet, aber eins, um das gezeichnete Quad etwas zurückzubringen. glTranslatef (0.0f, 0.0f, -5.f);

Initialisation Code:

glEnable(GL_TEXTURE_2D); 
glShadeModel(GL_SMOOTH);   //Enable Smooth Shading 
glClearColor(0.f, 0.f, 0.f, 1.0f); //Black Background 
glClearDepthf(1.0f);     //Depth Buffer Setup 
glEnable(GL_DEPTH_TEST);   //Enables Depth Testing 
glDepthFunc(GL_LEQUAL);    //The Type Of Depth Testing To Do 

//Really Nice Perspective Calculations 
glHint(GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST); 

Ansichtsfenster und Projektcode

glViewport(viewportX, viewportY, viewportW, viewportH);. 

glEnable(GL_SCISSOR_TEST); 
glScissor(viewportX, viewportY, viewportW, viewportH); 

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 

... Und schließlich die frustrum berechnet und festgelegt glFrustrum.

float widthH = width * .1f; 
float heightH = height * .1f; 
glOrthof(-widthH, widthH, -heightH, heightH, .1f, 100.f); 
glScalef(widthH, heightH, 1.f); 

Vielleicht Android oder iOS hat es etwas von Standard: Ich habe diesen Code auch verwendet? Ich bin ahnungslos.

Antwort

6

Beantworten meiner eigenen Frage für diejenigen, die das gleiche Problem haben.

Ich benutze GLKView, die scheinbar den glViewport bei jedem Render-Aufruf ruft, zurücksetzen, was ich gerade im vorherigen Frame getan habe. Wenn Sie also GLKView verwenden, stellen Sie sicher, dass Sie glViewport für jeden Frame aufrufen! ... oder rolle dein eigenes EAGLView, um eine echte Kontrolle zu haben, von der ich denke, dass ich es bin.

0

Das sieht so aus, als würden Sie den Skalierungsfaktor des iOS-Geräts nicht berücksichtigen. Denken Sie daran, dass die neuesten iOS-Geräte Retina-Displays mit einem extrem hohen ppi haben. Sie können dieses Artefakt unten links auf dem iOS-Screenshot sehen. Es zeigt nur die unteren 25% Ihrer Textur, weil die gesamte Ansicht einen Skalierungsfaktor von 2 hat.

Kurz gesagt, stellen Sie sicher, dass Sie die scaleFactor auf iOS Konto und verwenden Sie diesen Faktor in Ihrem glScalef Anruf.

+0

Ich verwende den iPhone Simulator ohne das Retina Display. Die iOS-Version sieht genau so aus wie die Version meiner App mit einem Ansichtsfenster von (1,1). Ich füge ein Bild des Vollbild-Ansichtsfensters hinzu. Der Quad ist immer noch auf den Bildschirm zentriert und nicht auf das Ansichtsfenster wie in der Android-Version. Skalierung wird das nicht lösen. – WoutervD

+0

Der Simulator maskiert sich als Retina-Bildschirm. Dieses Problem ist offensichtlich ein Skalierungsproblem. Untersuche die beiden Grafiken und sieh zu, dass die iOS-Version + 200% skaliert ist. – Sam

+0

Sehr seltsam. Ich benutzte auch den Scheren-Test, der das wahre Problem verdeckte. glViewport funktionierte überhaupt nicht, zumindest nicht dort, wo ich es benutzt habe. Es funktioniert jetzt gut. Habe noch ein paar GlClear-Probleme, aber ich werde sie bald aussortieren. Trotzdem danke, dass du auf das Skalieren hingewiesen hast. Als iOS gibt mir eine Größe von 480, 320 sogar mit Netzhaut an. Welches ist ein Problem. Die Sache ist. Das Zeug ist kleiner, wenn ich nicht für die Netzhaut verantwortlich bin. Scheint so, als müsste ich etwas anderes verwenden, als die richtige Auflösung zu finden ... oder sie selbst zu multiplizieren. self.view.bounds.größe.width, self.view.bounds.size.height – WoutervD

Verwandte Themen