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

Aktuelle Zeit: Fr Jul 11, 2025 07:59

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



Ein neues Thema erstellen Auf das Thema antworten  [ 5 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Optimierter Rendervorgang mit Licht
BeitragVerfasst: Mi Aug 02, 2006 22:55 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
Tach,

was ist der optimierste weg, Per Pixel Lighting zu renderern bei nem Octree.
Bisher mach ich das so, auf meinem weg:

Dynamischer Octree > Octree Nodes > Objekte > Oberflächen > Vertices (XYZ, Normal, Tangent, BiNormal, Texcoord)
> Indices
> Triangles > Plane

Objekt:

Ein Objekt wäre z.b. nen Würfel, oder ne Treppe.

Jedes Objekt hat ne AABB und eine Transformations matrix.

Jedes Objekt hat n Oberflächen.

Oberfläche:

Oberflächen sind z.b. eine Seite oder mehrere seiten eines Würfels, bezogen auf ein Material.
Hier ein beispiel: Würfel hat 6 Seiten, 4 Seiten haben Material X, 2 Seiten haben Matrial Y, somit gibt es nur 2 Materialen.

Pro Oberfläche binde ich Shader+Texture neu, somit werden viele bind/state changes gemacht.
Jede Oberfläche hat einen eigenen VBO.
Jede Obefläche hat eine Shader information, wo drin stehen welche Texturen benutzt werden, und welches GLSL Shader programm benutzt wird.

Das wäre mal die grobe struktur der geometrie.
Nun folgt der eigentliche Rendervorgang:

Code:
  1.  
  2. Renderloop {
  3.     Camera setzten via gluLookat.
  4.     Frustum berechnen
  5.     Sichtbarkeiten der octreenodes und objekts berechnen via Frustum.
  6.     Farbpuffer und Tiefenpuffer leeren
  7.     Ambientpass {
  8.         Octreenodes > Sichtbare Nodes > Sichtbare Objekte > Zeichnen {
  9.             Pushmatrix
  10.                 Objekt transformationsmatrix einlegen
  11.                 Vertex/Normal und Texcoord Client Array aktivieren
  12.                 Für jede Oberfläche {
  13.                     VBO Binden and aktivieren
  14.                     Vertex/Normal und Texcoord Pointer setzten
  15.                     Farbe schwarz setzen
  16.                     via glDrawArrays() die Dreiecke zeichnen
  17.                     VBO deaktivieren    
  18.                 }
  19.                 Vertex/Normal und Texcoord Client Array deaktivieren
  20.             Popmatrix
  21.         }
  22.     }
  23.     Für jedes Licht {
  24.         Octreenodes > Sichtbare Nodes > Sichtbare Objekte > Zeichnen {
  25.             Objekt cullen, wenn Licht Sphere nicht die Objekt AABB schneidet.
  26.             Pushmatrix
  27.                 Objekt transformationsmatrix einlegen
  28.                 Vertex/Normal und Texcoord Client Array aktivieren
  29.                 Für jede Oberfläche {
  30.                     VBO Binden and aktivieren
  31.                     Vertex/Normal und Texcoord Pointer setzten
  32.                     Texturen binden and aktivieren
  33.                     GLSL Shader binden und aktivieren
  34.                     VertexAttribPointer setzten
  35.                     Farbe weiss setzten
  36.                     via glDrawArrays() die Dreiecke zeichnen
  37.                     GLSL Shader deaktivieren
  38.                     Texturen entbinden und deaktivieren
  39.                     VBO deaktivieren    
  40.                 }
  41.                 Vertex/Normal und Texcoord Client Array deaktivieren
  42.             Popmatrix
  43.         }
  44.     }
  45. }
  46.  


Nun ist das ganze so, es funktioniert zwar alles... ist aber bei vielen Lichter verdammt langsam :(
Sieht screenshot:

Bild

Hätte nun gerne paar vorschläge wie man den Optimalen Rendervorgang für so eine Struktur machen kann, oder wie man seine Struktur besser aufbaut.
Dazu wäre es noch hilfreich, was für weitere Optimierungsmöglichkeiten es gibt für Licht und Geometrie ausser PVS.

Bin für alles dankbar, hab selbst auch paar vorschläge und hätte dazu ebenso gern eure meinung:

Neuer renderloop vielleicht:
Code:
  1.  
  2. Renderloop {
  3.     Camera setzten via gluLookat.
  4.     Frustum berechnen
  5.     Sichtbarkeiten der octreenodes und objekts berechnen via Frustum.
  6.     Sichtbarkeiten der Lichter berechnen via Frustum und Octree (lichter werden als Objekt AABBs behandelt)
  7.     Farbpuffer und Tiefenpuffer leeren
  8.     Ambientpass {
  9.         Octreenodes > Sichtbare Nodes > Sichtbare Objekte > Zeichnen {
  10.             Pushmatrix
  11.                 Objekt transformationsmatrix einlegen
  12.                 Vertex/Normal und Texcoord Client Array aktivieren
  13.                 Für jede Oberfläche {
  14.                     VBO Binden and aktivieren
  15.                     Vertex/Normal und Texcoord Pointer setzten
  16.                     Farbe schwarz setzen
  17.                     via glDrawArrays() die Dreiecke zeichnen
  18.                     VBO deaktivieren    
  19.                 }
  20.                 Vertex/Normal und Texcoord Client Array deaktivieren
  21.             Popmatrix
  22.         }
  23.     }
  24.  
  25.     Für jedes sichtbare Licht im octree {
  26.         Für jedes Material (Oberfläche) {
  27.             Texturen binden and aktivieren
  28.             GLSL Shader binden und aktivieren
  29.             VertexAttribPointer setzten
  30.             Farbe weiss setzten
  31.  
  32.             Octreenodes > Sichtbare Nodes > Sichtbare Objekte > Zeichnen {
  33.                 Objekt cullen, wenn Licht Sphere nicht die Objekt AABB schneidet.
  34.                 Nur Aktuelles material (oberfläche) {
  35.                     Pushmatrix
  36.                         Objekt transformationsmatrix einlegen
  37.                         Vertex/Normal und Texcoord Client Array aktivieren
  38.                         VBO Binden and aktivieren
  39.                         Vertex/Normal und Texcoord Pointer setzten
  40.                         via glDrawArrays() die Dreiecke zeichnen
  41.                         VBO deaktivieren    
  42.                         Vertex/Normal und Texcoord Client Array deaktivieren
  43.                     Popmatrix
  44.                 }
  45.             }
  46.  
  47.             GLSL Shader deaktivieren
  48.             Texturen entbinden und deaktivieren
  49.         }
  50.     }
  51. }
  52.  


Danke schonmal im voraus,
Final


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Aug 03, 2006 00:44 
Offline
DGL Member

Registriert: So Feb 19, 2006 23:46
Beiträge: 55
Sehe ich das richtig, dass du für jedes Licht einen einzelnen Renderpass machst? Das ist bei 20 Lichtern scho eine ganze Menge Arbeit. Besser wäre es natürlich, wenn du alle Lichter in einem einzigen Durchgang abarbeitest, um verschiedene Berechnungen wie die normalisierung der interpolierten Normalen oder die Berechnung des Eye-Vektors nur einmal durchzuführen.
Wenn es wirklich mehr Lichter sein sollen, als es ein einzelner Shader schafft, kannst du dir mal Deferred Shading anschauen, was ebenfalls dazu geeignet ist, bestimmte per-pixel-Operationen nur einmal durchzuführen.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Aug 03, 2006 14:43 
Offline
Guitar Hero
Benutzeravatar

Registriert: Do Sep 25, 2003 15:56
Beiträge: 7810
Wohnort: Sachsen - ERZ / C
Programmiersprache: Java (, Pascal)
Falls die Lichter statisch sind und die angeleichteten Objekte ebenfalls, dann benutz lieber Lightmaps. Da kannst du ne menge Leistung sparen. Lichter sind so ziemlich die größten Bremsklötze überhaupt.

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


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Aug 03, 2006 18:09 
Offline
DGL Member

Registriert: Mi Dez 15, 2004 20:36
Beiträge: 454
Wohnort: Wien, Österreich
Zitat:
dann benutz lieber Lightmaps.
Sollte er mit Bumpmapping arbeiten, dann fällt dieser Vorschlag ins Wasser.

_________________
"Meine Mutter sagt : 'Dumm ist der, der Dummes tut'." - Forrest Gump


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Do Aug 03, 2006 19:25 
Offline
DGL Member

Registriert: Mi Okt 16, 2002 15:06
Beiträge: 1012
sniper hat geschrieben:
Zitat:
dann benutz lieber Lightmaps.
Sollte er mit Bumpmapping arbeiten, dann fällt dieser Vorschlag ins Wasser.


Genauso siehts aus, das wird eine moderne GL Engine, die erst ab Pixel 2.0 Grafikkarten läuft. (Radeon 8500 +, Geforce FX +)
Es baut komplett auf shader auf, ohne Shader geht da gar nix.
Parallax mapping, Stencil Shadow Volumes via Shader, Glass, Wasser alles via shader.

Ich bastel gerade nen komplett neuen rendervorgang, hoffe mal das ich damit mal performance rausholen kann.

Lichter werden als AABB´s Objekte gehandelt und ebenso wie die Geometrie in den Octree einsortiert.
Da der Octree dynamisch ist, passen sich die Nodes an entsprechend der Licht AABB.

Werde auch sachen berücksichtigen wie Dynamic Occlusion Culling und Scissor rects.

Später wird dann auch nen PVS fürs Octree dazukommen, ne idee hab ich dazu schon.

Wenn ichs fertig habe, poste ich mal ne Binary zum anschauen, bastel auch noch ne schicke techdemo map mit Radiant dazu ;)


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 » Allgemein


Wer ist online?

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