OpenGL + Farbe zu Transparenz

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

  • OpenGL + Farbe zu Transparenz

    Ich wollte mal fragen, ob jemand einen einfachen Weg weiß, wie man eine bestimmte Farbe in einer Textur transparent bekommt?
    Ich habe derzeit dieses Bild (s14.directupload.net/file/d/2897/mjouqppg_png.htm) und möchte dass die schwarzen Flecken transparent werden, damit ich das korrekte Bild erhalte, das so aussehen sollte: s14.directupload.net/file/d/2897/9nb4jx29_png.htm..

    Ich habe schon diverse Kombinationen von glBlendFunc probiert, doch ohne Erfolg.
    Zuletzt hatte ich versucht, die Pixel Daten in RGBA Format auszulesen und dann durchzugehen und die Farbe, die ich transparent haben will, durch die gleiche mit einem AlphaWert von 0 zu ersetzen und danach das Bild aus diesen geänderten Farben neu zu erstellen. Doch dann kommt solch Pixel Müll dabei heraus, dieses Bild s14.directupload.net/file/d/2898/udvaoejs_png.htm.
    Weiß jemand Rat?
  • Ja, das Format ist BGRA und die Tiefe 32 Bit.
    Das originale Tileset ist transparent, besitzt also einen Alpha Kanal.
    Da dieses Bild sehr groß ist, generiere ich mir ein kleineres Bild, das nur die benötigten Tiles enthält, per SDL und übergebe danach die Pixel an die Textur.

    Die Create Methode, die das kleinere Bild erstellt in das dann die benötigten Tiles kopiert werden:


    Quellcode

    1. Surface Create(ushort width, ushort height, ubyte deepth) { this.Free();
    2. this._surface = SDL_Check(SDL_CreateRGBSurface( 0, width, height, deepth, 0, 0, 0, 0 ));
    3. return this;}
  • Es liegt imo nicht an der SDL wie ich nun denke heraus gefunden zu haben.
    Ich habe das ganze mal als kleines Bsp. nachgebaut. Solange die Tiles komplette Grafiken sind, also komplette RGB Pixel enthält, passt alles. Aber sobald ich Tiles verwende, die eig. transparent sein sollen (also einen Alpha Kanal haben) wird das nicht korrekt gerendet, sondern ich erhalte einen schwarzen Rahmen.
    Hier mal zu sehen: s1.directupload.net/file/d/2906/vb58zq3f_png.htm
    Und hier ist mal das Original Tileset: s14.directupload.net/file/d/2899/2662a3wu_png.htm
    Man muss etwas scrollen, findet dann aber diese "Eingänge" die in meinem Bild schwarz umrandet sind. Im original Tileset sind diese transparent. Dies wird aber nicht übernommen. Weiß jemand Rat?
    Blending habe ich schon versucht, bin aber auf Grund von Erfahrungsmangel kläglich gescheitert. :/
    Den Erstellungscode poste ich sonst gerne hier, auch den Rendercode wenn benötigt. Ich verwende einen VBO und zerschneide das Original Tileset auf der Suche nach den Tiles die wirklich gebraucht werden, damit das Bild was ich beim Rendern binde, damit der VBO seine Pixel erhält, so klein wie möglich ist.
  • Nachdem abändern der SubSurface Funktion (mit der ich die Tiles ausschneide) von

    Surface SubSurface(const Rect rect = null) const {
    if (rect is null) {
    return this.GetCopy();
    }

    Surface copy = new Surface();
    copy.Create(rect.Width, rect.Height, 32);

    assert(copy.CountBits() == 32);

    copy.Blit(this, null, rect);

    return copy;
    }

    in

    Surface SubSurface(const Rect rect = null) const {
    if (rect is null) {
    return this.GetCopy();
    }

    Surface copy = new Surface();
    copy.Create(rect.Width, rect.Height, 32);

    assert(copy.CountBits() == 32);

    copy.Fill(Color.White); // <-- auffüllen mit weiß statt schwarz, wie es automatisch geschieht.

    copy.Blit(this, null, rect);

    return copy;
    }

    Und dem hinzufügen der Blend Funktion

    Quellcode

    1. glBlendFunc(GL_SRC_ALPHA, GL_SRC_COLOR);


    Bekomme ich nun schon einmal dieses Bild: s1.directupload.net/file/d/2907/yjf5tfj3_png.htm
    Also schon fast das, was ich möchte, die schwarzen Rändern sind weg. Jedoch schimmern jetzt wirklich alle unteren Tiles durch, wie man besonders bei dem roten Weg (was eine Blutbahn darstellen soll) sieht, da dort an den Rändern die darunter liegenden Tiles etwas sichtbar sind.
    Inwiefern muss ich die Blending Funktion abändern, damit die schwarzen Ränder weg bleiben, aber ich dennoch nicht einen derartigen Durchschein Effekt habe?
    Habe auch schon

    Quellcode

    1. GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA
    probiert, jedoch ist dann alles weiß, also ich sehe gar nichts mehr von meiner Karte.
  • Das sieht jetzt eher danach aus als, ob du ein neues Bild erstellst, diese Weiß färbst und darin dein Teilausschnitt reinkopierst (wobei an dieser Stelle die Transparents verloren geht) und dann mit einem Semitransparentemmodus über die anderen Tiles zeichnest.

    Kannst du nicht dein Surface mit durchsichtig initialisieren, bzw mit transparent füllen.

    Quellcode

    1. copy.Fill( Color(0,0,0,255) );


    Was für Engine benutzt du, ist das SDL Objektorientierung? Dazu find ich wie keien Docs.

    Mfg Rushh0ur