Grüner Rand bei transparenten Bildern aufgrund GL_LINEAR



  • ChockoCookie schrieb:

    - Beim Laden der Textur alle grünen Pixel auf Transparent setzen.

    Das ist doch genau das was ich mache oder? Alpha CHannel 0 ist ja transparent.

    mfg.



  • Nein, du lässt es von OpenGL machen. Und da geht es aufgrund von GL_LINEAR in die hose.

    Was du machen sollst:

    for each pixel in picture.pixels
      if pixel.value == COLOR_GREEN then
        pixel.value = COLOR_TRANSPARENT
      end if
    end for
    


  • ChockoCookie schrieb:

    Nein, du lässt es von OpenGL machen. Und da geht es aufgrund von GL_LINEAR in die hose.

    Was du machen sollst:

    for each pixel in picture.pixels
      if pixel.value == COLOR_GREEN then
        pixel.value = COLOR_TRANSPARENT
      end if
    end for
    

    Jeder Pixel hat drei Werte, und die Konstante COLOR_TRANSPARENT gibt's nicht.
    Ich glaube wir verstehen uns falsch, deswegen schick ich mal meinen Code hinterher:

    GLuint BildGroesse = TextureImage[loop]->sizeX * TextureImage[loop]->sizeY;
         GLubyte TextureTemp[BildGroesse * 4];
         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
          }
         }
    


  • joomoo schrieb:

    Jeder Pixel hat drei Werte, und die Konstante COLOR_TRANSPARENT gibt's nicht.

    😕 schon mal was von pseudocode gehört?

    joomoo schrieb:

    Ich glaube wir verstehen uns falsch, deswegen schick ich mal meinen Code hinterher:

    GLuint BildGroesse = TextureImage[loop]->sizeX * TextureImage[loop]->sizeY;
         GLubyte TextureTemp[BildGroesse * 4];
         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
          }
         }
    

    OK, das is eigentlich das, was ich gemeint habe.
    Dann hast du wohl das Bild schon vorher weichgezeichnet. Also entweder Vergrössert, verkleinert, die grüne Farbe mit einer Unscharfmaskierung aufgetragen ... Der Punkt ist, das am Rand der Grünen Fläche keine scharfe Abgrenzung ist, sondern die Randpixel mit der originalen Bildfarbe geblendet sind. Dadurch bleibt ein grüner Rand stehen. Zoom mal mit einer Bildbearbeitung genau ran, ich wette, da ist ein weicher Übergang zwischen Grün und Bild.



  • ChockoCookie schrieb:

    OK, das is eigentlich das, was ich gemeint habe.
    Dann hast du wohl das Bild schon vorher weichgezeichnet. Also entweder Vergrössert, verkleinert, die grüne Farbe mit einer Unscharfmaskierung aufgetragen ... Der Punkt ist, das am Rand der Grünen Fläche keine scharfe Abgrenzung ist, sondern die Randpixel mit der originalen Bildfarbe geblendet sind. Dadurch bleibt ein grüner Rand stehen. Zoom mal mit einer Bildbearbeitung genau ran, ich wette, da ist ein weicher Übergang zwischen Grün und Bild.

    Ja du hast Recht, da ist ein weicher Übergang. Aber ich hab schon Spiele gesehen wo es dann einen weichen Übergang nach durchsichtig gibt. Genau sowas bräuchte ich.

    mfg.

    edit: der weiche übergang ist das was ich sehe, nicht das im bild. Im bild ist ein harter übergang. Ich glaube da hab ich euch falsch verstanden.



  • 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)


Anmelden zum Antworten