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

Aktuelle Zeit: Fr Jul 18, 2025 11:13

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



Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: 2d-Bild über 3d-Fenster.
BeitragVerfasst: Sa Sep 11, 2010 08:40 
Offline
DGL Member

Registriert: Sa Mai 15, 2010 13:25
Beiträge: 13
Hallo, ich möchte ein Cockpit erstellen.
1. Screen für Opengl 500x500.
2. 3d-Gelände erstellen
3. jetzt möchte ich vor dem 3d-Fenster ein Bild(sprite) setzen als Cockpit.
4. Wenn ich mich über das Gelände bewege soll das Bild immer als Cockpit erhalten bleiben.

Wie geht so etwas?

Danke.

Gruss


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: 2d-Bild über 3d-Fenster.
BeitragVerfasst: Sa Sep 11, 2010 09:37 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Wie geht so etwas?

Ich nehme an dein Cockpit-Bild hat hat einen Alpha-Kanal, d.h. zusätzlich zu RGB gibt es einen weiteren Farbkanal der die Transparenz speichert. Als Dateiformat eignet sich hier z.B. PNG, zum erstellen reicht GIMP vollkommen. Nachdem du deine 3D-Szene gerendert hast renderst du deine Textur einfach mit aktivem Blending darüber:
Code:
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
glDisable(GL_DEPTH_TEST);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);  // <- Textur wird bei Alpha=0 durchsichtig
glBindTexture(GL_TEXTURE_2D, cockpitTexture); // <- deine Cockpit-Textur binden
glBegin(GL_TRIANGLE_STRIP);
    glTexCoord2f(0,0);
    glVertex2f(-1,  1);
    glTexCoord2f(0,1);
    glVertex2f(-1, -1);
    glTexCoord2f(1,0);
    glVertex2f( 1,  1);
    glTexCoord2f(1,1);
    glVertex2f( 1, -1);
glEnd();
glBindTexture(GL_TEXTURE_2D, 0);
glDisable(GL_BLEND);
glEnable(GL_DEPTH_TEST);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
glPopMatrix();



Verbesserung:
Wenn es große Bereiche gibt die durch die Cockpit-Textur verdeckt werden solltest du vor dem Rendern der 3D-Szene zusätzlich einen Depth-only-Pass ausführen. D.h. du füllst den Z-Buffer zuerst überall dort mit dem kleinst möglichen Tiefenwert wo eben die Textur komplett sichtbar ist. So wird die 3D-Szene nur dort wirklich gerendert wo es auch nötig ist.
Im Quellcode oben werden sämtliche glVertex2f(X,Y) zu glVertex3f(X,Y,-1). Des weiteren aktivierst du den Alpha-Test. Nach dem rendern der 3D-Szene renderst du nochmal wie oben beschrieben drüber.

Code:
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glPushMatrix();
glLoadIdentity();
glMatrixMode(GL_PROJECTION);
glPushMatrix();
glLoadIdentity();
glColorMask(GL_FALSE,GL_FALSE,GL_FALSE,GL_FALSE); // <- Farbwerte interessieren uns nicht,wir brauchen nur Tiefenwerte
glDisable(GL_DEPTH_TEST);
glEnable(GL_ALPHA_TEST);
glAlphaFunc(GL_EQUAL, 0); // <- Pixel wird nur gerendert wenn Alpha=0
glBindTexture(GL_TEXTURE_2D, cockpitTexture); // <- deine Cockpit-Textur binden
glBegin(GL_TRIANGLE_STRIP);
    glTexCoord2f(0,0);
    glVertex3f(-1,  1, -1);
    glTexCoord2f(0,1);
    glVertex3f(-1, -1, -1);
    glTexCoord2f(1,0);
    glVertex3f( 1,  1, -1);
    glTexCoord2f(1,1);
    glVertex3f( 1, -1, -1);
glEnd();
glDisable(GL_ALPHA_TEST);
glEnable(GL_DEPTH_TEST);
glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_TRUE);
glPopMatrix();
glMatrixMode(GL_MODELVIEW);
glPopMatrix();



P.S. Ich habe den Quellcode natürlich nicht ausprobiert, sondern nur so runter geschrieben. Also gut möglich das ich irgendwas übersehen hab. ;)

_________________
Yeah! :mrgreen:


Zuletzt geändert von Coolcat am Sa Sep 11, 2010 09:44, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: 2d-Bild über 3d-Fenster.
BeitragVerfasst: Sa Sep 11, 2010 09:42 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Nachtrag:
Wenn du mehr willst als einfach nur eine Textur über die Szene zu rendern schau dir glOrtho und die Funktion des Stencil-Buffers an.

Edit: Diesen Thread sollte vielleicht jemand in den OpenGL-Bereich verschieben.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: 2d-Bild über 3d-Fenster.
BeitragVerfasst: Sa Sep 11, 2010 10:00 
Offline
DGL Member

Registriert: Sa Mai 15, 2010 13:25
Beiträge: 13
Jup, danke.
Muss ich jetzt erstmal verarbeiten.

Gruss


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: 2d-Bild über 3d-Fenster.
BeitragVerfasst: Sa Sep 11, 2010 11:11 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Ich würde im zweiten Snippet
Code:
glAlphaFunc(GL_GREATER, 0);
anstatt
Code:
glAlphaFunc(GL_EQUAL, 0);
vorschlagen.
Ich verstehe nicht ganz, warum du nur Pixel mit Alpha = 0 rendern willst. Dann würde man ja überall dort, wo die Textur nicht zu sehen ist, einen sehr kleinen Tiefenwert setzen. Das ist doch ziemlich Kontraproduktiv, oder?

greetings

_________________
If you find any deadlinks, please send me a notification – Wenn du tote Links findest, sende mir eine Benachrichtigung.
current projects: ManiacLab; aioxmpp
zombofant networkmy 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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: 2d-Bild über 3d-Fenster.
BeitragVerfasst: Sa Sep 11, 2010 11:21 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
Das ist doch ziemlich Kontraproduktiv, oder?

Öhm.....richtig....*alles zurücknehm und das Gegenteil behaupt*
Wie gesagt: "Beware of bugs in the above code; I have only proved it correct, not tried it." trifft es ziemlich gut ;)

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: 2d-Bild über 3d-Fenster.
BeitragVerfasst: Sa Sep 11, 2010 12:46 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Dez 11, 2009 08:02
Beiträge: 532
Programmiersprache: pascal (Delphi 7)
Das mit dem "Proved it correct" muss wohl n juristischer "Beweis" gewesen sein ;)

Übrigens versteh ich nicht ganz, wieso zuerst nur der Tiefenbuffer gefüllt wird. Wärs nicht sinnvoll, gleich die Textur zu rendern?
[edit]ok. habs kapiert. soll ja nicht alles nur ganz oder gar nicht transparent sein[/edit]


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 7 Beiträge ] 
Foren-Übersicht » Programmierung » OpenGL


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 14 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.008s | 15 Queries | GZIP : On ]