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

Aktuelle Zeit: Di Jun 04, 2024 02:10

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



Ein neues Thema erstellen Auf das Thema antworten  [ 13 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: In ein Quad rendern, geht sowas?
BeitragVerfasst: Sa Apr 06, 2013 09:33 
Offline
DGL Member

Registriert: Do Mär 05, 2009 20:17
Beiträge: 284
Wohnort: Kaiserslautern
Hallo,

mir spukt folgende Idee im Kopf herum...

also ich möchte gerne:
Gitternetzlinien hinter den Modellen sehen,
dafür dachte ich mach ich das so:


ein Quad auf jeder seite der Boundingbox (umhüllende meiner geometrie) zeichnen und mit
Code:
  1. glenable(GL_CULL_FACE)
nur eine Seite darstellen lassen. jetzt müsste ich iwie auf die sichtbare seite zeichnen, also linien im Abstand 10 oder 100 oder so.

nur genau dau fehlt mir ein Puzzlestück, ich kann zwar quads zeichnen und auch linien, aber wie zeichne ich die linien auf das quad? oder ist das überhaupt nicht möglich?

gruß und Dank

Wolfgang


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: In ein Quad rendern, geht sowas?
BeitragVerfasst: Sa Apr 06, 2013 09:43 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Das geht z.B. in dem man die Linien in eine Textur rendert und das Quad dann mit dieser Textur darstellt. Nennt sich Render-To-Texture (RTT) und geht in OpenGL direkt oder aber auch (moderner) über Frame Buffer Objekte. In unserem Wiki gibts dazu entsprechende Tutorials.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: In ein Quad rendern, geht sowas?
BeitragVerfasst: Sa Apr 06, 2013 10:09 
Offline
DGL Member

Registriert: Do Mär 05, 2009 20:17
Beiträge: 284
Wohnort: Kaiserslautern
Super, dann schau ich mir das mal an - sprichst du eine Empfehlung für Anfänger aus? Was ist denn "leichter" umzusetzen?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: In ein Quad rendern, geht sowas?
BeitragVerfasst: Sa Apr 06, 2013 10:22 
Offline
DGL Member
Benutzeravatar

Registriert: Mo Sep 23, 2002 19:27
Beiträge: 5812
Programmiersprache: C++
Ist beides recht einfach umzusetzen. Normales RTT geht halt nur innerhalb des sichtbaren Bereiches. Sprich wenn du in eine Textur rendern möchtest die größer ist als dein sichtbarer Viewport dann wirst du eh FBOs benutzen müssen, also würde ich da gleich von Anfang an mit loslegen. Ich hab mir dafür eine kleine Klasse geschrieben die FBOs kapselt, sowas ist recht schnell erledigt.

_________________
www.SaschaWillems.de | GitHub | Twitter | GPU Datenbanken (Vulkan, GL, GLES)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: In ein Quad rendern, geht sowas?
BeitragVerfasst: Sa Apr 06, 2013 12:48 
Offline
DGL Member

Registriert: Mo Nov 09, 2009 12:01
Beiträge: 200
http://www.delphigl.com/forum/viewtopic.php?p=86094#p86094


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: In ein Quad rendern, geht sowas?
BeitragVerfasst: Mo Apr 08, 2013 18:08 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Ähm, wieso brauchst du für simple Gitterlinien RTT?

Warum erzeugst du nicht einfach ein Mesh mit den Gitterlinen (als GL_LINES) und renderst das ganz normal? Eine Möglichkeit ist das du für die 6 Seiten einzeln entscheiden ob sie sichtbar sind oder nicht. Die andere Möglichkeit ist einfach alle Lines zu rendern und einen Shader entscheiden zu lassen ob sie Backfacing sind oder nicht. Letzteres ist nicht ganz einfach, aber machbar. Details auf Anfrage.

Eine andere Möglichkeit die mit einfällt wäre noch ein Quad mit gekachelter Textur zu rendern. Statt aber die Textur via RTT zu erzeugen, kannst du die auch einfach malen. Ein Problem das du bekommst ist das die Linien beim ranzoomen dicker werden. Ich vermute das war der Grund für den RTT-Ansatz? Jedenfalls kannst du doch auch einfach die Mipmaps manuell generieren. Die Mipmaps werden einfach so angelegt das die Gitterlinie immer 1px dick ist. Du kannst sogar zusätzliche, feinere Unterteilungen einfügen wenn du möchtest.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: In ein Quad rendern, geht sowas?
BeitragVerfasst: Mo Apr 08, 2013 18:23 
Offline
DGL Member

Registriert: Do Mär 05, 2009 20:17
Beiträge: 284
Wohnort: Kaiserslautern
ui...

da hast du mir jetzt aber einiges zum Nachlesen gegeben...
also ich muß erstmal schauen was ein RTT und was Mipmapping ist. :oops:

der Ansatz - also die Idee das in ein Quad zu malen das dann automatisch via backface culling eben nur dann sichtbar is, wenns nicht vor meiner geometrie ist kommt daher das ich keine Idee habe wie ich sonst ermitteln, bestimmen oder wissen kann wann sie sichtbar sein müssen und wann nicht. ich will die gitterlinien hinter und nie vor meinen modellen sehn..

ich hatte mir noch überlegt lauter 1 pixel breite quads als gitter zu rendern, und die halt entsprechend mit backface unsichtbar zu machen.. aber das wäre naja - äh irgendwie seltsam.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: In ein Quad rendern, geht sowas?
BeitragVerfasst: Mo Apr 08, 2013 18:36 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
ich keine Idee habe wie ich sonst ermitteln, bestimmen oder wissen kann wann sie sichtbar sein müssen und wann nicht.

Also die Grafikkarte nimmst vom Prinzip die Normale des Dreiecks (nicht die in den Vertices gespeicherte, sondern sie berechnet diese aus den drei Vertices des Dreiecks) und schaut ob diese Richtung Kamera zeigt oder eben nicht. Die Rechnung lässt sich optimieren, du brauchst nur die Z-Koordinate der Normale berechnen und gegen 0 vergleichen.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: In ein Quad rendern, geht sowas?
BeitragVerfasst: Mo Apr 08, 2013 19:36 
Offline
DGL Member

Registriert: Do Mär 05, 2009 20:17
Beiträge: 284
Wohnort: Kaiserslautern
Coolcat hat geschrieben:
Zitat:
ich keine Idee habe wie ich sonst ermitteln, bestimmen oder wissen kann wann sie sichtbar sein müssen und wann nicht.
Die Rechnung lässt sich optimieren, du brauchst nur die Z-Koordinate der Normale berechnen und gegen 0 vergleichen.


hmm
sorry das kapier ich nicht, gibts dazu vielleicht irgendwo ne skizze?
wieso denn gegen 0?

ich hab mal ein Bild gemacht von dem was ich verstanden hab.
http://screencast.com/t/HasbkaZXfIky


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: In ein Quad rendern, geht sowas?
BeitragVerfasst: Di Apr 09, 2013 23:22 
Offline
DGL Member

Registriert: Do Mär 05, 2009 20:17
Beiträge: 284
Wohnort: Kaiserslautern
Coolcat hat geschrieben:
...und schaut ob diese Richtung Kamera zeigt oder eben nicht. Die Rechnung lässt sich optimieren, du brauchst nur die Z-Koordinate der Normale berechnen und gegen 0 vergleichen.


ok ich hab darüber nochmal etwas gegrübelt und folgendes gebastelt...

Code:
  1.  
  2. var
  3.   PtTY,PtTX,PtTZ, ResultPX,ResultPY,ResultPZ:TGLVector3f;
  4.   puffmatrix : TGLMatrixf3;
  5.   begin
  6.  
  7.   PtTX[0] := 100.0;
  8.   PtTX[1] := 0.0;
  9.   PtTX[2] := 0.0;
  10.   PtTY[0] := 0.0;
  11.   PtTY[1] := 100.0;
  12.   PtTY[2] := 0.0;
  13.   PtTZ[0] := 0.0;
  14.   PtTZ[1] := 0.0;
  15.   PtTZ[2] := 100.0;
  16.  
  17.   glGetfloatv(GL_MODELVIEW_MATRIX,@puffmatrix );
  18.   resultpx := glumatrixmulvec(@puffMatrix[0,0],PtTX);
  19.   resultpy := glumatrixmulvec(@puffMatrix[0,0],PtTY);
  20.   resultpz := glumatrixmulvec(@puffMatrix[0,0],PtTZ);
  21.  
  22.  
  23.   if  (resultPZ[2] >0)  then
  24.   begin
  25.   glbegin(GL_QUADS);
  26. ...
  27. {das eine y deck-quad}
  28. ...
  29.   glend;
  30.   end else
  31.   begin
  32.   glbegin(GL_QUADS);
  33. ...
  34. {oder das andere y deck-quad}
  35. ...
  36.   glend;
  37.   end;
  38.  


@Coolcat, das scheint soweit zu funktionieren, meintest du das so? Anstelle des quads könnte ich dann in der Tat das gitter da hinmalen... ist das besser als FBO?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: In ein Quad rendern, geht sowas?
BeitragVerfasst: Mi Apr 10, 2013 21:23 
Offline
DGL Member
Benutzeravatar

Registriert: Do Dez 29, 2005 12:28
Beiträge: 2249
Wohnort: Düsseldorf
Programmiersprache: C++, C#, Java
Zitat:
wieso denn gegen 0?

Die Grafikkarte berechnet das Culling nach dem Vertexshader. Die Koordinaten der Vertices sind da natürlich schon durch mit der ModelViewProjection-Matrix multipliziert worden. Das heißt der Betrachter befindet sich in (0,0,0) und blickt in Richtung der negativen Z-Achse. Daher reicht es die Z-Koordinate der Normale anzuschauen um zu entscheiden ob das Quad sichtbar ist oder nicht.

Wenn du natürlich im Welt-Koordinatensystem bist sagt die Z-Koordinate nix aus. In dem Fall musst du das dot-Produkt der Normale mit der Blickrichtung der Kamera bilden und dort prüfen ob das Ergebnis kleiner oder größer 0 ist.


Was deinen Code angeht, mir ist nicht ganz klar was du da versuchst. Wenn PtTX,Y,Z das Dreieck sein soll, dann ist resultpx,y,z das transformierte Dreieck. Hier müsstest du dann die Normale Berechnen, also das z.B. Kreuzprodukt von Y-X und Z-X. Das ist dann die Normale von der es reicht die z-Koordinate zu betrachten.

_________________
Yeah! :mrgreen:


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: In ein Quad rendern, geht sowas?
BeitragVerfasst: Do Apr 11, 2013 06:00 
Offline
DGL Member

Registriert: Do Mär 05, 2009 20:17
Beiträge: 284
Wohnort: Kaiserslautern
Coolcat hat geschrieben:
Zitat:
wieso denn gegen 0?

Was deinen Code angeht, mir ist nicht ganz klar was du da versuchst. Wenn PtTX,Y,Z das Dreieck sein soll, dann ist resultpx,y,z das transformierte Dreieck. Hier müsstest du dann die Normale Berechnen, also das z.B. Kreuzprodukt von Y-X und Z-X. Das ist dann die Normale von der es reicht die z-Koordinate zu betrachten.


Achso, nein - PtTX,Y und Z sind die zu testendend (point to test) in die jeweilige Raumrichtung.
Da meine Boundingboxes ja immer parallel zu XYZ liegen.

Ich multipliziere also die gegenwärtige Blickrichtung (Modelviewmatrix) mit der Raumrichtung (z.B. pttx) , Als Ergebnis bekomme ich einen Vektor und anhand dessen versuche ich zu erkennen, welche der beiden jeweiligen Deckflächen ich rendern muß. (Ich hatte gehofft das ist genau das was du vorschlägst)
Für die Deckflächen senkrecht zur X und Y Achse bekomme ich das auch hin, aber ich finde keine eindeutige Bedingung für die beiden Deckflächen senkrecht zu Z.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: In ein Quad rendern, geht sowas?
BeitragVerfasst: Fr Apr 12, 2013 20:47 
Offline
DGL Member

Registriert: Do Mär 05, 2009 20:17
Beiträge: 284
Wohnort: Kaiserslautern
Kleines Update zu dem Thema, ich habe jetzt scheinbar eine eindeutige Bedingung für die beiden letzten Flächen der Boundingbox gefunden und kann jetzt gezielt die jeweils hinter der geometrie liegende Fläche zeichnen (oder halt hoffentlich bald ein mesh aus gittenetzlinien)

Der "Trick" war das Vektorprodukt von x unc y Vektor und dort dann den Z - Wert anschauen... ist dieser größer 0 muß die eine, ist er kleiner 0 die andere Fläche senkrecht zur Z Achse gezeichnet werden.

Wer nicht verstanden hat, was ich überhaupt will kann sich ja das kleine Video hier anschaun, da sieht man wie immer nur die hinter der geometrie liegende Fläche gezeichnet wird. Mit der blauen hatte ich am längsten zu kämpfen.

http://screencast.com/t/1PH7BDgRjjCV

Grüße

Wolfgang


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


Wer ist online?

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