Application Surface selber drawn führt zu Problemen mit Alpha Werten?

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Application Surface selber drawn führt zu Problemen mit Alpha Werten?

    Hallo,
    ich will meine Application Surface gerne manuell drawn da ich noch diverse Effekte drauf anwenden will und dann im Hintergrund noch ein paar Surfaces zeichnen muss und erst alle Surfaces übereinander + die Application Surface oben drüber ergibt das Endbild

    Aber jetzt steh ich vor einem Problem.

    Wenn ich Sprites mit Pixeln drawe die Alphawerte von >0 aber <1 haben dann werden jetzt einfach die bereits vorhanden Alphawerte der Pixel an der Stelle auf der Application Surface durch den drüber gezeichneten Wert ersetzt!
    Ich hab auf der Application Surface z.b. ein großes untransparentes rechteck gezeichnet und hab noch n objekt das weiter vorne is und das z.b. "durchsichtiges Glas" also z.b. hellblaue Pixel mit 0.3 alpha hat und das wird drüber gezeichnet.
    Aber anstatt dass das Endergebnis das Rechteck mit etwas hellblauer Farbe oben drüber und komplett deckend ist erhalte ich ein Recteck das an der stelle wo das Glas ist transparent ist und ich sehe dann plötzlich durch das Rechteck durch den Hintergrund.

    Also: Wenn ich application_surface_draw_enable aus mache und die application surface selber drawe verhalten sich Alphawerte plötzlich anders und ersetzen sich gegenseitig. Noch schlimmer wirds wenn ich dann auch noch die application surface über eine andere surface drüber drawn will.

    Wie also lasse ich die application surface und allgemein surfaces sich so verhalten wie sich auch normales drawn verhält!? Ihr wisst schon, so wie mans erwartet wenn man z.b. in GIMP mit einem transparenten Pinsel über etwas drüber malt.


    Hab schon verschiedene Sachen ausprobiert und viele Threads gelesen, aber 100%ig geholfen hat leider noch nichts.
    Ich bitte um irgendwelche Ideen, Lösungen oder Denkanstöße mit denen ich mein Projekt nicht verändern muss aber trotzdem alle Surfaces und Sprites übereinander gezeichnet werden können ohne dass sie ihre Alphawerte gegenseitig ersetzen.

    Danke

    - Pac
    Sorm ist Schuld

    Edit: Doch ist er
  • Ich bin kein Spezialist für surfaces, aber für mich klingt das als ob du entweder das zeichenen des Rechtecks damit es ein "Transparenzblau" wird flasch angehst, oder du musst alles auf eine surface über der application sirface drawen und dann eine zweite für diese Transparenzen hernehmen.
    Hast du überhaupt schon getestet ob es funktioniert das ganze auf 2 Surfaces doer eine extra surface zu setzen anstatt alles auf die application surface anzuwenden?

    ancient-pixel.com
    youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)
  • Ich lasse am Ende die einzelnen surfaces zusammen auf eine endsurface drawn und die lass ich dann drawn.

    Eine der einzelnen surfaces is die application surface. Aber nur damit ich nich bei jedem Objekt die targets setzen muss sondern weil ja eh alles auf die application surface gedrawt wird.


    Das Problem taucht nicht auf wenn ich die application surface automatisch zeichnen lasse.

    Das Problem lässt sich reproduzieren indem man einfach mal 2 surfaces übereinander zeichnen lässt und auf der oberen ein sprite mit teilweise transparenten pixeln ist.
    Sorm ist Schuld

    Edit: Doch ist er
  • Also wenns mit 2 Surfaces auch nciht funktioniert, dann setz mal application_surface_draw_enable(false); während du die 2 Surfaces drawest udn schau mal was passiert. Ansonsten hätt ich keinen Plan, aber zeigt vltl mal deinen code her, mitunter ist da was auffälliges zu erkennen.

    ancient-pixel.com
    youtube.com/user/SebastianMerkl <<< ich freu mich über einen Besuch ;)
  • application_surface_draw_enable ist eh ganze zeit false.

    Ich habs nur testweise mal an gemacht und den manuellen draw code auskommentiert.
    Dann wird alles gezeichent wie es soll und die alphawerte werden nicht ersetzt.

    Ist aber keine Lösung für mich weil dann ja die Hintergründe und Effekte fehlen bzw. nicht gezeichnet werden können.
    Sorm ist Schuld

    Edit: Doch ist er
  • Ich hab mal ein example erstellt bei dem ihr sehen könnt was ich meine:
    (Projektfile kommt auch sobald ichs auskommentiert und aufgeräumt hab)

    https://www.dropbox.com/s/cgbi9fwxxolof2t/problem.zip?dl=0
    Sorm ist Schuld

    Edit: Doch ist er

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Pacmangamer ()

  • Um transparenz auf ein Surface zu malen benutze ich

    Quellcode

    1. draw_set_blend_mode_ext(bm_src_alpha, bm_inv_src_alpha);
    2. kurz: draw_set_blend_mode(bm_normal);


    und um das Surface dan zu malen

    Quellcode

    1. draw_set_blend_mode_ext(bm_one, bm_src_alpha_sat);


    vergiss nicht

    Quellcode

    1. draw_clear_alpha(0,0);

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Balls of Steel ()

  • ich habs^^

    Also bevor du dein Application Surface im Draw_GUI zeichnest setz den Blendmode auf

    Quellcode

    1. draw_set_blend_mode_ext(bm_one, bm_src_alpha_sat);


    Ich habe mich oben vertan, naja hab das auch schon vor über nem Jahr das letzte mal gemacht, da darf man sich schon mal vertun.
    Hab dir hier dein... von mir sehr schlampig umgewursteltes gm Testprojekt angehängt, ist aber ganz lustig um die modes durchzuzappen.

    www.ici-minz.de/gm-d/ProblemX.gmz

    Mit den Tasten 1 und 2 veränderst du den Blendmode im Draw Event wo du die einzelnen transparenten Bilder übereinander zeichnest.
    Standardmäßig jetzt auf Blendmode 5 und 6 (bm_src_alpha, bm_inv_src_alpha) eingestellt was dem bm_normal entspricht.

    Mit den Tasten 3 und 4 veränderst du den Blendmode im Draw GUI Event bevor du das Application Surface zeichnest.
    Standardmäßig jetzt auf Blendmode 2 und 11 (bm_one, bm_src_alpha_sat) eingestellt.
    Bilder
    • auto2.jpg

      370,5 kB, 1.472×974, 230 mal angesehen

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Balls of Steel ()

  • Hey dankeschonmal für deine Zeit, aber zwar funktioniert es scheinbar, aber irgendwie werden dann alle draw-calls die vorm drawn der surface, aber im gleichen event, stattfinden "ignoriert", d.h. man sieht sie nicht mehr.

    Du kannst es testen in dem du im Room die draw background color ausmachst oder die farbe änderst und im draw event der hintergrund surface den hintergrund nicht mehr tilest sondern nur einmal zeichnest und bisschen nach unten versetzt.
    Und siehe da plötzlich ist da wo eigentlich blau sein sollte schwarz. :/

    Der überschreibt irgendwie alles was schon vorher da is so komisch.... :(

    Aber in meinem Projekt ist es wichtig dass es so funktioniert. Es gibt einen Hintergrund und einen Vordergrund. Und der Vordergrund besteht eben aus der Application surface und der hintergrund wird gemalt bevor ich die application surface male.
    Sorm ist Schuld

    Edit: Doch ist er

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von Pacmangamer ()