Unschöne Ränder, Surfaces-Problem

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

  • Unschöne Ränder, Surfaces-Problem

    Hallo Community,

    ich habe ein Problem welches mich schon länger beschäftigt, und welches ich immer wieder aufs Neue aufgeschoben habe,
    und zwar, dass bei meinen Asteroiden oft unschöne (harte ausgefranste) Ränder entstehen wenn sie vor anderen Objekten sind (besonders beim großen Asteroiden hier zu sehen):



    Mittlerweile habe ich herausgefunden warum es nur die Asteroiden und nicht andere Objekte trifft,
    der Grund ist, sie sind derzeit die einzigen Objekte die via image_angle gedreht werden.

    Ich vermute, dass dadurch interpoliert werden muss (sonst sieht die Drehung nicht hübsch aus), und damit ein Teil des Hintergrundes miteinberechnet wird.
    In dem Fall ist das "Dahinter" die Surface welche ich verwende um den galaktischen Hintergrund (Planeten, Sterne, Nebel, etc.) darzustellen, deshalb scheint der wohl bei den Rändern durch.
    In früheren GMS-Versionen trat der Fehler nicht auf, erst ab 1.3.irgendwas ist es mir dann aufgefallen.

    Die Transparenz der Asteroiden ist entweder 1 oder 0, es gibt keine Stufen dazwischen. Wenn ich einen Asteroiden daher mit ursprünglicher Rotation (image_angle = 0) erstelle,
    dann tritt der Effekt nicht auf und alles ist in Ordnung.

    Eine Lösung wäre vermutlich für jede Hintergrundebene (es gibt 4 Objektebenen welche sich momentan alle eine Surface teilen) eine eigene Surface zu verwenden, ist aber Verschwendung wenn es auch anders gehen würde.

    Kann mir "vormultiplizierte Transparenz" hier helfen? Habe davon gelesen, aber schon

    GML-Quellcode

    1. draw_set_colour_write_enable(true, true, true, false)


    erfolglos ausprobiert (das führt bei mir dazu, dass die Objekte überhaupt nicht dargestellt werden).
    Ist ja eigentlich auch logisch wenn man so darüber nachdenkt.

    Nunja, ich stehe etwas auf der Leitung, wäre dankbar für einen Tipp.^^

    (Achja, ich sollte noch erwähnen, dass dieser unerwünschte Effekt unabhängig von diversen Shadern auftritt.)
  • Werden die Asteroiden auf irgendeine Surface gezeichnet die z.B: als Framebuffer verwendet wird? Oder passiert das auf die übliche Art im Draw-event ohne Surface als Render-target?
    und zwar, dass bei meinen Asteroiden oft unschöne (harte ausgefranste) Ränder entstehen wenn sie vor anderen Objekten sind (besonders beim großen Asteroiden hier zu sehen):

    Meinst du den kleineren helleren der auf der linken seite aufleuchtet, oder der große der fast den ganzen Background ausfüllt? Für mich ist es hier etwas schwer irgendwelche harten Pixelübergänge zu erkennen.
    (Könnte das am Bild liegen, welches im jpeg format abgespeichert wurde? Oder sehe ich das schlicht und einfach nicht?)

    Auch schon den Befehl

    GML-Quellcode

    1. texture_set_interpolation(true);

    ausprobiert?

  • LEWA schrieb:

    Meinst du den kleineren helleren der auf der linken seite aufleuchtet, oder der große der fast den ganzen Background ausfüllt? Für mich ist es hier etwas schwer irgendwelche harten Pixelübergänge zu erkennen.
    (Könnte das am Bild liegen, welches im jpeg format abgespeichert wurde? Oder sehe ich das schlicht und einfach nicht?)

    Oh, ja pardon, ich klassifiziere die größeren Backgrounds aus irgendeinem Grund nicht als Asteroiden, wobei sie das technisch eigentlich sind.
    Also ja, eigentlich meine ich den kleineren welcher sich links befindet und etwas leuchtet.

    texture_set_interpolation(true) ist bei mir standardmäßig an.

    LEWA schrieb:

    Werden die Asteroiden auf irgendeine Surface gezeichnet die z.B: als Framebuffer verwendet wird? Oder passiert das auf die übliche Art im Draw-event ohne Surface als Render-target?

    Die Asteroiden werden sowie fast alle anderen Objekte auf einer eigenen Surface gerendert und nach der Background-Surface ausgegeben (wiederum eigene Surface welche für den Sternenhimmel, Planeten, etc. zuständig ist).
    Diese Background-Surface scheint durchzuscheinen an den Rändern ...

    edit/ Korrektur: Offenbar tritt der Effekt auch dann auf wenn die Asteroiden vor dem Sternenhintergrund dargestellt werden. Blöd, dass mir das erst jetzt auffällt ...

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

  • Ah, warte mal. Ich glaube ich habe das Problem verstanden XD

    Wird der große Asteroid auf die Background Surface gezeichnet oder mitsamt dem kleinen Asteroiden auf die Vorder-surface gerendert?

    Das Problem tritt also nur auf wenn die Sprites gerendert werden?
    Ich nehme daher mal an, dass die Pixel in en Sprites immer nur einen Alphawert von 1 oder 0 besitzen (keine zwischenstufen.)
    Die Transparenz der Asteroiden ist entweder 1 oder 0, es gibt keine Stufen dazwischen.

    Ich nehme daher mal an dass dies für die Pixel giltet und nicht für die gezeichneten Sprites selbst.

    Wenn das so ist, deaktiviere vor dem rendern der Asteroiden die texturinterpolation.

    GML-Quellcode

    1. texture_set_interpolation(false);

    Die Texturinterpolation verursacht beim rotieren "sanfte" pixelübergänge an den Kanten > es entstehen Pixel mit Alphawerten zwischen 0 und 1.

    Wenn sich 2 Asteroiden an der stelle überlappen (wenn also z.B: der große dunkle Asteroid auf die Surface gezeichnet wird und dannach der kleine rotierte asteroid darüber) so überschreiben die Pixel
    des kleinen Asteroiden die Alphawerte der Pixel des goßen Asteroiden (an den jeweiligen zeichenpositionen). > An den Rändern des kleinen Asteroiden sind die Pixel transparent(-er) geworden, wodurch der Background hindurchscheinen kann.
    Das ist so ein generelles Surfaceproblem mit dem man sich herumschlagen muss.

    Hätte der Asteroid von Haus aus weiche Pixelübergänge an den Rändern, würde das Problem noch deutlicher zu sehen sein.

  • LEWA schrieb:

    Wird der große Asteroid auf die Background Surface gezeichnet oder mitsamt dem kleinen Asteroiden auf die Vorder-surface gerendert?

    Beides sind Objekte, werden also auf die vordere Surface gerendert.

    LEWA schrieb:


    Ich nehme daher mal an dass dies für die Pixel giltet und nicht für die gezeichneten Sprites selbst.

    Korrekt. :)

    LEWA schrieb:

    Wenn das so ist, deaktiviere vor dem rendern der Asteroiden die texturinterpolation.

    Done. und siehe da, es funktioniert! :D Und jetzt gehe ich mich schämen dafür, dass mir diese einfache Lösung nicht eingefallen ist.

    LEWA schrieb:

    Wenn sich 2 Asteroiden an der stelle überlappen (wenn also z.B: der große dunkle Asteroid auf die Surface gezeichnet wird und dannach der kleine rotierte asteroid darüber) so überschreiben die Pixel
    des kleinen Asteroiden die Alphawerte der Pixel des goßen Asteroiden (an den jeweiligen zeichenpositionen). > An den Rändern des kleinen Asteroiden sind die Pixel transparent(-er) geworden, wodurch der Background hindurchscheinen kann.
    Das ist so ein generelles Surfaceproblem mit dem man sich herumschlagen muss.

    Jup, das Prinzip habe ich verstanden, nachdem ich bald Objekte mit Transparenz einbauen werde, werde ich mich wohl damit herumschlagen müssen. Aber ich schätze es gibt genug darüber nachzulesen, in den Tech-Blogs, in der Hilfe oder auf gm-d.de.

    Vielen Dank. :)