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

Aktuelle Zeit: Fr Jul 18, 2025 08:44

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



Ein neues Thema erstellen Auf das Thema antworten  [ 51 Beiträge ]  Gehe zu Seite 1, 2, 3, 4  Nächste
Autor Nachricht
BeitragVerfasst: Fr Mär 04, 2005 08:09 
Offline
DGL Member

Registriert: Fr Mär 04, 2005 08:01
Beiträge: 25
Mein Problem ist folgendes:
Ich habe mir ein Koordinatensystem erstellt und will nun eine Ebene hineinlegen, die transparent ist, d.h. alles, was vor der Ebene ist, soll voll zu sehen sein und alles dahinter soll durchscheinen. Ich habe dies unbeabsichtigt in einem anderen Programm mit Texturen hinbekommen aber leider klappt es nicht so ganz, wie es soll.
Habe es mit glBmp und glaux probiert aber klappen tut es nicht.

Was mache ich falsch und in welcher Reihenfolge müssen die Objekte (zb. Koordinatensystem oder Geraden) erstellt werden, damit es mit dem Blending klappt?

Danke im Voraus
MfG


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mär 04, 2005 08:42 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Hi.
Also was du falsch machst kann dir niemand sagen. Du sagst weder genau was du machst noch sagst du uns nicht wie es aussieht und wie es aussehen sollte. Das aber nur mal am Rande.

Überprüfe einmal folgendes:
- Besitzt die Textur einen alphakanal?
- Ist das Blending richtig aktiviert und eingestellt? (glBlendFunc)
- Beim Blending ist die Reihenfolge entscheidend. Du musst die Elemente der Tiefe nach Rendern. Das Tiefste also zu erst.

So viel zum Blending. Aber hast du dir schon einmal überlegt die Gitter in deinem Koordinatensytstem mit OpenGL Linien zu rendern? Das ist normal nämlich eher der übliche Fall wie solche Gitter gerendert werden. Dann spielt das Blending auch überhaupt keine Rolle mehr. Du könntest dann auch ohne Probleme zur Laufzeit die Gitter anpassen etc.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mär 04, 2005 09:13 
Offline
DGL Member

Registriert: Fr Mär 04, 2005 08:01
Beiträge: 25
OK ist vielleicht bisschen vage. Ich hab mal 2 Screenshots gemacht, die helfen sollen, das momentane Problem zu verdeutlichen.
Im 1. Bild sieht man die Ebene, man sieht direkt von der Seite drauf.
Bild

Das 2. Bild zeigt das Problem: Alles, was im Bereich der Ebene liegt, ist ungeachtet der wirklichen Lage auch transparent.
Bild

Schwierig würde sich das mit der Tiefe in sofern gestalten, als dass ich beliebig viele Objekte erstellen kann und somit, wenn ich mehrere Objekte darstelle, jedes mal prüfen müsste, welcher Teil von welchem Objekt im Moment im Vordergrund ist. Das wäre aber doch recht umfangreich, da man das Koordinatensystem frei drehen kann.

Kann man das auch irgendwie anders bewerkstelligen?
Im Moment benutze ich eine einfache Bitmap-Textur, weise ihr 4 Punkte für die Ebene zu, lege über glColor4f einen Alphakanal an (Alpha 0.5) und alles andere, was gezeichnet wird erhält 1.0
Dann per src_alpha das Blending.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mär 04, 2005 09:57 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Nimm mir das nicht übel aber irgendwie stehe ich gerade auf dem Schlauch und kann dein Problem trotz der Bilder nicht verstehen. Es kann also sein, dass ich gerade vollkommen quatsch rede.

Wenn du die Transparenz nicht mehr benötigst solltest du diese entsprechend auch wieder ausstellen. (glDisable(GL_BLENDING))

Zum Thema Tiefensortiererei könntest du durchaus recht haben. Das lässt sich dann wohl recht schwer realisieren. Wie viele Transparente Objekte hast du da eigentlich?
Wenn es eines ist sollte es genügen wenn du das Objekt ganz zum Schluss zeichnest.
Wenn es mehrere sind könnte evtl. das Nichtschreiben des Tiefenbuffers helfen. Und zwar wenn du das Schreiben des Tiefenbuffers (glDepthMask(GL_FALSE)) für die Transparenten Objekte deaktivierst. Aber Vorsicht. Bei normalem Blending kann das zu unschönen Effekten führen. Das sollte man nur bei Adaptivem Blending (Feuerpartike) machen. Anschließend natürlich wieder aktivieren.

