Grüner Rand bei transparenten Bildern aufgrund GL_LINEAR



  • Dann mach halt 'nen Alphakanal mit weichem Übergang.

    Bye, TGGC (Demo or Die)



  • TGGC schrieb:

    Dann mach halt 'nen Alphakanal mit weichem Übergang.

    Bye, TGGC (Demo or Die)

    Wie meinst du das? Bzw. wie geht das?

    mfg.



  • Du kannst schon einen gewissen Spielraum von Grün auf Transparent umzeichnen, nur besteht dann die Gefahr, dass Teile des restlichen Bildes auch plotzlich Transparent werden.
    Wenn du so scharf drauf bist, kannst du dir ja auch einen Algorithmus ausdenken, der grüne Flächen erkennt und am Rand von diesen den Grünanteil durch einen Transparenzanteil ersetzt. Nein, ich habe keine Tutorials dazu, aber im Prinzip sehe ich da eine Verwandtschaft mit Umwandlung von Rastergrafik in Vektorgrafik, genannt Tracing. Kannst dich ja in diese Richtung schlau machen. Da gibts auch Open Source Projekte zu.
    Oder du machst es dir einfach und speicherst das Bild schon mit Transparenz ab, wie von TGGC vorgeschlagen.

    LG Chocko

    PS:
    Heute mein Abendgebet:
    Lieber Gott, wenn es einen offensichtlichen, einfachen Weg gibt, lass die Leute ihn nehmen weil sie sich bewusst sind, dass es auch so kompliziert genug wird.
    SCNR 😉



  • ChockoCookie schrieb:

    Oder du machst es dir einfach und speicherst das Bild schon mit Transparenz ab, wie von TGGC vorgeschlagen.

    Hä??? Wo ist der Unterschied zu dem was ich mache??? Opengl bekommt einen Array mit den Daten und ich glaube nicht, dass es Opengl interessiert, ob der Alphakanal nachträglich hinzugefügt wurde, oder schon beim laden vorhanden war. WICHTIG: Mit Laden mein ich, die Bitmap informationen in einen array zu laden. Da hat Opengl noch gar nichts zu tun. Erst wenn ich den Alphakanal hinzugefügt habe, kriegt opengl die bilddaten. Also ist es so zusagen das gleiche als wären sie schon von Anfang an im Bild. Deswegen kann ich mir es nicht einfach machen, wie von TGGC vorgeschlagen.

    ChockoCookie schrieb:

    Wenn du so scharf drauf bist, kannst du dir ja auch einen Algorithmus ausdenken, der grüne Flächen erkennt und am Rand von diesen den Grünanteil durch einen Transparenzanteil ersetzt.

    Am Rand von den grünen Flächen, ist kein grün mehr. Also GRÜN -> KEINGRÜN. Es ist ein ganz harter übergang. Und im Array was ich OpenGL gebe, ist kein einziger Pixel grün drinn, der nicht alphakanal 0 hat. Also kann ich auch keinen Grünanteil durch transparens ersetzen, weil überhaupt kein grünanteil da ist.

    mfg.



  • WTF??? Was willst du eigentlich?
    Ich geb's auf.



  • ChockoCookie schrieb:

    WTF??? Was willst du eigentlich?
    Ich geb's auf.

    Ich möchte Bitmaps in OpenGL zeichnen, wo alles was grün ist transparent ist ohne grünen rand. Außerdem möchte ich dabei nicht auf GL_LINEAR verzichten.

    Hier ist mein Code:
    http://joomoo.g2host.de/lesson20-1.zip
    Wenn du die exe ausführst, siehst du mein problem.

    mfg.



  • Also mit der exe kann ich nix anfangen, habe Linux. Aber ich denke ich weis jetzt woran's liegt:

    for(int i=BildGroesse;i>0;i--)
    {
    
      TextureTemp[4*i-4] = TextureImage[loop]->data[3*i-3]; // R
    
      TextureTemp[4*i-3] = TextureImage[loop]->data[3*i-2]; // G
    
      TextureTemp[4*i-2] = TextureImage[loop]->data[3*i-1]; // B
    
      if(TextureImage[loop]->data[3*i-3] == 0
    
           &&TextureImage[loop]->data[3*i-2] == 255
    
           &&TextureImage[loop]->data[3*i-1] == 0)
    
      {
    
        TextureTemp[4*i-1] = 0; // A
    
      }
    
      else
    
      {
    
        TextureTemp[4*i-1] = 255; // A
    
      }
    
    }
    

    wird zu

    for(int i=BildGroesse;i>0;i--)
    {
    
      TextureTemp[4*i-4] = TextureImage[loop]->data[3*i-3]; // R
    
      TextureTemp[4*i-3] = TextureImage[loop]->data[3*i-2]; // G
    
      TextureTemp[4*i-2] = TextureImage[loop]->data[3*i-1]; // B
    
      if(TextureImage[loop]->data[3*i-3] == 0
    
           &&TextureImage[loop]->data[3*i-2] == 255
    
           &&TextureImage[loop]->data[3*i-1] == 0)
    
      {
    
        TextureTemp[4*i-1] = 0; // A
        TextureTemp[4*i-2] = 0;
        TextureTemp[4*i-3] = 0;
        TextureTemp[4*i-4] = 0;
    
      }
    
      else
    
      {
    
        TextureTemp[4*i-1] = 255; // A
    
      }
    
    }
    


  • Jetzt ist der Rand schwarz. War irgentwie klar oder???

    mfg.



  • Ja, war klar. Du kannst auch die restlichen 3 Farben auf 255 setzen, dann ist der Rand weiß. Oder du kannst den Durchschnitt aller Farben auf der Textur nehmen, oder was weis ich.



  • joomoo schrieb:

    ChockoCookie schrieb:

    WTF??? Was willst du eigentlich?
    Ich geb's auf.

    Ich möchte Bitmaps in OpenGL zeichnen, wo alles was grün ist transparent ist ohne grünen rand. Außerdem möchte ich dabei nicht auf GL_LINEAR verzichten.

    dann musst du das bilineare Filtering ausmachen, hab ich doch gesagt.

    Bye, TGGC (Demo or Die)



  • TGGC schrieb:

    joomoo schrieb:

    ChockoCookie schrieb:

    WTF??? Was willst du eigentlich?
    Ich geb's auf.

    Ich möchte Bitmaps in OpenGL zeichnen, wo alles was grün ist transparent ist ohne grünen rand. Außerdem möchte ich dabei nicht auf GL_LINEAR verzichten.

    dann musst du das bilineare Filtering ausmachen, hab ich doch gesagt.

    Bye, TGGC (Demo or Die)

    Darauf möchte ich aber auch nicht verzichten, hab ich doch gesagt.

    mfg.



  • ChockoCookie schrieb:

    Ja, war klar. Du kannst auch die restlichen 3 Farben auf 255 setzen, dann ist der Rand weiß. Oder du kannst den Durchschnitt aller Farben auf der Textur nehmen, oder was weis ich.

    Hallo? Es war deine Idee die restlichen Farben auf 0 zu setzen.

    mfg.



  • Klar war es meine Idee. Besser gesagt war es *tada* die Lösung.



  • ChockoCookie schrieb:

    Klar war es meine Idee. Besser gesagt war es *tada* die Lösung.

    Die Lösung? Ne, eigentlich nicht.

    mfg.



  • joomoo schrieb:

    TGGC schrieb:

    joomoo schrieb:

    ChockoCookie schrieb:

    WTF??? Was willst du eigentlich?
    Ich geb's auf.

    Ich möchte Bitmaps in OpenGL zeichnen, wo alles was grün ist transparent ist ohne grünen rand. Außerdem möchte ich dabei nicht auf GL_LINEAR verzichten.

    dann musst du das bilineare Filtering ausmachen, hab ich doch gesagt.

    Bye, TGGC (Demo or Die)

    Darauf möchte ich aber auch nicht verzichten, hab ich doch gesagt.

    mfg.

    Liest du eigentlich was ich sage? Du musst natürlich nicht, kannst auch dumm sterben.

    Bye, TGGC (Demo or Die)



  • TGGC schrieb:

    Liest du eigentlich was ich sage? Du musst natürlich nicht, kannst auch dumm sterben.

    Bye, TGGC (Demo or Die)

    Hä? Was willst du?

    Und wie schalte ich bilineare Filterung ab??

    mfg.



  • joomoo schrieb:

    Die Lösung? Ne, eigentlich nicht.
    mfg.

    Doch, war es. Du wusstest nicht, wieso der grüne Rand da ist, ich habs dir gesagt.

    Und weil ich nett bin nehm ich dir die restlichen Schlussfolgerungen auch noch ab, dafür schlägst du nacher deinen Kopf gegen die Wand, weil du nicht selbst gedacht hast, OK?

    Also: Das bilineare Filtering sorgt dafür, dass die Nachbarpixel in die Farbe miteinbezogen werden. Daraus folgt, das auch die Farbe des Transparenten Bereiches, die man normalerweise nicht sieht weil der Alphawert 255 ist, auch miteinbezogen wird. Das äussert sich in einem Rand in der jeweiligen Farbe. Normalerweise stört das nicht, weil das originale Bild unter der Transparenz "versteckt" ist (das Bild wird mit Transparenz abgespeichert). Wenn du allerdings mit Colorkeying arbeitest, funktioniert das nicht. Mogliche Lösungen:

    Speicher das Bild mit Originalfarben unter der Transparenz ab, WIE VORGESCHLAGEN

    oder

    Setz die Farbe unter der Transparenz auf einen Wert, von dem du hoffst, das er nicht stört (zB der Durchschnitt aller Farben), WIE VORGESCHLAGEN

    oder

    Verzichte auf Bilineare Filterung, WIE VORGESCHLAGEN

    ausserdem noch ein Gratisvorschlag, der mir grade einfällt:

    Setze alle Nachbarpixel eines grünen Pixels auch auf Transparent (auf das wärst auch du gekommen), dann funkt bilinear, nur bei anisotrop kanns noch Probleme geben.



  • joomoo schrieb:

    Und wie schalte ich bilineare Filterung ab??

    Indem Du Dich mit der API Deiner Wahl (OpenGL?) näher beschäftigst...



  • ChockoCookie schrieb:

    Doch, war es. Du wusstest nicht, wieso der grüne Rand da ist, ich habs dir gesagt.

    Doch wusste ich und zwar von Anfang an. Schau dir mal meinen ersten Beitrag an. Da schreibe ich:

    Jetzt habe ich das Problem, dass am Rand der Textur ein grüner Balken ist, da OpenGL ja beim vergößern weich zeichnet, und zwischen den Pixeln Farbüberläufe erstellt.

    Und dieses weichzeichnen ist das bilineares Filtern. Wusste halt nur nicht den Namen.

    ChockoCookie schrieb:

    Also: Das bilineare Filtering sorgt dafür, dass die Nachbarpixel in die Farbe miteinbezogen werden. Daraus folgt, das auch die Farbe des Transparenten Bereiches, die man normalerweise nicht sieht weil der Alphawert 255 ist, auch miteinbezogen wird.

    Ja, das habe ich mir auch schon gedacht.

    ChockoCookie schrieb:

    Das äussert sich in einem Rand in der jeweiligen Farbe. Normalerweise stört das nicht, weil das originale Bild unter der Transparenz "versteckt" ist (das Bild wird mit Transparenz abgespeichert).

    Unter Transparenz versteckt ist? Hä? Das versteh ich nicht ganz. Tut mir leid.

    ChockoCookie schrieb:

    Wenn du allerdings mit Colorkeying arbeitest, funktioniert das nicht.

    Warum nicht? Versteh ich nicht ganz. Hab ich ja auch schonmal erklärt: OpenGL kriegt nur ein Array, kein Bild. Und ob der AlphaKanal von Anfang an drinn war oder nicht, weiß OpenGL gar nicht. Oder reden wir hier nicht vom Alpha-Kanal???

    ChockoCookie schrieb:

    Setz die Farbe unter der Transparenz auf einen Wert, von dem du hoffst, das er nicht stört (zB der Durchschnitt aller Farben), WIE VORGESCHLAGEN

    Ist eine Notlösung. Gefällt mir nicht so.

    ChockoCookie schrieb:

    Verzichte auf Bilineare Filterung, WIE VORGESCHLAGEN

    Wie geht das? Hab ich schon gefragt.

    ChockoCookie schrieb:

    Setze alle Nachbarpixel eines grünen Pixels auch auf Transparent (auf das wärst auch du gekommen), dann funkt bilinear, nur bei anisotrop kanns noch Probleme geben.

    Gar nicht mal so schlecht. Nur es gehen dann halt ein paar Pixel verloren. Aber wenn ich recht bedenke ist das nicht so schlimm. Werde ich mal ausprobieren.
    War ich nicht drauf gekommen, ich hatte mir gedacht, die grünen Pixel am Rand mit der Benachbarten Farbe zu belegen, also sozusagen den untransparenten bereich zu vergrößern. Das war mir dann zu kompliziert. Deine Lösung ist besser, werde ich gleiche mal ausprobieren. DANKE!

    Sgt. Nukem schrieb:

    Indem Du Dich mit der API Deiner Wahl (OpenGL?) näher beschäftigst...

    Ich hab jetzt mal in der Referenz von OpenGL gesucht, aber nichts zum THema bilinear gefunden. Ich glaube nicht das TGGC das mit GL_LINEAR meint oder? Wenn ja, sollte er mal genauer lesen, dass sagte ich nähmlich schon auf Seite 1, dass ich darauf nicht verzichten will.

    mfg.



  • *plonk*


Anmelden zum Antworten