Eine Idee wäre die Maske direkt im Alpha Kanal der Texture zu speichern und dann ganz normal mit
Code:
glAlphaFunc(GL_GREATER,0);
glenable(GL_ALPHA_TEST);
die Maskierung einzustellen.
Wenn das aber mit 2 Texturen sein soll, dann schreib die Maske erst nur in den Alpha Kanal und blende nacher die normale Texture darüber. Dafür muß die Maskentexture aber einen Alpha Kanal haben.
Du hast die Maske mit glBlendFunc(gl_dst_color,gl_one); geblendet.
Das heißt es wurde folgendes berechnet:
BasisTexture+Maske*BasisTexture=BasisTexture*(1+Maske)
An den Stellen an denen die Maske 1 stehen ja, wurde die Basistexture mit 2 multipliziert und dadurch doppelt so hell. An dem Screenshot kann man erkennen, daß sich dort ein abgerundeter Bereich befindet, der doppelt so hell ist wie der Rest.
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Hast du es auch als 32-Bit TGA gespeichert? 24-Bit (Voreinstellung bei PS) beinhaltet logischerweise (8Bit pro Farbkanal) keinen Alpha. Ansonsten musst du die Alphamaske dann natürlich auch laden und Alphamasking aktivieren (hat Lars ja oben geschrieben wie).
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Neben den 32 Bit TGA's solltest du auf jeden Fall noch die Filterung von den Texturen ausstellen. Also Min und Mag auf GL_LINEAR. Es kann manchmal zu Verzerrungen der Ränder durch die Filterung kommen. Dadurch hatte ich teilsweise auch schon komische Effekte gehabt.
PS: Um mal ein bisschen Werbung zu machen. In diesem Projekt habe die Quellen von meinen OpenGL Komponenten veröffentlich. Für den Fall, dass du etwas GUI ähnliches machen möchtest kannst du dir das ja mal anschauen. Das dürfte dir evtl. reichlich arbeit ersparren.
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Sieht für mich spontan so aus als würde die Alphainformation ignoriert werden, allerdings nutze ich auch die Textures.pas (aber stark modifiziert und zusammen mit nem eigenen Texturenmanager) und habe damit keine Probleme.
Versuch mal die Datei als 32-Bit und komprimiert zu speichern, da der Loader vllt. nur dann den Alpha mitlädt. Ansonsten hast du entweder doch was im Bezug auf Alphatesting vergessen, oder du nutzt ne alte Version die den Alphawert noch nicht korrekt lädt.
Eben nochmal bei sulaco aus einem aktuellem Openglprogramm dort eine neue Texture.pas runtergeladen. Auch alle möglichen Varianten mit dem TGA-Export von PS durchprobiert.
Hier wäre die Funktion, mit der ich den Button zeichne:
Code:
procedure TGLButton.Draw;
var
Texture: gluInt;
begin
Texture := Textura;
case fState of
1: Texture := Texturb;
2: Texture := Texturc;
end;
glAlphaFunc(GL_GREATER,0);
glenable(GL_ALPHA_TEST);
glLoadName(fOGLName);
DrawTexQuad(GetVector(fX + fWidth, fy,-15),
GetVector(fX + fWidth, fY + fHeight,-15),
GetVector(fX, fY + fHeight,-15),
GetVector(fX, fY,-15),
Texture);
glDisable(GL_ALPHA_TEST);
end;
Anbei nochmal ein Screenshot, bei dem deutlich zu sehen ist, wie der um den transparenten bereich noch eine weiße Kontur zeichnet. Attachment 2 ist die momentane Textur.
Und danke für das Gui-Lib-Angebot. Aber ansich ist meine Buttonklasse soweit fertig und funktioniert. Bis auf diese eine Sache halt...
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Das Problem ist AFAIK PS selber, weil das die Ränder der Transparenz weichzeichnet. Das "Bild" auf dem Anhang habe im PS gemacht, und der gestrichelte Rand zeigt (anderes Bildbearbeitungsprogramm) die Alphamaske an, die wie man sieht nicht den Objektkonturen entspricht. Deshalb mache ich meine Transparenz nicht im PS, sondern im PicturePublisher, da hab ich mehr Kontrolle und die Sache mit den Masken geht dort einfacher.
Das muss man doch mit PS hinkriegen? Ich hätte sonst noch TheGimp 2 installiert (Neugier), aber sonst. Das Ding hab ich damit schon ausprobiert, aber es zeichnet auch die Ränder weich, bloß in schwarz.
Aber vielen dank, ich versuch dann mal rauszufinden, wie ich das mache.
Registriert: Mo Sep 23, 2002 19:27 Beiträge: 5812
Programmiersprache: C++
Schau mal in der PS-Hilfe unter Erstellen von Alpha-Kanälen (Photoshop) nach, da wird gezeigt wie man für den Alphakanal eine eigene Ebene erstellt. Ich habs zwar selbst noch nicht probiert, aber evtl. hat man da mehr Einflussmöglichkeiten, denn im Bezug auf das weichzeichnen des Alphakanals bei Verwendung der Transparenz kann man allem Anschein nach wirklich nichts einstellen.
Registriert: Di Nov 26, 2002 22:12 Beiträge: 259 Wohnort: Dresden
Behebt vielleicht ein Aufruf von glColor4* mit einem geringen Alphawert dein Problem?
Code:
glAlphaFunc(GL_GREATER,0.1);
glEnable(GL_ALPHA_TEST);
glColor4f(1,1,1,0.12);
_________________ Nichts auf der Welt ist so gerecht verteilt wie der Verstand. Denn jederman ist überzeugt, dass er genug davon habe.
Rene Descartes, frz. Mathematiker u. Philosoph, 1596-1650
Mitglieder in diesem Forum: 0 Mitglieder und 5 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.