Anderenfalls solltest du die Anzahl der transparenten Objekte minimieren. Also in dem du zum Beispiel das Gitter nicht mehr Trasparent machst sondern es mit OpenGL Linien renderst.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mär 04, 2005 10:05 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Waren die Bilder nicht gerade anders herrum? Beim Editieren bitte eine kleine Fußnote einfügen, dass du deinen Beitrag editiert hast. Bzw in diesem Fall, dass du deine Bilder getauscht hast. Danke.

Zum Thema Transparenz. Wie sollte das eigentlich aussehen? Bzw. wo befindet sich deine Ebene eigentlich? Die anderen Objekte sollte teilweise vor der Ebene liegen, oder?

Wenn dem so ist, dann solltest du überprüfen ob deine Koordinaten richtig sind und ob die den Tiefentest angestellt hast. Wenn du den aus hast dann werden alle Objekte so gezeichnet wie sie gezeichnet werden. Ungeachtet ob sie eigentlich andere Verdecken müssten oder nicht.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mär 04, 2005 10:05 
Offline
DGL Member

Registriert: Fr Mär 04, 2005 08:01
Beiträge: 25
Ich möchte Ebenen einzeichnen, die ich vorher in meinem Programm durch die Vektoren angebe. Nun sollen aber alle anderen Objekte noch sichtbar sein, d.h. die Ebene kann so logischerweise nicht deckend gezeichnet werden. Das Problem ist halt nur, dass die Koordinatenachsen, wenn sie die Ebene durchstoßen, eben nicht mehr transparent sein sollen sondern auch wirklich nur in dem Bereich, in dem sie von der Ebene verdeckt werden.

Edit: Ja, die Reihenfolge der Bilder war zuerst falsch, hab ich dann auch bemerkt *g*
Ich such mal eben den betreffenden Quelltext.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mär 04, 2005 10:15 
Offline
DGL Member

Registriert: Fr Mär 04, 2005 08:01
Beiträge: 25
Die Ebene:
Code:
  1.  
  2. EListe:=glGenLists(1);
  3. glNewList(EListe, gl_compile);
  4. glPolygonMode (GL_FRONT_AND_BACK, GL_FILL);
  5. glenable(gl_blend);
  6. glblendfunc(gl_src_alpha, gl_src_alpha);
  7. gldisable(gl_depth_test);
  8. glcolor4f(0.3,0.3,0.8, 0.5);
  9. glBindTexture(gl_texture_2d, Ebene);
  10.  
  11. glBegin(gl_quads);
  12.    gltexcoord2f(0,0); glVertex3f(...);
  13.    gltexcoord2f(0,0); glVertex3f(...);
  14.    gltexcoord2f(0,0); glVertex3f(...);
  15.    gltexcoord2f(0,0); glVertex3f(...);
  16. glEnd;
  17. gldisable(gl_blend);
  18. glenable(gl_depth_test);
  19. glPolygonMode (GL_FRONT_AND_BACK, GL_LINE);
  20. glEndList;
  21.  


Dazu die Reihenfolge der Objekte:
Code:
  1.  
  2. Komplett:=glGenLists(1);  
  3.     glNewList(Komplett, gl_compile);
  4.       glCallList(Achsen);   //Koordinatensystem
  5.       glCallList(Cube);   //der Würfel
  6.       glCallList(PListe);  //Punkte, momentan keine drin
  7.       glCallList(GListe); //Geraden
  8.       glCallList(EListe); //Ebenen (bzw die Ebene in dem Fall)
  9.      glEndList;
  10.  


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mär 04, 2005 10:39 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Wie ich in meinem letzten Post angemerkt habe. Du zeichnest deine Ebene OHNE den Tiefentest. (gldisable(gl_depth_test); )
Das führt natürlich dazu, dass du die Ebene über ALLE Objekte zeichnest. Das ist aber das was du nicht willst. Also musst du den Tiefentest anlassen.

Du zeichnest deine Achsen ja auch mit transparenten Texturen, oder? Dadurch kann es natürlich sein, dass die Enden die bei den Achsen herrausstehen komisch aussehen. Zu mindest dürfte dann in einem schwarzen Bereich die Ebene nicht gezeichnet werden. Da sich dort bereits ein Objekt im Tiefenbuffer befindet. Wenn dem so ist musst du entweder die Achsen ändern oder mit aktiviertem Tiefentest noch einmal zeichnen. So würden dann nur noch einmal die Stellen überzeichnet werden die vor der Ebene liegen. Achte aber darauf dass deine Tiefenfunktion auch Flächen berücksichtigt bei denen der Tiefenwert genau so ist wie die zu zeichnende Tiefe. Also GL_LEQUAL wenn ich mich gerade nicht vertue.

