Files |  Tutorials |  Articles |  Links |  Home |  Team |  Forum |  Wiki |  Impressum

Aktuelle Zeit: Fr Jul 18, 2025 16:33

Foren-Übersicht » Programmierung » OpenGL
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 18 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Autor Nachricht
 Betreff des Beitrags: Textur Transparenz
BeitragVerfasst: Fr Feb 17, 2006 09:14 
Offline
DGL Member

Registriert: Sa Feb 11, 2006 18:55
Beiträge: 24
Hallo mal wieder,

ich möchte via Render To Texture etwas in eine Texture reinrendern, welche einen transparenten Hintergrund via Alpha Channel gesetzt hat.

zuerst lösche ich den Puffer mit Alpha=0:

Code:
  1. glClearColor(0.0,0.0,0.0,0);
  2. glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);


und rendere dann (nachdem ich den Viewport etc gesetzt habe):

Code:
  1. glBegin(GL_QUADS);
  2.   glColor4f(0.0f,1.0f,0.0f,1.0f);            
  3.     glVertex3f( 1.0f, 1.0f,-1.0f);  
  4.     glVertex3f(-1.0f, 1.0f,-1.0f);  
  5.     glVertex3f(-1.0f, 1.0f, 1.0f);  
  6.     glVertex3f( 1.0f, 1.0f, 1.0f);    
  7.   glColor4f(1.0f,0.5f,0.0f,1.0f);        
  8.     glVertex3f( 1.0f,-1.0f, 1.0f);  
  9.     glVertex3f(-1.0f,-1.0f, 1.0f);  
  10. [...]


Ich rendere einen Quader, mit glColor4f , also setze die Alpha Werte auf 1.0f.

Danach kopiere ich das gerenderte in die Textur:
Code:
  1. glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, 256, 256, 0);


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:
  1. 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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 17, 2006 10:11 
Offline
DGL Member
Benutzeravatar

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
Code:
  1. glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA));

_________________
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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 17, 2006 10:16 
Offline
DGL Member

Registriert: Sa Feb 11, 2006 18:55
Beiträge: 24
Hmm, irgendwas stimmt nicht.

Verwende ich

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA));

Erscheint die Textur garnicht, bzw. wird komplett ausgeblendet.

Wo kann in diesem Fall der Fehler sein?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 17, 2006 10:53 
Offline
DGL Member
Benutzeravatar

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 17, 2006 11:22 
Offline
DGL Member

Registriert: Sa Feb 11, 2006 18:55
Beiträge: 24
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.

So langsam gehen mir die Ideen aus. :(


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 17, 2006 12:04 
Offline
DGL Member
Benutzeravatar

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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 17, 2006 12:43 
Offline
DGL Member

Registriert: Sa Feb 11, 2006 18:55
Beiträge: 24
Lossy eX hat geschrieben:
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.


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:
  1.  
  2. glColor4f(x,x,x,1.0)
  3.  


(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
Code:
  1.  
  2.  glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  3.  


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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 17, 2006 13:09 
Offline
DGL Member
Benutzeravatar

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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 17, 2006 13:46 
Offline
Guitar Hero
Benutzeravatar

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 17, 2006 14:44 
Offline
DGL Member

Registriert: Sa Feb 11, 2006 18:55
Beiträge: 24
Lossy eX hat geschrieben:
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:
  1.  
  2.     glEnable(GL_ALPHA_TEST);
  3.       glAlphaFunc(GL_GREATER,0.1f);    
  4.  


Die ganze Textur verschwindet. Meine gezeichneten Alpha Werte bei glColor4f werden ignoriert.

Code:
  1.  
  2.     glEnable(GL_ALPHA_TEST);
  3.       glAlphaFunc(GL_LESS,1.0f);    
  4.  


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.

Ziemlich ratlos.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 17, 2006 14:46 
Offline
DGL Member

Registriert: Sa Feb 11, 2006 18:55
Beiträge: 24
Flash hat geschrieben:
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?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 17, 2006 15:17 
Offline
DGL Member
Benutzeravatar

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.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 17, 2006 15:42 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Mados hat geschrieben:
Code:
  1.  
  2.     glEnable(GL_ALPHA_TEST);
  3.       glAlphaFunc(GL_LESS,1.0f);    
  4.  


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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Feb 17, 2006 16:35 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Greater 0.1 liegt da sogar noch näher dran. Man könnte so sagen, dass der Alphakanal komplett leer ist. Warum auch immer er das tut.

Falls interesse besteht. Habe das Programm mal hochgeladen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: So Feb 19, 2006 07:45 
Offline
DGL Member

Registriert: Sa Feb 11, 2006 18:55
Beiträge: 24
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 :(


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 18 Beiträge ]  Gehe zu Seite 1, 2  Nächste
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 7 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.

Suche nach:
Gehe zu:  
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.010s | 15 Queries | GZIP : On ]