Wie kann ich OpenGLES 1.1 (iPhone) verwenden, um eine Textur zu zeichnen, aber nur die Alpha, um etwas Farbe zu zeichnen?
Das Ergebnis sollte genau die gleiche Alpha-Maske sein wie die ursprüngliche Textur, mit einer einzigen Farbe anstelle der ursprünglichen Farben.
Ich verwende glDrawArrays
mit glCoordPointer
und glVertexPointer
.
Ich denke, dass ich zwei Durchgänge gemacht habe, einen mit der Textur und einen mit einer Volltonfarbe. Ich kann einfach nicht die Umkehrung von glBlendFunc(GL_ZERO, GL_ONE_MINUS_SRC_ALPHA);
finden.
Edit: Nach einigem Hinsehen denke ich, dass dies mit glTexEnvf
möglich sein soll. Es geht nur darum, die richtigen Argumente zu finden.
Wie bereits erwähnt, ist glTexEnv der richtige Weg.
Um die RGB-Komponenten Ihrer Textur zu ersetzen und ihr Alpha unberührt zu lassen, könnten Sie so etwas versuchen (dieser Code verwendet Rot als Ersatzfarbe):
%Vor%Hier kommen einige Erklärungen.
Wenn Sie GL_COMBINE verwenden, haben Sie vollständige Kontrolle darüber, wie die Eingabe / Ausgabe der verschiedenen Texturstufen miteinander kombiniert werden. In diesem Fall geben wir an, dass wir die RGB-Komponenten der Texturstufe 0 durch GL_REVIOUS ersetzen wollen, die in diesem Fall eine einzelne Farbe ist (mit glColor4f).
Wir haben nichts Besonderes für die Alpha-Komponente festgelegt, da wir das normale Verhalten wollen. Das Hinzufügen der folgenden Zeilen hätte den gleichen Effekt, als wäre es nicht enthalten (Standardverhalten):
%Vor%Wenn Sie OpenGL ES 2.0 verwenden können, können Sie dies mit einem benutzerdefinierten Fragment-Shader tun. Wenn Sie ein Framework verwenden, das auf 1.1 basiert oder auf Geräte abzielt, die 2.0 nicht unterstützen, ist dies keine große Hilfe. Aber wenn du kannst, so machst du es so:
%Vor%Wenn Sie sicherstellen können, dass die SolidColor einen Alpha-Wert von Null hat, können Sie den Multiplikationsschritt überspringen.
glBlendFunc(source_factor, dest_factor)
bedeutet:
Also glBlendFunc(GL_ZERO, GL_ONE_MINUS_SRC_ALPHA)
ist:
Der zweite Durchlauf (der nicht umgekehrt ist) sollte glBlendFunc(GL_SRC_ALPHA, GL_ONE)
:
, da Sie die Alpha-Maske bereits im ersten Durchgang angewendet haben. Sie müssen jedoch noch herausfinden, wie Sie eine konstante Farbe mit Alpha anstelle der Quelltextur anwenden.
Tags und Links iphone opengl-es cocos2d-iphone