pixelfragmente bem skalieren von texturen (C++, directx9)



  • Hallo,

    ich habe folgendes Problem:
    Ich bin dabei ein kleines 2D Spielchen mit directx9 un C++ zu realisieren.

    Aufeiner .png Datei habe ich mehrere Texturen.
    Nun kommt es jedoch vor das wenn ich Texturen größer skaliere, am rand ein hauchdünner weißer streifen entsteht, der aber hundertpro nicht auf der Textur vorhanden ist.

    kann ich bei der Texturerstellung, bzw. dem skalieren irendwie verhindern das solche Fagmene entstehen?

    Vielen Dank!



  • Der weisse Rand wird vermutlich daher kommen, dass im PNG neben dem Bildausschnitt den du als Textur verwenden willst etwas liegt was vollständig transparent ist.
    (Bzw. wenn da selbst nen weissen Rand um die Grafik rumgemalt hast, ist sowieso klar dass der Rand bei skalierter/rotierter Ausgabe sichtbar wird)

    Viele Programme "optimieren" die Bilder beim Abspeichern dann so, dass für 100% transparente Teile als Farbe immer Weiss gespeichert wird (im Speicher hat ja jeder Pixel eine Farbe, auch wenn er über den Alpha-Kanals 100% transparent gemacht wird).
    Wenn man Texturen macht kann das natürlich ordentlich nerven.

    Für Tiles:

    Du kannst entweder die Texturkoordinaten im Shader zurechtstutzen. Für Texturen die immer "Axis-Aligned" gezeichnet werden sollte das reichen. Wenn die Textur am Bildschirm rotiert erscheint, könnte es am Rand ... komisch aussehen. In dem Fall hilft es vermutlich wenn du jeder Kachel-Textur einen kleinen "Rand" verpasst, so dass auch knapp ausserhalb der eigentlichen "Nutzfläche" das Bild noch ein wenig weitergeht. Damit da beim Interpolieren "passende" Farben stehen. Bei Tiles die "kachelbar" sind z.B. einfach ein paar Pixel vom gegenüberliegenden Rand drankopieren.

    Für Sprites mit Alpha-Kanal:

    Zieh die Farbe die du am Rand des Objekts hast hinaus in den durchsichtigen Bereich, und verwende zum Bearbeiten/Speichern ein Programm welches die Farbe auch in 100% transparenten Bereichen unverändert abspeichert.
    Laut unseren Grafikern macht Photoshop Probleme wenn man als PNG abspeichert (transparent = Weiss), wenn man dagegen als TGA speichert lässt er die Farben von transparenten Pixeln unverändert. (Wenn man die TGAs mit einem geeigneten Programm dann in PNG umwandelt, "funktioniert" auch das PNG noch)

    EDIT
    ps: wenn dir nicht klar sein sollte, wieso überhaupt Texel ausserhalb des definierten Rechtecks hergenommen werden, guck dir mal das an:
    http://msdn.microsoft.com/en-us/library/windows/desktop/bb219690(v=vs.85).aspx
    (EDIT2: hah, Microsoft hat die MSDN gefixt. Der Link oben sieht zwar scheisse aus, aber funktioniert jetzt endlich mal. :-))
    Da geht's zwar um was anderes, aber es sollte mMn. reichen um zu verstehen was abgeht.

    Der Knackpunkt ist: beim Interpolieren der UV Koordinaten entstehen Positionen die zwar innerhalb des definierten Rechtecks liegen, allerdings so weit "aussen" dass bei der Interpolation ("Texturfilterung") Texel hergenommen werden die gerade ausserhalb des definierten Rechtecks liegen.

    Wenn dann z.B. der Texel innerhalb des gewünschten Bereichs Farbe Rot und Alpha = 1 (100% undurchsichtig) hat, und der Nachbar hat Farbe Weiss und Alpha = 0 (100% durchsichtig), und beide werten zu 50% geblendet, dann kommt Farbe = Rosa und Alpha = 0.5 raus.
    Das 100% durchsichtige Weiss wird also sichtbar.



  • vielen Dank für Deine Rückmeldung.

    Warum diese Ränder entstehen war mir im "groben" klar. Aber danke nochmal für die genaue Erklärung.

    Ich arbeite mit transparenten texturen. Also habe zum Beispiel einen roten Kreis auf einer Transparenten Basis. Wenn ich dann den den Kreis "ausschneide" entsteht das Problem.
    Wusste nicht das Photoshop da Probleme mit Transarenz hat, das benutze ich nämlich.

    (Wenn man die TGAs mit einem geeigneten Programm dann in PNG umwandelt, "funktioniert" auch das PNG noch)

    Hast Du einen Vorschag? Welches Programm? 🙂

    Vielen Dank, hast mir schonmal sehr geholfen!


Anmelden zum Antworten