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

Aktuelle Zeit: Sa Mai 18, 2024 05:55

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



Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Culling und Fischauge
BeitragVerfasst: Do Jul 26, 2012 10:47 
Offline
DGL Member

Registriert: Di Jun 26, 2012 08:15
Beiträge: 10
Programmiersprache: C#
Hallo,

ich hab ma wieder 2 Fragen. :-) Zu beiden hab ich bereits google bemüht, finde aber nicht die Auskunft, die ich suche.

Problem 1: Performance!
Ich lese ein komplex Polygon mit >60000 Dreiecken ein und speichere mir das in einer DisplayList. Auf meinem Rechner laufen Animationen (Rotation usw. ) noch super flüssig, aber auf (ich sag mal nicht so guten Rechnern) stockts.
Daher wollte ich ein wenig die Performance heben und dachte ich aktiviere Culling. Da kam gleich eine Frage auf:
Wie lade ich denn meine Dreiecke? Packe ich um das gesamte Polygon (also um die >60000 Dreiecke) das glBegin .. glEnd?

Code:
  1.  
  2. GL.Begin(BeginMode.Triangles);
  3. for (int j = 0; j < Triangles.Count(); j++)
  4. {
  5.            
  6.       GL.Normal3(Triangles[j].Normal.X, vs.Triangles[j].Normal.Y, vs.Triangles[j].Normal.Z);
  7.       GL.Vertex3(Triangles[j].A.drawVector().X, Triangles[j].A.drawVector().Y, Triangles[j].A.drawVector().Z);
  8.       GL.Vertex3(Triangles[j].B.drawVector().X, Triangles[j].B.drawVector().Y, Triangles[j].B.drawVector().Z);
  9.       GL.Vertex3(Triangles[j].C.drawVector().X, Triangles[j].C.drawVector().Y, Triangles[j].C.drawVector().Z);
  10.      
  11. }
  12. GL.End();
  13.  


.. oder um jedes einzelne Dreieck?

Code:
  1.  
  2. for (int j = 0; j < Triangles.Count(); j++)
  3. {
  4.       GL.Begin(BeginMode.Triangles);      
  5.       GL.Normal3(Triangles[j].Normal.X, vs.Triangles[j].Normal.Y, vs.Triangles[j].Normal.Z);
  6.       GL.Vertex3(Triangles[j].A.drawVector().X, Triangles[j].A.drawVector().Y, Triangles[j].A.drawVector().Z);
  7.       GL.Vertex3(Triangles[j].B.drawVector().X, Triangles[j].B.drawVector().Y, Triangles[j].B.drawVector().Z);
  8.       GL.Vertex3(Triangles[j].C.drawVector().X, Triangles[j].C.drawVector().Y, Triangles[j].C.drawVector().Z);
  9.       GL.End();
  10. }
  11.  

Hat eine Methode Nachteile? Funktioniert mit einer das Culling nicht? Ist eine Methode schneller beim Laden/Zeichnen?

Habt ihr vielleicht irgendwelche Tipps, wie ich die 60000 Dreiecke schnell gezeichnet bekomme, sodass ich eine flüssige Animation (Rotation) darstellen kann?
Stehe ein wenig auf dem Schlauch.

Zweite Frage.. hat wenig mit dem anderen zu tun. Auch hier habe ich schon gegooglet, aber ohne Erfolg.
Meine Kamera auf meine Szene erzeugt irgendwie ein leichtes Fischauge. Ich hätte gern eine höhere Brennweite des Objektivs.
Code:
  1.  
  2. float aspect_ratio = Width / (float)Height;
  3. Matrix4 perpective = Matrix4.CreatePerspectiveFieldOfView(MathHelper.PiOver4, aspect_ratio, 1, 100);
  4. GL.MatrixMode(MatrixMode.Projection);
  5. GL.LoadMatrix(ref perpective);    
  6.  

Leider weiß ich nicht, wie ich die Brennweite erhöhen kann. Ich hatte schon
Code:
  1. Matrix4 perpective = Matrix4.CreatePerspectiveFieldOfView(MathHelper.PiOver4, aspect_ratio, 1, 100);

probiert, und sehe eine leichter Verbesserung (kann aber auch Einbildung sein). Ist das der richtige Ansatz?

