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

Aktuelle Zeit: Fr Jul 04, 2025 19:44

Foren-Übersicht » Programmierung » Einsteiger-Fragen
Unbeantwortete Themen | Aktive Themen



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Render-Ebenen ( 2D / 3D / 2D )
BeitragVerfasst: Mo Sep 20, 2010 09:58 
Offline
DGL Member

Registriert: Fr Jun 11, 2010 15:56
Beiträge: 3
Hallo zusammen,

ich hab mich ja schon OFT in OpenGL versucht, Tutorials ohne Ende durchgekaut und bekomme meine Idee einfach nciht richtig umgesetzt:
( Das hier ist jetzt etwas ausm Kopf geschrieben, daher kein Code - verzeiht mir meine wirre Schreibweise)

Eine 2D Scene zu zeichnen ist nicht schwer, eine 3D Quad mit Textur, mit Beleuchtung auch net.

Problem:

als erstes, in 2D, Bildschirmfüllend etwas zeichnen. Vorzugsweise mit Bildschirmkoordinaten arbeiten (müsste ja "ortho" sein). z.B. ein Bild und ein paar Textausgaben.

dann in 3D umstellen und ÜBER diese 2D Scene von eben ein paar 3D OBjekte rendern lassen.

Da waren schon meine ersten Probleme:
1) WIE schieb ich die 2D Scene soweit nach hinten, dass die 3D Scene auch nicht teilweise dahinter verloren geht? GlTranslate?
=> Gedacht wäre hier ein 3D Sonnensystem, also ein paar Kugeln die mit Texturen bemalt rum rotieren und durch feine Linien "verbunden" sind.
2) diese Linien kann ich bestimmt zeichnen, aber im 2D oder 3D modus?
3) neben einer Kugel/Planet hätte ich gern ein (Delphi Slang) "Panel" auf dem ich gern Text/Bilder zeichnen würde. Ggf. auch ein 3D Model.
-> Geh ich dazu wieder in 2D Modus?
-> Würde das Panel gerne im 3D Modus haben damit es je nach Zoomstufe erscheint/ skaliert. Bzw. leicht perspektivisch verzerrt wird.

und ab hier wieder im "2D" Modus: rechts und unten sollen die UI Elemente IMMER über der 3D Scene liegen.

Kann ich denn jetzt - z.B. rechts in einem meiner UI "Panels" - einen Selektierten Planeten in einer 3D Vorschau zeichnen?

so, die nächste Ebene wäre jetzt ein bildschirmfüllender "Blur" der gesamten Scene, über die z.B. eine art Messagebox gezeichnet wird.


Das war jetzt grob meine Idee/Problemstellung. Ich möchte natürlich keine Programmierte Lösung sondern nur entsprechende Starthilfen.

"Ebenen": Vermutlich denk ich hier zu kompliziert oder gar zu einfach. Wie wird sowas in OpenGL gelöst? ich habe hier LoadIdentity/Pop und PushMatrix im Kopf - bin mir über deren Sinn / Nutzen noch nie 100% bewusst gewesen.

Füllt mir bitte diese Lücken( [] ): Leere Scene => [Schalte auf 2d] => Zeiche => [Schalte auf 3D] => Models rendern => [Zeiche ÜBER 2d SCene und nie dahinter] => [Schalte auf 2d und zeichne immer über den vorherigen scenen] => [Geh ne Ebene höher und mach z.b. diesen lustigen Blur effekt und zeichne danach immer über dem Blur].

"2D" Modus: Es gibt die möglichkeit in OpenGL in 2D zu zeichnen, bin mir aber nicht sicher ob ich das überhaupt brauche, da ich eigentlich gerne bei jeder Ebene die Möglichkeit haben möchte ein 3D Model zu zeichnen

"Selektion": Was muss ich hier beachten, damit die Selektion nicht durch alle Ebenen hindurch geht? Kann ich überhaupt in jeder Ebene mit dem gleichen Koordinaten System arbeiten?

"Blur" Effekt: Hat jemand einen Link wo sowas gelöst wurde?


Schon mal vielen DAnk fürs lesen
Daniel


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Render-Ebenen ( 2D / 3D / 2D )
BeitragVerfasst: Mo Sep 20, 2010 10:21 
Offline
DGL Member
Benutzeravatar

Registriert: Fr Jan 04, 2008 21:29
Beiträge: 419
Wohnort: Lübeck
zu 1) Also, wenn dein Hintergrund immer im Hintergrund bleiben soll, reicht es den Tiefenpuffer und den Tiefentest zu deaktivieren. Dann zeichnest du dein 2D Kram in den Hintergrund (Die Tiefe spielt jetzt keine Rolle mehr) und anschließend aktivierst du wieder beides und zeichnest den 3D kram.

