Overlay Color Blend in OpenGL ES / iOS / Cocos2d
Ich bin versucht, BlendModes, um ein Graustufen-Bild um wiederverwendbare statische Ressourcen
Ich habe die Suche im internet für Stunden, und ich habe meine eigenen tests, aber ich fand keine Lösung.
Ich begann mit diesem Bild:
Und die grundlegende Idee war es, ziehen Sie ein Rechteck über Sie in einer bestimmten Farbe, und wenden Sie eine Füllmethode, um das Bild nur dort, wo der alpha ist 1.0
Hier ist der Code (das ist ein Teil der Cocos2d Projekt, obwohl ich denke, es kann angewendet werden auf generische OGL N):
-(void)draw
{
[super draw];
glBlendColor(0,255,0,255);
glBlendFunc(GL_ZERO, GL_SRC_COLOR);
glColor4ub(255, 0, 255, 255);
glLineWidth(2);
CGPoint vertices2[] = { ccp(0,100), ccp(100,100), ccp(100,0) };
[ DrawingHelper drawPolygonWithPoints:vertices2 points:3 closePolygon:YES];
}
*Zeichnen Helfer ist die Logik zum zeichnen des Dreiecks.
+(void)drawPolygonWithPoints:(CGPoint *)poli points:(int)points closePolygon:(BOOL)closePolygon
{
glDisable(GL_TEXTURE_2D);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glDisableClientState(GL_COLOR_ARRAY);
glVertexPointer(2, GL_FLOAT, 0, poli);
if( closePolygon )
glDrawArrays(GL_TRIANGLE_FAN, 0, points);
else
glDrawArrays(GL_LINE_STRIP, 0, points);
glEnableClientState(GL_COLOR_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnable(GL_TEXTURE_2D);
}
Und hier einige Ergebnisse:
Wie Sie sehen können, ist eine gute Annäherung, aber diese beiden Bilder hat Fehler:
OpenGL Fehler 0x0502 in -[EAGLView swapBuffers]
Meine Fragen sind:
- Wie kann ich die entfernen, oder diesen Fehler beheben?
- Wie kann halten nur die alpha-Version von der Bild (Schirm) und wenden Sie die Mischung overlay-Farbe?
[Update]Dies ist ein Beispiel von dem, was ich möchte (mit dem richtigen Mischungen):
- Können Sie fügen Sie bitte eine "bearbeitete" Bild, was Sie sich wünschen? Wenn ich mit Künstlern arbeiten ist es viel einfacher zu arbeiten, eine shader-oder postprocessing-filter, die aus einer photoshop Datei mit allen Ebenen, als eine textuelle Beschreibung. Sie wissen, ein Bild → 1000 Worte.
- Done @datenwolf, Hoffe es hilft.
- Ein Wort der Vorsicht, wenn Ihre Absicht ist, zu verwenden, dass die banner in Ihrer app: die Fahnen der ein football-team sind Marken. Sie können nicht verwenden Sie in irgendeiner Weise, die Sie wünschen. Zum Beispiel wäre es sehr wahrscheinlich ein Verstoß gegen Markenrecht die Verwendung der banner in einer Weise, dass Ihre app wirbt, oder macht es den Anschein, offizielle, oder etwas ähnliches. Einige fair use " gelten kann, zum Beispiel die Anzeige der Liga-Ergebnisse mit team-Banner in einer Sport-app, aber auch dies kann der Genehmigung durch die FIFA, die UEFA oder andere organisation.
- Nein, das ist nur die Prüfung Vermögenswerte 🙂 vielen Dank für die Beratung @LearnCocos2D
- Gut, Los dann. 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das klingt wie eine Bewerbung für den alpha-Test. Nur, dass habe ich als erstes zeichnen Sie das Rechteck und dann den alpha-test scheitern gleich 1.0 (oder größer als 0,99 ist, zu ermöglichen einen gewissen Spielraum). Dies erfordert nicht mischen.
Bearbeiten aktualisierte Frage
Gewünschten Ergebnisse:
Ich denke, Sie verwechseln Multiplizieren und Überlagern Beschriftungen dort oben.
In allen denjenigen Fällen geschieht dies entweder
glEnable(GL_ALPHA_TEST); glAlphaFunc(GL_GEQUAL, 0.995);
//nicht mit 1.0 für einige Margeoder
glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
Die Effekte sind nicht von der Einstellung der blend-Funktion oder den Modus, sondern durch die textur-Umgebung oder shader.
Den "Overlay" (eigentlich multiplizieren) Wirkung entspricht der GL_MODULATE textur-environment-Modus. Oder in Bezug auf eine shader -
gl_FragColor = texture2D(...) * color;
."Erleichtern" ist
min(texture2D(...), color);
"Multiplizieren" (eigentlich im overlay) ist
gl_FragColor = 1. - (1.-color*texture2D(...))*(1.-color);
"Weiches Licht" ist
gl_FragColor = (1. - (1.-texture2D(...))*(1.-color))*k + b;
(k und b gewählten Parametern).((base.r < 0.5) ? (2.0 * base.r * overlay.r) : (1.0 - 2.0 * (1.0 - base.r) * (1.0 - overlay.r))),...
ich bin versucht, eine overlay-textur mit transparenten und semi-transparenten Pixel und das Ergebnis ist in diesen Regionen fast schwarz. Irgendwelche Ideen?discard
das fragment.