Die komplette DisplayListe kannst du dir sparen. Ich weiß nicht ob OpenGL nur den Displaylistenaufruf oder die komplette Displayliste noch einmal in die Liste Packt. Wenn es die gesamte Liste ist, dann ist das natürlich absolut unnötig. Du würdest dann die Listen doppelt im Speicher haben. Und von der Geschwindigkeit her dürfte der Unterschied zum Aufruf von 5 einzelnen Liste nicht messbar sein.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mär 04, 2005 13:57 
Offline
DGL Member

Registriert: Fr Mär 04, 2005 08:01
Beiträge: 25
Das mit dem Tiefentest klappt wunderbar, muss nur die Alpha-Werte nen bisschen anpassen, damit die Transparenz deutlich wird. Danke :)

Die Displayliste hab ich mir erstellt, damit ich nicht einzeln alle Listen aufrufen muss, so beinhaltet meine Rendering-Prozedur nur den Aufruf für die Liste 'Komplett' und die Bewegung, Rotation, etc.
Wenn es nichts bringt, werd ich wohl nur eine kleine Prozedur schreiben, die die Aufrufe tätigt, bin da weltoffen ;)

Die Achsen zeichne ich nicht mit Texturen, sondern mit GL_LINE, sieht eigentlich ganz ordentlich aus.
glDepthFunc(LEQUAL); müsste der Aufruf sein oder? Nicht, dass ich mich hier vertuhe.
{Edit: GL_LEQUAL natürlich *g*}

Das nächste Problem wird wohl die Achsenbeschriftung, das kann nen Spaß werden.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mär 04, 2005 15:01 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Ah. Okay. Wenn du bereits Linien sind isses ja Okay. Hatte das in einem der ersten Posts so verstanden als wären das transparente Texturen.

Wenn du die Schrift an den Achsen nicht mitdrehen möchtest, dann ist das sogar ziemlich einfach. Wenn doch dann könnte das in der Tat interesant werden. Aber ich denke mal auch dass sollte sich lösen lassen. ;-)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mär 04, 2005 15:20 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Wenn sich die Schrift mitdrehen soll, wären doch Billboards ne gute möglichkeit oder?

_________________
Blog: kevin-fleischer.de und fbaingermany.com


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Fr Mär 04, 2005 15:33 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 05, 2002 10:35
Beiträge: 4234
Wohnort: Dortmund
Vom Prinzip her ja. Allerdings musst du beachten, dass die Bestandteil der Achsen sind.

Wobei ich persönlich die statische Variante besser finde. Hat zwar den Nachteil dass es nicht von überall lesbar ist dafür sieht es aber besser aus. Ist wegen der nicht Bewegung aber auch nicht für alle Einsatzgebiete einsatzbar.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 07, 2005 21:58 
Offline
DGL Member

Registriert: Fr Mär 04, 2005 08:01
Beiträge: 25
Hat jemand etwas betreffendes auf Lager? Ich will mich da nicht zu sehr dran aufhalten, da es eher nebensächlig ist aber ohne Achseneinteilung gehts nicht, dann bekomm ich fachliche Fehler angeschrieben.
Mir würde die statische Variante durchaus reichen, wenns schick aussieht, wobei es schon praktisch wäre, wenn die Einteilung immer sichtbar ist. Zur Not kann man das ja auch noch ausblenden.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 07, 2005 22:08 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Mai 14, 2004 18:56
Beiträge: 804
Wohnort: GER/OBB/TÖL-WOR/Greiling
wie wäre es denn, wenn du einfach text ausgibst? über gluproject kannst du rausfinden wo, und mit der winz koordinate kannst dus dann vielleicxht sogar n bisschen skalieren

ps: mit text ausgeben meine ich die printtext-funktion vom vcl-template

_________________
Bild

"User Error. Replace User and hit Continue."


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mo Mär 07, 2005 23:49 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Billboard Möglichkeit:
-Ins Wiki gucken wie Billboards funktionieren
-Mit dem Bitmapfont Builder von Mars (siehe http://wiki.delphigl.com/index.php/Tools ) eine schicke Textur erstellen
-Einen Loader schreiben oder Dopefish im Forum anbetteln, dass er dir seinen schickt (der funktioniert super!)
-Die Position rausfinden wie besprochen und an der entsprechenden Stelle einen Text als BillBoard-Bitmap-Font ausgeben

_________________
Blog: kevin-fleischer.de und fbaingermany.com


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


Wer ist online?

Mitglieder in diesem Forum: Bing [Bot], Google [Bot] und 19 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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.009s | 16 Queries | GZIP : On ]