Silhouette Shader umgekehrt

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

  • Silhouette Shader umgekehrt

    Hi,

    kennt jemand von euch den Silhouette Shader auf YoYo Games.com --> yoyogames.com/blog/382 ?
    Gibt es eine Möglichkeit den so umzukehren, das nur das Reine Bild ( ohne einer anderen Farbe wie bei SILHOUETTES ) in der " Wand " angezeigt wird und das alles was außerhalb der " Wand " ist unsichtbar ist? Hab schon zum teil rum probiert und das Problem erkannt , das bei diesen Shaders nur RGB Farben funktionieren. Gibt es eine Möglichkeiten das wie auf z.B. "Image Blend" umzuschreiben? Hab nämlich bis jetzt noch nie Shader gebraucht und weiß deshalb auch nur zum Teil wie die so richtig funktionieren...



    Sollte jemand den Dowload Button suchen --> yoyogames.com/downloads/misc/R…e-quarters-silhouette.gmz
  • Hi,
    Abgesehen vom Silhouetten Tutorial, kannst du das auch so machen, dass du dein Sprite auf ein Surface drawst und über draw_set_blend_mode(bm_subtract); alle Gegenstände, die das eigentlich verdecken sollten, alles wegradieren lassen.
    Wenn man jetzt das Surface drawt, sieht es einfach nur so aus, als wenn das Objekt immer unter/hinter den Gegenständen her läuft.
    Jetzt nimmt man aber dieses Surface und behandelt es, wie eben, als ein Gegenstand und radiert damit alles von einem neuen Surface weg.
    Ist so eine Art von ausstanzen. Du hast eine sagen wir mal Metallform (dein Sprite/Objekt). Mit der stanzt du eine andere Form aus. Auf der Muss nichts besonderes sein. Und mit der ausgestanzten Form stanzt du das Gesamtbild, wovon du nur die Form deines Sprites haben willst aus.
    Tutorial auf Englisch

    Bild vom Tutorial:


    Ich hoffe das war halbwegs verständlich ^^
    Ein Bug ist mehr als nur ein Bug, es ist ein... Käfer!
    Egal, wie gut du eine Mauer baust, sie fällt um.... der klügere gibt nach :D

    Willst du mit mir auf Discord Chatten/Quatschen?
    Meine Husi's Tutorial Reihe
  • Im Tutorial steht ja auch ein Beispiel code, aber ich mache gerade einen aus dem Gedächnis.
    Nicht getestet und so.
    Create:

    GML-Quellcode

    1. sf1 = -1; //Surface Id auf -1 setzen. Im Draw Event bekommt sf eine richtige Id. (Ist, damit man einen kleinen Code nicht mehrmals schreibt)
    2. sf2 = -1; // 2. Ist für das ausstanzen des ausgestanzten

    Draw:

    GML-Quellcode

    1. if(!surface_exists(sf1)) //Wenn Surface nicht existiert (Passiert ganz zu Anfangs, weil sf auf -1 ist und wenn man zum Beispiel das Fenster minimiert, da dann das Surface aus dem VRam geschmissen wird)
    2. sf1 = surface_create(room_width,room_height);//Erstelle ein Surface und speicher es in sf1 ab
    3. if(!surface_exists(sf2))
    4. sf2 = surface_create(room_width,room_height);//Erstelle ein Surface und speicher es in sf2 ab
    5. surface_set_target(sf1); //Anfangen in sf1 etwas herein zu zeichnen
    6. draw_self(); //Hier alles Drawen, was ausgestantzt werden soll
    7. draw_set_blend_mode(bm_subtract); //Wegradieren aktivieren
    8. with(obj_gegenstand){ //Alles Drawen was oben (dass ausgestanzt werden soll) ist mit diesem zeichnen wegradieren
    9. draw_self();
    10. }
    11. draw_set_blend_mode(bm_normal); //Wegradieren ausschalten (sehr wichtig, sonst error)
    12. surface_reset_target();
    13. surface_set_target(sf2); //In sf2 etwas herein zeichnen
    14. draw_self(); //Alles was zu sehen sein soll, wenn es unter dem Gegenstand war. (Wie oben das selbe)
    15. draw_set_blend_mode(bm_subtract); //Jetzt wieder wegradiermodus aktivieren
    16. draw_surface(0,0,sf1); //1. Surface zeichnen um dann das ausstanzen umzukehren
    17. draw_set_blend_mode(bm_normal);
    18. surface_reset_target();
    19. draw_surface(0,0,sf2); //Ergebnis drawen
    Alles anzeigen

    Das ganze kann ein paar mehr Fehler enthalten. Ich habe mit Surfaces noch nicht so viel gemacht und wende nur das an, wie ich das ganze selber verstanden habe ^^
    Ein Bug ist mehr als nur ein Bug, es ist ein... Käfer!
    Egal, wie gut du eine Mauer baust, sie fällt um.... der klügere gibt nach :D

    Willst du mit mir auf Discord Chatten/Quatschen?
    Meine Husi's Tutorial Reihe

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

  • Wusste ich's doch, dass ich dieses Thema noch nicht so leicht aus dem Kopf schreiben kann :)
    Hast du ein Screen?
    Ein Bug ist mehr als nur ein Bug, es ist ein... Käfer!
    Egal, wie gut du eine Mauer baust, sie fällt um.... der klügere gibt nach :D

    Willst du mit mir auf Discord Chatten/Quatschen?
    Meine Husi's Tutorial Reihe
  • Kann sein, dass in meinem Code noch ein Fehler ist, aber pack mal den Code im Draw Gui. (Probier da nochmal, wo du die Wände gesehen hast)
    Ich glaube nämlich, dass die Wände den einfach wieder verdecken.
    Ein Bug ist mehr als nur ein Bug, es ist ein... Käfer!
    Egal, wie gut du eine Mauer baust, sie fällt um.... der klügere gibt nach :D

    Willst du mit mir auf Discord Chatten/Quatschen?
    Meine Husi's Tutorial Reihe
  • ich weiß ja nicht genau, wie du das ganze haben willst, aber als test kannst du bei draw_self direkt nach dem surface_set_target mal draw_surface(0,0,application_surface) machen
    Ein Bug ist mehr als nur ein Bug, es ist ein... Käfer!
    Egal, wie gut du eine Mauer baust, sie fällt um.... der klügere gibt nach :D

    Willst du mit mir auf Discord Chatten/Quatschen?
    Meine Husi's Tutorial Reihe
  • Hätte es wohl besser erklären sollen ^^

    Also wenn das Objekt in den Bereich des Gegenstands ist wird es vollständig angezeigt, wenn es aber den Rand kommt wird es immer kleiner (also ausgestanzt).
    Kommt es nun aber wieder zurück wird es immer mehr sichtbarer(bis hin zur voller Sichtbarkeit) wie man in den Bild sehen kann.
    Bilder
    • Bild.png

      20,06 kB, 1.920×988, 430 mal angesehen