So, wenn ich jetzt später die Textur als Billboard in mein Terrain lege, habe ich das Problem, das der Hintergrund (weil Alpha=0) zwar ausgeblendet wird, aber mein Quader ist ebenfalls transparent. Damit meine ich: ich kann meinen Quader sehen, aber er wird halbtransparent gerendert.
Als Blendfunktion beim reinrendern in das Terrain verwende ich:
Code:
glBlendFunc(GL_ONE, GL_ONE);
Ich hänge mal ein Bild an, um zu zeigen was ich meine.
Wie kann ich erreichen, das der Quader undurchsichtig gerendert wird?
Grüße,
Mados
// edit Lossy: Quellcode besser formatiert
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.
Registriert: Di Nov 26, 2002 22:12 Beiträge: 259 Wohnort: Dresden
Mit der Blendfunktion glBlendFunc(GL_ONE, GL_ONE) addierst du einfach nur die Farbwerte. Damit erscheint dein Würfel durchsichtig. Entsprechend musst du auch den Alphakanal in deine Blendfunktion mit einbeziehen. Versuche es mal mit
_________________ 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
Registriert: Di Nov 26, 2002 22:12 Beiträge: 259 Wohnort: Dresden
Zeichnest du deine Textur auch sicher als letztes? Beim Blending ist die Reihenfolge wichtig.
_________________ 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
Ja, das Billboard wird ganz zum Schluss gezeichnet.
Ich hab mittlerweile alle möglichen glBlendFuncs ausprobiert. Entweder bekomme ich sie voll reingeblendet, oder wie oben beschrieben. Die Sache mit dem Alpha_SRC scheint nur für den schwarzen Hintergrund der Textur richtig zu funktionieren, den ich ja mit glClear(0,0,0,0) gesetzt habe.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Mados hat geschrieben:
Die Sache mit dem Alpha_SRC scheint nur für den schwarzen Hintergrund der Textur richtig zu funktionieren, den ich ja mit glClear(0,0,0,0) gesetzt habe.
Mag sein, dass ich dich nicht richtig verstanden habe. Davon gehe ich sogar fest aus. Aber das ist doch das was du wie oben beschrieben haben willst? Du möchtest dass nur dein gerenderter Würfel sichtbar ist. Und zwar voll sichtbar, oder? Der Hintergrund mit Alpha 0 wird ja auch ausgeblendet. Stehe vielleicht auch gerade ein bisschen auf dem Schlauch aber habe etwas ähnliches gerade erst gemacht und da ging alles genau so.
Die Sache mit dem Alpha_SRC scheint nur für den schwarzen Hintergrund der Textur richtig zu funktionieren, den ich ja mit glClear(0,0,0,0) gesetzt habe.
Mag sein, dass ich dich nicht richtig verstanden habe. Davon gehe ich sogar fest aus. Aber das ist doch das was du wie oben beschrieben haben willst? Du möchtest dass nur dein gerenderter Würfel sichtbar ist. Und zwar voll sichtbar, oder? Der Hintergrund mit Alpha 0 wird ja auch ausgeblendet. Stehe vielleicht auch gerade ein bisschen auf dem Schlauch aber habe etwas ähnliches gerade erst gemacht und da ging alles genau so.
Danke Lossy, für das Formatieren in meinem ersten Beitrag ich werd mich in Zukunft dran halten.
Der Würfel ist aber nicht voll sichtbar, sondern wie du im Bild sehen kannst, selbst transparent.
Wenn ich aber beim rendern des Würfels
Code:
glColor4f(x,x,x,1.0)
(1 als Alpha wert verwende, dann müsste dieser doch voll sichtbar sein, oder?
Ich begreifs einfach nicht.
Edit: Das GL_ONE , GL_ONE die Farben mixt ist verständlich, und würde erklären warum der Würfel transparent erscheint. Meiner Ansicht nach hätte
funktionieren müssen. Aber dann wird die Textur einfach komplett ausgeblendet. Den von mir gewünschten Effekt kann ich scheinbar mit SRC_ALPHA in der Blendfunc nicht erreichen. Ich suche nach einer Erklärung warum die mit glColor gezeichneten 1.0 -Alpha Werte ignoriert werden.
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Wegen der Formatierungen. Kein Problem. Ist halt besser zu lesen.
Das Probem mit dem Bild hatte Magellan ja schon erwähnt. In diesem Falle liegt es an der BlendFunc die einfach alles Addiert. Da der Hintergrund Schwarz ist ergibt sich X + 0 = X. Nur bei dem eigentlichen Würfel haut dies nicht hin. Deswegen musst du eine andere Blendfunc auswählen. Normal ist die die Magellan erwähnt hat genau die Richtige für deinen Fall. Damit würde deine Textur mit dem Alphakanal und der Hintergrund mit 1- Alphakanal multipliziert werden und beides Addiert. Also ein Normales Alphablending.
Das Einzige was mir da so einfallen würde wäre, dass der Alphakanal der Textur irgendwie auf 0 steht. Ansonsten kann es eigentlich nicht sein, dass dort nichts dargestellt würde. Wenn das Blending generell nicht gehen würde wäre ja auch das GL_ONE, GL_ONE schon nicht da gewesen. Von daher denke ich, dass wir ein Tiefenproblem (Tiefentest oder Überzeichnen) ausschließen können.
Evtl solltest du mal testweise das Blending deaktivieren und einen Alphatest aktivieren. Wenn dabei auch das ganze Bild verschwindet oder sichtbar ist dann stimmt was mit dem Alphakanal nicht. Aber ich kann mich ehrlich auch nicht vorstellen, dass damit etwas nicht stimmt, da sobald der Würfel mit einem Alpha von 1 gezeichnet wird befindet sich auch ein Alpha von 1 im Backbuffer. Oder hast du da irgendwas mit glColorMask deaktiviert? Das solltest du evtl auch mal prüfen. Und zwar global. Das wird erst durch einen erneuten Aufruf zurückgesetzt.
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Hab ich das ganz oben richtig gelesen, dass du den Würfel in eine Texturrenderst und dann in die Szene einblenden willst?
Dann schau dir nochmal deinen Code genau an, ob du beim Rendern des Würfels den Alphakanal <> 1 hast.
_________________ Blog: kevin-fleischer.de und fbaingermany.com
Wegen der Formatierungen. Kein Problem. Ist halt besser zu lesen.
Das Einzige was mir da so einfallen würde wäre, dass der Alphakanal der Textur irgendwie auf 0 steht. Ansonsten kann es eigentlich nicht sein, dass dort nichts dargestellt würde. Wenn das Blending generell nicht gehen würde wäre ja auch das GL_ONE, GL_ONE schon nicht da gewesen. Von daher denke ich, dass wir ein Tiefenproblem (Tiefentest oder Überzeichnen) ausschließen können.
Evtl solltest du mal testweise das Blending deaktivieren und einen Alphatest aktivieren. Wenn dabei auch das ganze Bild verschwindet oder sichtbar ist dann stimmt was mit dem Alphakanal nicht. Aber ich kann mich ehrlich auch nicht vorstellen, dass damit etwas nicht stimmt, da sobald der Würfel mit einem Alpha von 1 gezeichnet wird befindet sich auch ein Alpha von 1 im Backbuffer. Oder hast du da irgendwas mit glColorMask deaktiviert? Das solltest du evtl auch mal prüfen. Und zwar global. Das wird erst durch einen erneuten Aufruf zurückgesetzt.
Also, meine Experimente mit angeschaltetem Alpha-Test und abgeschaltetem glBlend ergeben folgendes
Code:
glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_GREATER,0.1f);
Die ganze Textur verschwindet. Meine gezeichneten Alpha Werte bei glColor4f werden ignoriert.
Code:
glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_LESS,1.0f);
Testweise auch mal GL_LESS probiert, die ganze Textur wird dann gerendert, wie erwartet.
Mit glColorMask habe ich bisher nichts angestellt, ich hab extra nochmal durchgeschaut.
Aus irgendeinem Grund ignoriert er meine glColor4f Befehle.
Hab ich das ganz oben richtig gelesen, dass du den Würfel in eine Texturrenderst und dann in die Szene einblenden willst? Dann schau dir nochmal deinen Code genau an, ob du beim Rendern des Würfels den Alphakanal <> 1 hast.
Flash, was meinst du denn genau damit?
Ich lösche den Puffer mit Alpha=0, und zeichne dann mit Alpha=1. Danach geht der Puffer mit glTexCopy in eine Textur. Da ich da GL_RGBA verwende hätte das doch klappen müssen?
Registriert: Do Dez 05, 2002 10:35 Beiträge: 4234 Wohnort: Dortmund
Also ich mache es genau so und bei mir klappt es. Ich kann dir, wenn ich gleich zu Hause bin, mal die Anwendung von mir hochladen. Die kannst du mal testen.
Wenn du glColorMask nicht bewusst einsetzt dann solltest du das evtl mal tun. Also bewusst alle 4 Kanal aktivieren. Evtl baut ja jemand anders misst. Sonst würde ich jetzt mal spontan nach dem Code schreien in dem du deine Textur erzeugst. Evtl ist ja noch was ganz unscheinbares.
Registriert: Do Sep 25, 2003 15:56 Beiträge: 7810 Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Mados hat geschrieben:
Code:
glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_LESS,1.0f);
Testweise auch mal GL_LESS probiert, die ganze Textur wird dann gerendert, wie erwartet.
Gibt dir das nicht zu denken? GL_LESS 1.0 bedeutet, zeige alles was einen Alphawert kleiner 1.0 hat. Wenn du dann alles siehst, bedeutet das deine Textur hat nirgendwo einen undurchsichtigen Teil.
_________________ Blog: kevin-fleischer.de und fbaingermany.com
OK, jetzt kommts richtig übel. Das Rendering funktioniert einwandfrei wenn das Programm auf der Radeon m100 läuft, mit DRI Treibern. Nur bei dem kommerziellen NVidia Treiber habe ich das Problem mit der Textur. Flash hatte schon recht, es gab gar keinen Alpha Kanal, allerdings war mein Code auch nicht wirklich falsch. Wie ich jetzt sehe, hängt es vom verwendeten Treiber ab. Ich finde gar keine Worte dafür, wie ich das finde
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.