Blend mode > Schwarze Farbe

  • GM 8

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

  • Blend mode > Schwarze Farbe

    Hallo Leute! Ich brauch wiedermal euren weisen Rat.

    Es geht um volgendest: Ich habe einen normalen Blendmode. (Schwarzweiß Sprite.) Kennt ihr sicher alle. ;)



    Nun, ich zeichne auf eine Surface (bei der schon was draufgezeichnet wurde) diesen Blendmode mit weißer überblendung. > funktioniert einwandfrei mit bm_add.

    Aber:
    Wie kann ich einen Stinknormalen Blend mode mit SCHWARZER Farbe erzeugen?
    Bei bm_add mit weisser Farbe, entfernt der Blend Mode den Schwarzen Hintergrund und überblendet den Weißanteil mit weisser Farbe. (Rot oder Grün funktioniert genauso.)
    Wie überblende ich dies aber mit Schwarz? Ich habe keinen Plan wie ich das anstellen soll. Habe schon etliches Probiert, nichts funktionierte.

    Wäre dankbar für jeden Rat.
  • das Problem bei bm_subtract ist, dass dann der Inhalt auf der bestehenden Surface gelöscht wird.

    GML-Quellcode

    1. surface_set_target(scr_get_drawing_surface(-3));
    2. draw_set_blend_mode(bm_add);
    3. draw_set_color(c_black);
    4. draw_sprite(scr_get_block_shadingSprite(selected_block_safe),-1,mouse_pos_x + surface_verschiebung,mouse_pos_y);
    5. draw_set_color(c_white);
    6. draw_set_blend_mode(bm_normal);
    7. surface_reset_target();


    Ich weiss dass der Code hier völliger Blödsinn ist, aber das ist momentan mein ausgangspunkt.
    Die Surface auf die der "schwarzgeblendete" blend mode draufgezeichnet werden soll, beinhaltet schon andere "Zeichnungen".
    Wie bekomme ich nun diesen geblendeten Schwarzeffekt da drauf, ohne die Surface negativ zu beeinträchtigen?

    eine Vorläufige Lösung war , die Schwarzen Blendmodes einfach auf eine zweite (leere) Surface weiss zu zeichnen. Dann zeichnete man die Surface einfach mit nem Schwarzen Blendmode auf dem bildschirm (mit draw_surface_ext).
    Diese "Separate" Surface verbrauchte aber mehr V-Ram. Darum will ich den Schwarzen Blendmode gleich auf die bestehende Surface draufzeichnen.

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

  • Ich will einfach das erreichen, dass das Blend mode Sprite wie ein schwarzes "licht" auf die Surface gezeichnet wird.
    (Viele kennen das sicher. Blend mdoes werden häufig für Lampen bzw Lichtquellen verwendet um z.B: einen Scheinwerfer zu basteln.)

    Ich möchte genau so eine Art "glühende Quelle" Blos, dass die Farbe der "Lichtquelle" schwarz ist.

    und dass der Code den ich gepostet habe schwachsinnig ist, ist mir auch bewusst. Ich habe blos keine Ahnung wie ich das zum laufen bekomme. XD
  • das Problem bei bm_subtract ist, dass dann der Inhalt auf der bestehenden Surface gelöscht wird.

    Achso, du willst es also rückgängig machen können? Tja das ist nicht möglich, auch bei bm_add kommt es zu Farbverlust. Stell dir vor die Farbe eines Pixels auf der Surface ist ( 0.5, 0.7, 0.3 ), nun wird ( 0.5, 0.5, 0.5 ) hinzugefügt. Das würde zur Farbe ( 1.0, 1.0, 0.8 ) führen, da die Werte geclampt werden, d.h. sie können ein Maximum nicht überschreiten.
    Wie man sieht haben sich die Relationen verändert, d.h. du musst wohl ein zweites Surface verwenden, damit du das Originale nicht verlierst.

    © 2008 by Teamgrill Productions
  • Ich glaube er meint, dass die Surface nicht mehr sichtbar ist, also komplett durchsichtig ist. Das liegt daran, dass bei bm_subtract (und ebenso bei bm_add) nicht nur die Farbkanäle sondern auch die Alphakanäle subtrahiert (addiert) werden. Bei bm_add hat dies keine Auswirkung, wenn die Grafiken sowieso nicht durchsichtig sind. Ein paar mögliche Lösungen:
    1. Du setzt den Alphakanal deiner sw-Grafik vorher auf 0, indem du beispielsweise ein komplett schwarzes Sprite gleicher Größe erstellst und dieses mittels sprite_set_alpha_from_sprite der sw-Grafik zuweist. Dann ist diese scheinbar "gelöscht", jedoch sind die Farbkanäle noch erhalten. Die neue Grafik mit bm_subtract auf die Surface zeichnen sollte nun den gewünschten Effekt bringen. Sicher lässt sich das ganze auch ohne sprite_set_alpha_from_sprite erreichen, z.B. mit einer zusätzlichen Surface.
    2. Falls dein Surface, auf das die sw-Grafik geblendet werden soll, keine Transparenz enthält, kannst du auch folgendes tun: Zuerst die sw-Grafik mit bm_subtract zeichnen, anschließend mit bm_add über die gesamte Surface ein schwarzes Rechteck mit Alpha 1. Letzteres macht einfach die Surface wieder sichtbar. Aber wie gesagt gehen dadurch eventuelle Transparenzen verloren. Wenn das ein Problem ist, erste Variante verwenden.
  • Also ich erkläre mein Problem genauer: (diesmal mit Grafik)

    Ich habe 1 Surface die Texturen beinhaltet. Auf diese Surface möchte ich einen Blend mode Zeichnen.
    Dieser Blend-Mode soll jedoch eine Art "schwarzes leuchten" verursachen.
    Die Frage ist: Wie kriege ich das hin?

    Hier mal die Grafik was ich meine: (schnell und schlampig gemacht...)



    das gleiche hier:



    Der weißanteil soll sozusagen mit einer Schwarzen Farbe aufgefüllt werden und auf die Surface gezeichnet werden.
  • Ich glaube du verstehst nicht ganz wie Blendmodes überhaupt funktionieren.
    Wenn du ein Sprite, Surface oder was auch immer auf dein Surface zeichnest, wird die finale Farbe für jeden Pixel durch eine bestimmte Operation zwischen den beiden gegebenen Farben berechnet.
    Was du hier beschreibst, schreit nach bm_subtract. Das heißt die Farbwerte von deinem Blendsprite werden von denen auf deinem Surface subtrahiert -> Weiß RGB(1, 1, 1) dunkelt komplett ab, sodass Schwarz entsteht; Schwarz RGB(0, 0, 0) dunkelt gar nicht ab.

    Blackspark hat außerdem darauf hingewiesen, dass auch der Alphachannel der Pixel betroffen ist.

    Und wir wissen immer noch nicht, auf welches Problem du genau mit bm_subtract gestoßen bist. Ich kann mir unter

    dass dann der Inhalt auf der bestehenden Surface gelöscht wird

    nicht wirklich was vorstellen.

    © 2008 by Teamgrill Productions
  • Es stimmt dass ich mich mit Blendmodes nicht gut auskenne.
    Das ist eine der wenigen Sachen die ich im GM noch nciht so richtig beherrsche. (Uund ich nenne mich GML fortgeschrittener. XD)

    Also es traten 2 Probleme auf:
    1. Die Stelle wo ich den Blendmode platzierte wurde komplett gelöscht.
    2. Der Blendmode wurde komplett Schwarz (mit der umrandung) gezeichnet, sodass eine Schwarze Fläche in der größe des Sprites entstand.

    Diese Fehler traten unabhängig voneinander auf. Es kommt darauf an was genau im code drinnenstand.
  • Deinen Lösungsvorschlag habe ich schon probiert, jedoc hhabe ich da ziemlich umständlich gedacht/ gecodet.

    Dein Example ist da ziemlich einleuchtetnd. Ist doch relativ einfach.
    Sry Leute für den umstand. Ich denke sehr oft zu kompliziert. Dabei sind die meisten Sachen recht einfach.
    Habe ebenso Schwerichkeiten beim ausdrücken von Bedürfnissen/Problemen.

    Danke Leute dass ihr eure freie Zeit für mich investiert habt. :thumbup:
  • Oh gott ist mir das peinlich...

    Hätte da noch eine Frage bezüglich des Blend Modes.
    Also: Wenn man dein Example nimmt, und in den Hintergrund (also in die Mauer) und in dese Mauer mit eine Bildbearbeitungsprogramm "löcher" reinschneidet,
    werden beim zeichnen des "scharzen" blendmodes (also im example) die Löcher richtig behandelt > sie bleiben erhalten und der Blendmode wird nicht über sie gezeichnet.

    Möchte ich jedoch einen weißen Blendmode zeichnen, werden diese löcher schwarz aufgefüllt und der Blendmode wird über diese gefüllten Lücken gezeichnet.

    So schaut der code aus:

    GML-Quellcode

    1. s1 = surface_create(256,256);
    2. surface_set_target(s1);
    3. draw_sprite(sprite1,0,0,0);
    4. surface_reset_target();
    5. s2 = surface_create(256,256);
    6. surface_set_target(s2);
    7. draw_sprite(sprite0,0,0,0);
    8. draw_set_blend_mode(bm_add);
    9. draw_surface(s1,0,0);
    10. draw_set_blend_mode(bm_normal);
    11. surface_reset_target();
    Alles anzeigen


    Tut mir wirklich leid für die umstände die ich euch mache. :S

    Hier mal das example mit dem Problem das ich habe:
    Dateien
    • subtract 2.zip

      (187,55 kB, 49 mal heruntergeladen, zuletzt: )
  • LEWA schrieb:

    Oh gott ist mir das peinlich...
    [...]
    Tut mir wirklich leid für die umstände die ich euch mache. :S

    Muss dir nicht peinlich sein oder dir Leid tun. Blend Modes sind wirklich nicht ganz einfach und für Fragen ist das Forum ja da. ;)

    Also erstmal muss ich meine Aussage zurücknehmen, dass bei bm_add einfach alle Kanäle addiert werden. Denn wie ich gerade festgestellt habe wird vorher noch der Alphakanal mit den Farbkanälen multipliziert. Deshalb funktioniert es auch nicht in meinem example einfach das zweite bm_subtract durch ein bm_add zu ersetzen. Folgendermaßen funktioniert es aber:

    GML-Quellcode

    1. s1 = surface_create(256,256);
    2. surface_set_target(s1);
    3. draw_sprite(sprite1,0,0,0);
    4. draw_set_blend_mode(bm_subtract);
    5. // Schwarz, damit die Farbkanäle erhalten bleiben.
    6. draw_set_color(c_black);
    7. // Darf nicht weggelassen werden, da dies den Alphakanal auf 0 setzt.
    8. draw_rectangle(0,0,256,256,false);
    9. draw_set_blend_mode(bm_normal);
    10. surface_reset_target();
    11. s2 = surface_create(256,256);
    12. surface_set_target(s2);
    13. // Wichtig wegen der Löcher.
    14. draw_clear_alpha(c_black,0);
    15. draw_sprite(sprite0,0,0,0);
    16. // Erzeugt den gleichen Effekt wie bm_add.
    17. draw_set_blend_mode_ext(bm_one,bm_one);
    18. draw_surface(s1,0,0);
    19. draw_set_blend_mode(bm_normal);
    20. surface_reset_target();
    Alles anzeigen

    Ich hoffe so wolltest du es.