Viele Grüße
Chris


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Culling und Fischauge
BeitragVerfasst: Do Jul 26, 2012 11:00 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
cmumme hat geschrieben:
Zweite Frage.. hat wenig mit dem anderen zu tun. Auch hier habe ich schon gegooglet, aber ohne Erfolg.
Dafür bitte einen neuen Thread erstellen.

Zur ersten Frage: Performance. glBegin + glEnd sind langsam. Dass da die Performance einbricht ist nicht überraschend. Du wirst dich wohl mit fortgeschrittenen Technologien wie Display Listen und später Vertex Buffer Objects auseinander setzen müssen.

Ein guter Einstiegspunkt wird das Tutorial Lektion 5, Abschnitt Grundgedanken zu Display-Listen sein. Findest du auch viel im Forum zu und ganz sicher auch im Netz :).

Viel spaß & grüße

_________________
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: Culling und Fischauge
BeitragVerfasst: Do Jul 26, 2012 11:30 
Offline
DGL Member

Registriert: Di Jun 26, 2012 08:15
Beiträge: 10
Programmiersprache: C#
Naja, ich benutze doch Displaylisten. Ich unterscheide zwischen Laden und Zeichnen.
Beim Laden werden meine Dreiecke in eine Displaylist gespeichert (siehe Quellcode oben). Beim Zeichnen rufe ich diese auf.

Ich muss doch mit GL.Begin(BeginMode.Triangles) ... GL.End() festlegen, dass ich hier Dreiecke zeichnen möchte (oder Polygone oder iwas anderes).
Oder muss ichd as bei Displaylisten anders machen?

Edit:
Hab grad beie Nehe Tutorials auch gesehen, dass ein GL.Begin..End in der Displaylist ist.
Die Frage (siehe oben) ist halt nur: wo packe ich das GL.Begin .. End rein? Übergeordnet für alle Dreiecke oder für jedes Dreieck?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Culling und Fischauge
BeitragVerfasst: Do Jul 26, 2012 11:44 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Ahso, das mit den Displaylisten habe ich überlesen. Prinzipiell ist jedes Begin/End paar sehr teuer, also willst du es so weit außen wie möglich haben (also deine erste Variante ist die schnelle).

Wenn du aber immer noch Performanceprobleme hast solltest du eventuell probieren VBOs einzusetzen. Wenn du dich erstmal an Culling ranwagen willst, solltest du die Displaylisten in mehrere kleine unterteilen, z.B. 1000 oder 10000 Faces / Liste. Dann zeichnest du immer die komplette Liste, wenn ein Face davon im sichtbaren Bereich liegt.

grüße

_________________
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: Culling und Fischauge
BeitragVerfasst: Do Jul 26, 2012 14:29 
Offline
DGL Member

Registriert: Di Jun 26, 2012 08:15
Beiträge: 10
Programmiersprache: C#
Zitat:
Wenn du aber immer noch Performanceprobleme hast solltest du eventuell probieren VBOs einzusetzen. Wenn du dich erstmal an Culling ranwagen willst, solltest du die Displaylisten in mehrere kleine unterteilen, z.B. 1000 oder 10000 Faces / Liste. Dann zeichnest du immer die komplette Liste, wenn ein Face davon im sichtbaren Bereich liegt.


achherrje.. sowas habe ich mir gedacht. Ja, mal schauen, wie ich das umsetze. Dann muss ich irgendwie meine Displaylisten möglichst geschickt zerpflücken

danke dir :)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags: Re: Culling und Fischauge
BeitragVerfasst: Do Jul 26, 2012 15:06 
Offline
DGL Member
Benutzeravatar

Registriert: Do Sep 02, 2004 19:42
Beiträge: 4158
Programmiersprache: FreePascal, C++
Normalerweise unterteilt man sein objekt dann geschickt mit Raumunterteilungstechniken wie Octrees.

grüße

_________________
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  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 6 Beiträge ] 
Foren-Übersicht » Programmierung » Einsteiger-Fragen


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:  
cron
  Powered by phpBB® Forum Software © phpBB Group
Deutsche Übersetzung durch phpBB.de
[ Time : 0.008s | 14 Queries | GZIP : On ]