2013-01-04 11 views
6

Ich arbeite an einer Handschrift-Anwendung auf iOS. Ich habe das Beispielprojekt "GLPaint" aus der iOS-Dokumentation gefunden, das von OpenGL ES implementiert wurde, und ich habe etwas daran geändert.Wie vermeidet man Transparenzüberlappungen mit OpenGL?

ich die Berührungspunkte verfolgen und die Kurven zwischen den Punkten berechnen und Partikelbilder allein die Kurve ziehen, um es wie, wo der Finger Passby zu machen sieht.

Was ich bekam, ist eine durchgezogene Linie, die ziemlich gut aussieht. Aber jetzt möchte ich halbtransparentes Highlight anstelle von durchgezogener Linie zeichnen. Also ersetze ich das Partikelbild durch eine 50% ige Transparenz, ohne den Code zu ändern.

Result of 50% transparency particle image

Result of 50% transparency particle image

Es ist etwas falsch mit Mischung.

What I need

What I need

I zeichnen drei Punkte, die die Halbtransparenz Teilchenbild verwenden und Kreuzungsbereich sollte 50% Transparenz halten.

Was ist die Lösung?

+1

Das Problem besteht darin, dass Sie den Overdraw eliminieren müssen, der mit "Just Blending" nicht möglich ist. Sie könnten Tiefenpuffer (mit Alpha-Test) verwenden, aber das wird nicht richtig Antialias. Wenn Sie möchten, dass dies richtig antialiased ist, ist das nicht trivial, um richtig zu werden, zumindest nicht im allgemeinen Fall. Sie müssten zuerst einen zusätzlichen Framebuffer rendern und in einem zweiten Durchgang zusammensetzen. – Damon

+0

Danke für Ihre Antwort. Ich bin ein Neuling für OpenGL, ich bin immer noch nicht klar über die meisten Konzepte in OpenGL. Ich denke, Antialias ist nicht das Problem. Könnten Sie bitte den Code mit weiteren Einzelheiten angeben? –

Antwort

6

Im vielleicht 2 Jahre später beantworten diese Frage, aber ich hoffe, es ist jemand, der hierher kommt hilft, dieses Problem eine Lösung gesucht, wie es mir passiert ist.

Sie werden auf jeden cirle einen anderen z-Wert zuweisen müssen. Es spielt keine Rolle, wie groß oder klein dieser Unterschied ist, wir brauchen sie nur, um nicht genau gleich zu sein.

Zuerst deaktivieren Schreiben Sie in den Farbpuffer glColorMask(false,false,false,false), und dann in der Regel die Kreise zeichnen. Der Z-Puffer wird wie gewünscht aktualisiert, aber es werden noch keine Kreise gezogen.

Dann aktivieren Sie das Schreiben in den Farbpuffer (glColorMask(true,true,true,true)) und setzen Sie die depthFunc auf LEQUAL (glDepthFunc(GL_LEQUAL)). Nur die nächsten Kreis Pixel wird die Tiefenprüfung bestehen (Einstellung es anstelle von EQUAL beschäftigt sich mit einigen selten, aber möglich Gleitkomma Approximationsfehler LEQUAL). Wenn Sie das Mischen und Zeichnen erneut ausführen, wird das gewünschte Bild ohne Transparenzüberlappung erstellt.

+0

Wirklich danke für deine Antwort. Noch eine Frage. Was meinst du mit "anderen z-Wert zuweisen"? Ist das die dritte Dimension der Koordinate oder der Z-Pufferwert? Tut mir leid, wenn diese Frage wenig Sinn macht, ich bin ein Neuling für opengl. –

+0

Beides gleichzeitig! Innerhalb der Shader steuern die X- und Y-Koordinaten die Position auf dem Bildschirm jedes Eckpunkts (-1 bis 1) und die Z-Koordinate steuert die Tiefe (0 zu 1, wobei 0 näher ist). Diese Tiefe ist diejenige, die mit dem Z-Puffer verglichen wird - wenn der Z-Puffer in diesem Pixel einen geringeren Wert hat, bedeutet dies, dass bereits ein Pixel näher zur Kamera gezogen ist, so dass das Fragment verworfen wird. Wenn also jeder Kreis eine andere Z-Koordinate hat, wird nur ein Fragment pro Pixel nicht verworfen (das nächstgelegene zur Kamera), so dass die Überblendung erfolgreich ist. – Ivelate

+0

Sie könnten verwirrt sein, da wir in den meisten Fällen eine Koordinatentransformation innerhalb des Vertex-Shaders mithilfe von Transformationsmatrizen anwenden. Sie haben also ein Anfangs-X, Y, Z für einen Eckpunkt und es wird in eine andere Position transformiert, um es an der Kamera oder was auch immer auszurichten, sodass das vom Shader verwendete echte Z nicht das ursprüngliche Z Ihres Eckpunkts sein kann. Es ist ein wenig kompliziert zu erklären, ob Sie neu in OpenGL sind, daher empfehle ich Ihnen dringend, dieses Tutorial zu lesen (bis zum "Tiefen- und Schablonen" -Teil), https://open.gl/, es hat mir sehr geholfen, als ich anfing. Zögern Sie nicht, mich mehr zu fragen, wenn Sie brauchen! – Ivelate

Verwandte Themen