Andere Möglichkeit wäre auch, beim Wechels von 2D zu 3D zu 2D jedesmal einfach den Tiefenpuffer wieder zulöschen. Das sollte glaube ich auch gehen. hat den Vorteil, dass du trotzdem jedesmal deine Objekte mit tiefentest anordnen kannst, aber die 3 Schichten sich trotzdem nicht in die Quere kommen können.

Edit: Der einfachste Weg um 3d Modelle in einer GUI darzustellen, also in deinen Fenstern, ist Render-To-Texture. Da sind FramebufferObjects ein Segen. Damit kannst du deine 3DScene einfach in eine Textur zeichnen und diese anschließend einfach irgendwo draufpappen, auch auf deine GUI Elemente.
Das mit dem Blur wird schwerer, weil dafür schon einige Tricks wie Shader notwendig sind.

_________________
Klar Soweit?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Render-Ebenen ( 2D / 3D / 2D )
BeitragVerfasst: Mo Sep 20, 2010 10:41 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
zu 1) Wie Sellmann schon andeutet, der Z-Buffer ist der entscheidende Hinweis. Die einfachste Möglichkeit ist beim zeichnen des Hintergrundes das Schreiben in den Z-Buffer zu deaktivieren. Das geht über glDepthMask. Zusätzlich, sollte es erforderlich sein, kannst du mit glEnable/glDisable mit GL_DEPTH_TEST den Tiefentest abschalten. Achtung: Tiefentest und schreiben in den Tiefenbuffer sind zwei verschiedene Dinge.

Zitat:
Kann ich überhaupt in jeder Ebene mit dem gleichen Koordinaten System arbeiten?

Wenn alles "Ebenen" 3D sind kannst du auch wie Sellmann vorschlägt den Z-Buffer zurücksetzen. Das geht mit glClear und dem GL_DEPTH_BUFFER_BIT. In dem Fall kannst du alle Ebenen gleich behandeln.

zu 2) Du kannst Linien sowohl im 2D als auch im 3D Modus rendern. Da die Planeten aber 3D sind, empfehle ich auch die Linien in 3D zu rendern.

Zitat:
so, die nächste Ebene wäre jetzt ein bildschirmfüllender "Blur" der gesamten Scene

Für einen Blur-Effekt sind Shader wirklich zum empfehlen. Entsprechende Shader finden sich in der Shadersammlung. Die Grundidee ist zunächst die Szene (= was immer du auch bluren willst) mittels FBO in eine Textur zu rendern. Diese Textur wird dann mit dem Shader geblurrt. Nach dem du die Textur als Fullscreen-Quad gerendert hast kannst du darüber wieder normal zeichnen...

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Render-Ebenen ( 2D / 3D / 2D )
BeitragVerfasst: Mo Sep 20, 2010 11:38 
Offline
DGL Member

Registriert: Fr Jun 11, 2010 15:56
Beiträge: 3
Ich denke das hilft mir schonmal:

wenn ich euch richtig verstanden habe:

Hintergrund zeichnen
Depth Buffer löschen / und ggf. den Depth Test abschalten
3D Scene zeichnen
Depth Buffer löschen / und ggf. den Depth Test wieder zuschalten???
UI Elemente Zeichnen

dann ggf. das ganze mit FBO das ganze auf ne Textur rendern, Shader drüber, Auf ein Quad als Textur pappen, normal weiter zeichnen?

Viele Dank!


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Render-Ebenen ( 2D / 3D / 2D )
BeitragVerfasst: Mo Sep 20, 2010 12:12 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Du brauchst zwei Texturen die die gleiche Größe wie der Viewport haben. Ich nenne sie hier Textur1 und Textur2.
Code:
if (Szene soll geblurt werden) {
    FBO aktivieren, in Textur1 rendern
}
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
Hintergrund zeichnen
glClear(GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
3D Scene zeichnen
glClear(GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
UI Elemente Zeichnen
if (Szene soll geblurt werden) {
    FBO-Textur wechseln: in Textur2 rendern
    glDisable(GL_DEPTH_TEST);
    Textur1 mit horizontalem Blur-Shader in den FBO rendern (auf ein Quad geklebt)
    FBO deaktivieren
    Textur2 mit vertikalem Blur-Shader in den Framebuffer rendern (auf ein Quad geklebt)
    MessageBox rendern
    glEnable(GL_DEPTH_TEST);
}



Hinweis: Das GL_STENCIL_BUFFER_BIT habe ich hier nur gesetzt weil es geringfügig schneller ist Stencilbuffer und Tiefenbuffer gleichzeitig zu löschen als nur einen davon. Liegt daran das der Depth-Wert (24bit) und der Stencil-Wert (8bit) jeweils zusammengefasst und in einem gemeinsamen Buffer gespeichert werden.

_________________
Yeah! :mrgreen:


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


Wer ist online?

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