Frage

Ich arbeite an einem Spiel für das iPhone mit einem Zeichnungs-/Lackmechaniker und habe Probleme, ein Tool zu erstellen, das bereits gestrichene Dinge löscht.

Das Hauptproblem ist, dass der Hintergrund, auf das gemalt wird, keine feste Farbe, sondern ein statisches Bild oder eine statische Animation ist. Ich habe versucht, verschiedene Mischoptionen und logische Operationen beim Zeichnen zu verwenden, aber nichts schien zu funktionieren. Ich bin neu bei OpenGL, also muss ich etwas fehlen.

Irgendwelche Tipps?

Bearbeiten: Um ein wenig mehr Informationen zu geben, verwende ich Texturen für meine Pinsel und verwende Glvertexpointer () und GldraWarrays (), um sie zu rendern. Zum Beispiel:

glBindTexture(GL_TEXTURE_2D, circleBrush);
glVertexPointer(3, GL_FLOAT, 0, verts);
glTexCoordPointer(2, GL_FLOAT, 0, coords);
glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

Bearbeiten 2: Leider sind auf dem iPhone keine Schablonenpuffer verfügbar. : (

Bearbeiten 3: FrameBuffer -Objekte sind auf dem iPhone verfügbar und das ist die Straße, die ich übernommen habe. Ich habe es noch nicht vollständig implementiert, aber bisher sieht es so aus, als ob es so funktioniert, wie ich es wollte. Danke an alle!

War es hilfreich?

Lösung

Zeichnen Sie ein Full-Screen-Quad über Ihre Szene. Wenn der Benutzer einen Pinselhub zeichnet, verwenden Sie glTexSubImage2D So aktualisieren Sie Ihre Textur.

Glreadpixel/Gldrawpixel ist langsam.

Die Verwendung von FrambufferObjects ist noch besser, aber ich bezweifle, dass diese Erweiterung auf dem iPhone verfügbar ist (dann weiß ich es nicht genau, also versuchen Sie es vielleicht). Mit FBO können Sie direkt in eine Textur ziehen, als wäre es ein weiterer Rendering -Kontext.

Andere Tipps

Schablonenpuffer ist der beste Weg, um dies sicher zu nähern ... Sie sparen Zeit, CPU und potenzielle Probleme. Sie sind auf dem iPhone verfügbar, Sie müssen nur eine OpenGles 2.0 -Oberfläche erstellen (nicht GLES 1.0 oder 1.1). .

        //Turn off writing to the Color Buffer and Depth Buffer
        //We want to draw to the Stencil Buffer only
        glColorMask(false, false, false, false);
        glDepthMask(false);

        //Enable the Stencil Buffer
        glEnable(GL_STENCIL_TEST);

        //Set 1 into the stencil buffer
        glStencilFunc(GL_ALWAYS, 1, 0xFFFFFFFF);
        glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);

        //CALL YOUR DRAWING METHOD HERE


        //Turn on Color Buffer and Depth Buffer
        glColorMask(true, true, true, true);
        glDepthMask(true);

        //Only write to the Stencil Buffer where 1 is set
        glStencilFunc(GL_EQUAL, 1, 0xFFFFFFFF);
        //Keep the content of the Stencil Buffer
        glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP);

        //CALL OUR DRAWING METHOD AGAIN

Suchen Sie dieses Beispiel:http://www.opengl.org/resources/code/samples/glut_examples/examples/stenciltst.c

Hier ist das visuelle Ergebnis:http://www.opengl.org/resources/code/samples/glut_examples/examples/stenciltst.jpg

Ich habe dieselbe Art von Radiergummi -Tool auf das Android und das iPhone impliziert und es funktioniert wie ein Zauber!

Viel Glück !

Prost !

Sie geben nicht viele Informationen, aber ich gehe davon aus, dass Sie das speichern, was sie in einen Puffer "malen" und ihn dann auf den Bildschirm zeichnen::

 glWindowPos2i(X, Y);
 glDrawPixels(drawing->Width, drawing->Height, drawing->Format, 
              GL_UNSIGNED_BYTE, drawing->ImageData);

Mit Zeichnen-Imagedata ist der Puffer. Was Sie tun könnten, ist einen separaten Hintergrundpuffer zu haben und zuerst zu zeichnen. Anschließend wird das ERASE-Tool einfach den Zeichnungspuffer ausweichen (drehen Sie alle Werte, einschließlich Alpha, ganz nach oben).

Für diese Lösung müssten Sie das Mischen einschalten und Tiefenprüfung ausschalten.

 glEnable(GL_BLEND);
 glDisable(GL_DEPTH_TEST);
 glWindowPos2i(X, Y);
 //background never changes
 glDrawPixels(background->Width, background->Height, background->Format, 
              GL_UNSIGNED_BYTE, background->ImageData);
 glWindowPos2i(X, Y);
 glDrawPixels(drawing->Width, drawing->Height, drawing->Format, 
              GL_UNSIGNED_BYTE, drawing->ImageData);
 glEnable(GL_DEPTH_TEST);
 glDisable(GL_BLEND);

Suchen Sie das?

Sie können den Schablonenpuffer für diesen Vorgang verwenden. Der Schablonenpuffer ist ein spezieller Puffer, der Informationen für jedes Pixel enthält, das dem Tiefenpuffer ähnelt. Im Gegensatz zum Tiefenpuffer entscheiden Sie, wie sich der Schablonenpuffer beim Zeichnen verändert und wie er die Entscheidung beeinflusst, in den Farbpuffer einzuziehen oder nicht. Dazu können Sie die spezifischen Zustände vor einem Zeichenvorgang festlegen. Hier ist was Sie tun:

  • Zu der Zeit ziehen die Benutzer die "gelöschte" Region in den Schablonenpuffer (unter Verwendung von Schablonen, siehe unten). Dafür können Sie jede GL -Zeichenfunktion verwenden.

  • Zeichnen Sie bei jedem Rendering -Pass zuerst den Hintergrund (wenn Sie möchten, können Sie hier einen negativen Schablonentest verwenden, um nur den "gelöschten" Teil des Hintergrunds zu zeichnen - kann die Leistung erhöhen).

  • Aktivieren Sie dann den Schablonentest für alle anderen Zeichenvorgänge. OpenGL zieht dann nur in die "nicht erzeugten" Regionen.

Die Funktion, um festzustellen, wie der Schablonenpuffer das Zeichnen beeinflussen sollte (oder nicht): glSencilfunc ()

Die Funktion, um festzustellen, wie der Schablonenpuffer selbst durch Zeichnen beeinflusst wird: GlStencilop ()

Weitere Erklärung, auch mit den Argumenten für diese:http://www.opengl.org/resources/code/samples/sig99/advanced99/notes/node117.html

Mit GlBLENDFUNC (GL_ONE, GL_ZERO) kann der Modus eingehen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top