2009-05-21 22 views
2

Ich nahm das Beispiel von GLPaint ... Ich versuche, einen Hintergrund in die "PaintingView", so dass Sie über den Hintergrund zeichnen und schließlich speichern das Bild als Datei ..... Ich bin verloren.iPhone: Textur größer als 64x64?

Ich bin Laden der PNG (512x512) und versuchen zu „malen mit ihm“ ganz am Anfang des Programms, aber es ist als 64x64 statt 512x512 gemalt ...

Ich habe versucht, bevor zu laden als Unteransicht der Malansicht ... aber dann funktioniert glReadPixels nicht wie erwartet (es berücksichtigt nur die PaintingView, nicht die Subview). Auch die PaintingView hat keine Methode als initWithImage ... Ich brauche glReadPixels arbeiten an dem Bild (und in der Modifikation), aber ich weiß wirklich nicht, warum, wenn ich es laden, hat die Textur eine 64x64 Größe.

Antwort

0

Erstens, glReadPixels() wird nur sehen, welcher Framebuffer zu Ihrem aktuellen OpenGL-Kontext gehört. Das könnte erklären, warum Sie nicht die Pixel erhalten, die Sie erwarten.

Zweitens, was meinst du mit der Textur wird bei einer bestimmten Pixelgröße gerendert? Ich gehe davon aus, dass die Textur als Quadrupel gerendert wird, und dann sollte die Größe dieses Quads code-weise unter Ihrer Kontrolle stehen.

Überprüfen Sie auch, dass das Laden der Textur keine OpenGL error erzeugt, ich bin mir nicht sicher, was die iPhone-Beschränkungen für Texturgrößen sind. Es ist durchaus denkbar, dass 512x512 außerhalb der Reichweite liegt. Sie könnten dies natürlich selbst untersuchen, indem Sie glGetIntegerv() anrufen und die Konstante GL_MAX_TEXTURE_SIZE verwenden.

2

Das GLPaint-Beispielprojekt verwendet GL_POINT_SPRITE, um beim Bewegen des Pinsels Kopien der Pinselstruktur zu zeichnen. Auf dem iPhone ist die glPointSize auf 64x64 Pixel beschränkt. Dies ist eine Hardwarebegrenzung, und im Simulator denke ich, dass Sie es größer machen können.

Es klingt, als ob Sie versuchen, eine GL_POINT_SPRITE-Methode zu verwenden, um Ihr Hintergrundbild zu zeichnen, und das ist wirklich nicht das, was Sie wollen. Versuchen Sie stattdessen, eine flache, strukturierte Box zu zeichnen, die den Bildschirm ausfüllt.

Hier ist ein bisschen OpenGL-Code, der für ein 2D-Feld Ecken und texcoords einrichtet und dann zieht es:

const GLfloat verticies[] = { 
     0.0f, 0.0f, 
     1.0f, 0.0f, 
     0.0f, 1.0f, 
     1.0f, 1.0f, 
    }; 

    const GLfloat texcoords[] = { 
     0, 0, 
     1, 0, 
     0, 1, 
     1, 1, 
    }; 

    glVertexPointer(2, GL_FLOAT, 0, verticies); 
    glEnableClientState(GL_VERTEX_ARRAY); 
    glTexCoordPointer(2, GL_FLOAT, 0, texcoords); 
    glEnableClientState(GL_TEXTURE_COORD_ARRAY); 
    glEnable(GL_TEXTURE_2D); 

    glBindTexture(GL_TEXTURE_2D, texture); 
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); 

Hoffnung, das hilft! Beachten Sie, dass Sie die Scheitelpunkte abhängig von der Kameraprojektion unterschiedlich festlegen müssen. In meinem Fall habe ich meine GL_MODELVIEW mit dem folgenden Code eingerichtet - ich bin mir nicht sicher, wie das GLPaint-Beispiel es macht.

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
glOrtho(0, 1.0, 0, 1.0, -1, 1);