OpenGL: Eine Farbe der Textur ausblenden



  • Hi Leute.
    Ich weiss, das Problem tauchte schon oefters auf, nur trotzdem habe ich noch nicht das gewuenschte Ergebnis erzielen koennen.
    Ich habe eine Textur, bei der der Hintergrund transparent werden soll. Welche Farbe die beim Darstellen transparente Farbe in der Textur erhalten soll, ist relativ egal. Jetzt will ich halt bei OpenGL _nur_ diese Farbe _total_ ausblenden. Der Rest soll normal dargestellt werden. Nachdem ich ein wenig gesucht habe, habe ich folgendes gefunden: Link
    Wenn ich diesem Beispiel folge, den Hintergrund meiner Textur demzufolge schwarz faerbe, und dann 'glBlendFunc( GL_ONE, GL_ONE );' verwende, wird der schwarze Hintergrund zwar komplett ausgeblendet, aber der Rest wird je nach Helligkeit auch transparent ( dunkelblau wird zum Beispiel auch fast komplett durchsichtig )... Ich moechte, aber, dass alles andere mit 100%iger Sichtbarkeit gezeichnet wird... 😞 Wie laesst sich das ohne Texturen mit eigenem Alphakanal ( z.B. tga-Dateien ) realisieren? Geht das ueberhaupt?
    MfG Aoeke



  • Mach ne andere Blend-Funktion: GL_SRC_COLOR, GL_ONE_MINUS_SRC_COLOR

    Ansonsten kannst Du natürlich Dein tga-File auch entsprechend in rgba wandeln, d.h. Du definierst irgendeinen Farbwert als durchsichtig und setzt dazu dann das entsprechende alpha.



  • Klappt leider auch nicht mit mit den beiden Parametern. Es tritt dann das gleiche Problem auf, wie mit den von mir genannten.. 😞 Und das mit den TGA-Dateien wollte ich ja gerade nicht machen. Ich moechte nur Bitmap-Dateien als Texturen verwenden.
    Eine andere Moeglichkeit waere ja, das Objekt ( z.B. ein Dreieck auf einer viereckigen Textur ) zweimal zu zeichnen. Das erste mal total in schwarz. Das zweite Mal dann mit der von durito oder in dem verlinkten Topic genannten Moeglichkeit. Die Transparenz der anderen dunklen Farben ( in dem Beispiel des Dreiecks ) wuerde dann auf dem schwarzen Hintergrund nicht mehr so auffallen.
    Nach den ganzen obigen Beispielen wird nun immer die Farbe schwarz total ausgeblendet. Fuer die eben genannte Variante muesste aber schwarz total sichtbar, aber weiss zum Beispiel ganz ausgeblendet werden... Wie mach ich das?
    Ich hoffe ihr koennt meine Gedankengaenge wenigstens bruchstueckhaft nachvollziehen... 😉
    MfG Aoeke



  • Achso ja.
    Kannst ja schon aus bmp lesen und dann in ein rgba-Bild abfüllen. Mit Schwarz->Alphakanal=255, sonst 0 (oder umgekehrt?...).

    Dann GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA

    so sollte es hinhauen.



  • durito schrieb:

    Kannst ja schon aus bmp lesen und dann in ein rgba-Bild abfüllen. Mit Schwarz->Alphakanal=255, sonst 0 (oder umgekehrt?...).

    Das waere eine Idee. Aber wie mache ich das? [ Erklaerung, Links, ... ? ]
    MfG Aoeke



  • Aoeke schrieb:

    durito schrieb:

    Kannst ja schon aus bmp lesen und dann in ein rgba-Bild abfüllen. Mit Schwarz->Alphakanal=255, sonst 0 (oder umgekehrt?...).

    Das waere eine Idee. Aber wie mache ich das? [ Erklaerung, Links, ... ? ]
    MfG Aoeke

    1. tust Du bmp laden (z.B. mit SDL)
      2:
    unsigned char* p = (unsigned char*)conv->pixels; //zeiger auf bmp data
    
    for (int i=0; i<bitmap->w*bitmap->h*4; i+=4) {
    
      if (((p[i]+p[i+1]+p[i+2]) / 3) == 0) p[i+3] = 0;
      else p[i+3] = 255;
    
    }
    


  • In diesem Zusammenhang sollten vielleicht noch GL_ALPHA_TEST und glAlphaFunc erwähnt werden. Falls du eine andere Blendfunktion benutzen willst, aber die entsprechenden Stellen trotzdem transparent sein sollen.



  • Vielen, vielen Dank... 🙂
    Die Frage hat mich schon seit Ewigkeiten beschaeftigt...
    Haette ja nicht gedacht, dass es so leicht ist....
    DANKE 🙂
    MfG Aoeke



  • Eine Frage haette ich aber noch. Ich bin jetzt davon ausgegangen, dass p[i], usw. dann die Farbmenge der einzelnen Farbkomponenten beinhaltet. Also irgendwas von 0-255.. Stattdessen stehen dort solche tollen Zeichen wie '\x01'.. Damit kann ich jetzt nicht viel anfangen. 😞 Wie ergeben sich diese Zeichen und wie komm ich auf die einzelnen Farbwerte fuer die einzelnen Pixel?
    MfG Aoeke



  • Aoeke schrieb:

    Eine Frage haette ich aber noch. Ich bin jetzt davon ausgegangen, dass p[i], usw. dann die Farbmenge der einzelnen Farbkomponenten beinhaltet. Also irgendwas von 0-255.. Stattdessen stehen dort solche tollen Zeichen wie '\x01'.. Damit kann ich jetzt nicht viel anfangen. 😞 Wie ergeben sich diese Zeichen und wie komm ich auf die einzelnen Farbwerte fuer die einzelnen Pixel?
    MfG Aoeke

    Ja das stimmt schon. die rgba-Komponenten von 0 bis 255

    Wahrscheinlich macht bloss Deine Ausgabe Schwierigkeiten, weil der Wert eben als char dargestellt wird. Tu den mal zu int wandeln oder so.. Dann sollte es auch mit der Ausgabe klappen.



  • Danke, funktioniert. Keine Ahnung was mein Compiler fuer eine Macke hatte.. Als ich es davor probiert habe, hat es nicht funktioniert.. 🙄
    MfG Aoeke


Anmelden zum Antworten