Ich bin gerade dabei meine eigene Image-Unit zu schreiben (2D).
Ich habe den Alpha-Test aktiviert
Code:
glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GEQUAL , 0.5);
Benutze außerdem glBitmap und Lade dateien wie folgt ein:
Code:
FTexture.LoadFromFile(FileName);
FTexture.AddAlphaFromColorKey(255,0,255);
FTexture.GenTexture;
Wenn ich jetzt mein Bild skaliere und zeichne, sieht man einen Rand der die Farbe der Transparenz hat (clFuchsia). Dies kann man unterdrücken, wenn man GL_TEXTURE_MAG_FILTER auf GL_LINEAR setzt, jedoch sieht die Grafik dann übertrieben verpixelt aus. Wenn ich den GL_GEQUAL erhöhe, zerfrisst es mir Teile meiner Grafik Kennt ihr vielleicht eine Lösung?
Im Moment scheinst du "normales" RGB zu nutzen. OpenGL bietet dir aber auch super RGBA, was in diesem Fall wo besser zu sein scheint. Denn eine andere Lösung fällt mir in dem Moment nicht ein. Wenn du weiterhin deine clFuchsia-Bilder behalten willst, kannst du die Bilder ja öffnen, in einen RGBA-Speicherbereich packen und überall, wo clFuchsia ist, den Alphawert auf 0 setzen - die Farbe ist dabei dann egal - ist ja eh durchsichtig. ^^
Dann kannst du den FILTER-Werte auch beliebig setzen.
_________________ Denn wer nur schweigt, weil er Konflikte scheut, der macht Sachen, die er hinterher bereut. Und das ist verkehrt, denn es ist nicht so schwer, jeden Tag zu tun als ob's der letzte wär’. Und du schaust mich an und fragst ob ich das kann. Und ich denk, ich werd' mich ändern irgendwann. _________________Farin Urlaub - Bewegungslos
Registriert: Fr Jan 04, 2008 21:29 Beiträge: 419 Wohnort: Lübeck
den alphakanal kannst du direkt in das Bild speichern, du musst natürlich ein Format ählen, dass einen Alphakanal unterstütz .png und .tga sind da zum Beispiel genannt, wobei png die bessere wahl sein sollte (murmelt man). Da kannst du dann deinen alpha wert als graustufen byte angeben und kannst sogar mit tranzparenz stufen arbeiten.
Ein anderes Ding ist, was sein könnte, dass deine Textur/Grafik gestreckt oder gezeert wird auf deinem Quad/Triangle, dabei kann es sein, dass die Außenkante Farbwerte bekommt, die von der gegenüberliegenden Seite kommen. Evtl. mal die Textur Parameter einstellen auf Clamp oder Repeat. vielleicht löst das dein Problem bereits, kann dafür aber nicht garantieren. Hilfreich wäre der genau glcode den du benutzt um dein Image in die Textur zu laden und wie du deine Parameter einstellst.
Hast du auch Blending eingestaltet, ansonsten kann das ja mit Transparenz nicht funktionieren?
Der AlphaTest verwirft Pixel ganz, wenn sie den Test nicht bestehen.
Habe es mal mit Alpha-Blending probiert.
Jetzt sieht es doch schon um einiges besser aus (Gibt aber immernoch nen hauchdünnen Rand wenn man weit skaliert)
Ach irgendwie funktioniert das alles noch nicht Kann man irgendwie einstellen, dass der Alpha-Kanel nicht mit GL_LINEAR sondern mit GL_NEAREST interpoliert wird?
Ach irgendwie funktioniert das alles noch nicht Kann man irgendwie einstellen, dass der Alpha-Kanel nicht mit GL_LINEAR sondern mit GL_NEAREST interpoliert wird?
Ich glaube nicht, dass das geht.
Tritt das Problem an allen Kanten auf? In dem Code-Beispiel hast du "GL_CLAMP" nur für eine Richtung gesetzt. Das sollte vielleicht auch noch für "GL_TEXTURE_WRAP_T" gemacht werden. Wenn das nicht hilft kannst du es ja auch mal mit "GL_CLAMP_TO_EDGE" versuchen.
Aber wenn das Problem nicht den Rand der Textur betrifft sondern auch im inneren bei transparenten Teilen auftritt, hilft das wohl wenig.
"GL_TEXTURE_MAG_FILTER" ist doch für den Fall zuständig, wenn die Textur größer als normal dargestellt wird? Nur damit ich nichts falsch verstehe.
Im Eingangspost erwähntest du das bei "GL_LINEAR" dann alles verpixelt aussieht. Meintest du da "GL_NEAREST", weil "GL_LINEAR" gerade glätten sollte.
Ich nehme mal an, das es ein Problem mit der Art wie die Farbwerte beim Interpolieren verrechnet werden, ist. Idealerweise sollte die Farbe mit dem Alphawert multipliziert werden bevor sie zur resultierenden Farbe hinzugerechnet wird. Dann würde bei voller Transparenz nichts von der Pixelfarbe mit eingehen. Aber ich schätze so wird es nicht gemacht, sodass eben dein Problem entsteht. Viel kann man da aber nicht machen.
Vielleicht kannst du als Transparenzfarbe die Farbe der nicht transparenten Pixel nehmen, sodass die Farbe beim Interpolieren die gleiche bleiben muss. Natürlich ist das nicht gerade toll für "AddAlphaFromColorKey", deshalb müsste man das dann wohl in einem Grafikprogramm machen.
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Ich würde vorschlagen, in solchen Fällen wirklich den Alphakanal mit einem geeigneten Programm (z.B. GIMP. Dort dann Farbauswahl (zauberstab), wegradieren) zu erzeugen und dann entsprechend als PNG abzuspeichern. Weiterhin solltest du versuchen, die Pixel, die sich direkt am Rand befinden, noch etwas weiter rauszuziehen, falls du verstehst, was ich meine. Also an dem Punkt, wo es transparent wird, das Lila mit der Farbe des benachbarten Pixels überschreiben. Denn das ist dein Problem: Dass OpenGL sowohl Alpha als auch Farbe zwischen den beiden Punkten interpoliert und daher bekommst du deinen hässlichen Rand. Im Prinzip das, was Schläfer schon gesagt hat. Ansonsten müsste eigentlich auch, wenn du garkeinen Alphakanal hast, der Test GL_EQUAL 1.0 laufen. Dann wird ja alles rausgeschmissen, was kleiner als 1 ist.
Gruß Lord Horazont
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Registriert: Do Sep 02, 2004 19:42 Beiträge: 4158
Programmiersprache: FreePascal, C++
Ich habe dir gleich zwei gemacht . Es ist natürlich etwas schwierig beim zweiten, weil da das Alpha an den interessanten Punkten eigentlich 0 sein müsste, aber ich habe um das eigentliche "bild" jetzt mal zwei Pixel mit Alpha 0.5 stehen lassen.
Vorgehen war folgendes:
Alles mit Fuchsia ($FF00FF) auswählen.
Optional: Mit einer Farbe füllen, die im großen und ganzen ähnlich zu dem Bereich innen ist (evtl. an verschiedenen Stellen mit anderer Farbe füllen)
Stempel nehmen und die Farben des nicht-fuchsia bereiches nach außen ziehen.
Optional: Gausscher Weichzeichner von 1.5er Radius angewandt. Nur empfehlenswert, wenn man das mit dem Einfärben gemacht hat. Eigentlich reicht das Stempeln aber.
Den Ausgewählten Bereich wegradiert.
Wichtig ist, dass man immer nur außerhalb des Bildes arbeitet um nicht das Bild selber zu beschädigen.
Im Anhang ein typisches Vorher-Nachher szenario
Gruß Lord Horazont
P.S: Das war jetzt natürlich nicht das gründlichste vorgehen. Sieht auch schlimmer aus, als es eigentlich ist, ich habe halt relativ viel Rand stehen lassen. Und die sache mit dem Gaussschen ohne vorher den Hintergrund einzufärben war auch keine gute idee. Aber zur veranschaulichung sollts ja reichen.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
_________________ If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung. current projects: ManiacLab; aioxmpp zombofant network • my photostream „Writing code is like writing poetry“ - source unknown
„Give a man a fish, and you feed him for a day. Teach a man to fish and you feed him for a lifetime. “ ~ A Chinese Proverb
Mitglieder in diesem Forum: Bing [Bot] und 3 Gäste
Du darfst keine neuen Themen in diesem Forum erstellen. Du darfst keine Antworten zu Themen in diesem Forum erstellen. Du darfst deine Beiträge in diesem Forum nicht ändern. Du darfst deine Beiträge in diesem Forum nicht löschen. Du darfst keine Dateianhänge in diesem Forum erstellen.