Dschungel-Rendering
Verfasst: 23.01.2013, 00:25
Nabend,
wie ich ja schonmal am Rande erwähnt habe, würde ich gerne meine 'Grafikengine' neu schreiben. Hauptsächlich geht es mir zunächst erst einmal darum, Unmengen an Vegetation schnell rendern zu können, aber dafür bietet mein bisheriges Grafikgrundgerüst einfach keine gute Grundlage.
Mal als Zusammenfassung, was ich jetzt habe:
Eine Klasse, die ein 3D Modell repräsentiert, das sich selber zeichnen kann. Im Hintergrund unterklasse für Submeshes, Materialien, ein Manager um nichts doppelt zu laden und so weiter. Problem: Ich kann nichts Objektübergreifend optimieren, habe pro Submesh pro Material einen Drawcall, alles wird zigfach redundant gesetzt. Meh.
Neue Ansatz:
Globaler Manager für Renderjobs, der die gesamte Szene rendert. Das ganze basiert ein wenig auf folgendem:
http://zfx.info/viewtopic.php?f=7&t=2766&p=35197 (Außenwelten rendern)
http://zfx.info/viewtopic.php?f=4&t=2748 (Datenorientierung)
Im Grunde genommen möchte ich meine Renderjobs gecullt und nach Material sortiert rendern. Das scheint mir das Grundprinzip für effizientes Szene-Rendering zu sein (ein wenig LOD ist auch dabei).
Anfangen möchte ich mit Vegetation, daher der Thread-Titel. Mein bisheriger Plan ist folgender:
Ich habe ein Modell (Grasbüschel, Blume, Busch, etc.; aber nur ein Material) und ein Bereich den ich damit füllen möchte. Dort generiere ich jetzt Positionen und Ausrichtungen (evtl. Vertex-Farben oder sonstiges) und benutze Instancing um dieses Modell in einem Rutsch zu zeichnen. Für eine komplette Wiese/Wald würde ich 3-6 Modelle nehmen, und auf jedes die obige Lösung anwenden.
Als kleine Optimierung würde ich den großen Bereich vielleicht noch in Tiles unterteilen, für jedes einen Sichtbarkeitstest machen und evtl. LOD anschalten, bzw. auf große Entfernung ganz ausblenden. Das aufteilen kann man ja irgendwie dynamisch machen, indem man sagt, es sollen immer mindestens 100 Modelle auf einmal gerendert werden, oder so.
Im Overgroth-Blog waren noch einige nette Ideen, beispielsweise Objekte aus dem Boden fahren zu lassen, um sie langsam einzublenden (so dass sie nicht aufpoppen), oder Gras mit der darunterliegenden Bodenfarbe einzufärben. Aber das sind ja ansich nur kleinere Spielereien die man hinterher im Shader macht (wie auch Animationen, dazu gibt es einen netten GPU-Gems Artikel), von Rendern dürfte das ja mehr oder wenige unabhängig sein.
Später würde ich das ganze zu einer generellen Render-Job-Verwaltung ausbauen, die auch einzelne Meshs rendern kann und so. Da werde ich dann sicherlich nochmal ein paar Fragen zu stellen, zunächst geht es mir nur um Gras.
Was haltet ihr davon? Gibt es noch prinzipielle Tipps? Im Grunde genommen möchte ich möglichst komplexe Szenen rendern, aber das ganze sollte in realistischer Zeit von einer einzelnen Person umsetzbar sein.
wie ich ja schonmal am Rande erwähnt habe, würde ich gerne meine 'Grafikengine' neu schreiben. Hauptsächlich geht es mir zunächst erst einmal darum, Unmengen an Vegetation schnell rendern zu können, aber dafür bietet mein bisheriges Grafikgrundgerüst einfach keine gute Grundlage.
Mal als Zusammenfassung, was ich jetzt habe:
Eine Klasse, die ein 3D Modell repräsentiert, das sich selber zeichnen kann. Im Hintergrund unterklasse für Submeshes, Materialien, ein Manager um nichts doppelt zu laden und so weiter. Problem: Ich kann nichts Objektübergreifend optimieren, habe pro Submesh pro Material einen Drawcall, alles wird zigfach redundant gesetzt. Meh.
Neue Ansatz:
Globaler Manager für Renderjobs, der die gesamte Szene rendert. Das ganze basiert ein wenig auf folgendem:
http://zfx.info/viewtopic.php?f=7&t=2766&p=35197 (Außenwelten rendern)
http://zfx.info/viewtopic.php?f=4&t=2748 (Datenorientierung)
Im Grunde genommen möchte ich meine Renderjobs gecullt und nach Material sortiert rendern. Das scheint mir das Grundprinzip für effizientes Szene-Rendering zu sein (ein wenig LOD ist auch dabei).
Anfangen möchte ich mit Vegetation, daher der Thread-Titel. Mein bisheriger Plan ist folgender:
Ich habe ein Modell (Grasbüschel, Blume, Busch, etc.; aber nur ein Material) und ein Bereich den ich damit füllen möchte. Dort generiere ich jetzt Positionen und Ausrichtungen (evtl. Vertex-Farben oder sonstiges) und benutze Instancing um dieses Modell in einem Rutsch zu zeichnen. Für eine komplette Wiese/Wald würde ich 3-6 Modelle nehmen, und auf jedes die obige Lösung anwenden.
Als kleine Optimierung würde ich den großen Bereich vielleicht noch in Tiles unterteilen, für jedes einen Sichtbarkeitstest machen und evtl. LOD anschalten, bzw. auf große Entfernung ganz ausblenden. Das aufteilen kann man ja irgendwie dynamisch machen, indem man sagt, es sollen immer mindestens 100 Modelle auf einmal gerendert werden, oder so.
Im Overgroth-Blog waren noch einige nette Ideen, beispielsweise Objekte aus dem Boden fahren zu lassen, um sie langsam einzublenden (so dass sie nicht aufpoppen), oder Gras mit der darunterliegenden Bodenfarbe einzufärben. Aber das sind ja ansich nur kleinere Spielereien die man hinterher im Shader macht (wie auch Animationen, dazu gibt es einen netten GPU-Gems Artikel), von Rendern dürfte das ja mehr oder wenige unabhängig sein.
Später würde ich das ganze zu einer generellen Render-Job-Verwaltung ausbauen, die auch einzelne Meshs rendern kann und so. Da werde ich dann sicherlich nochmal ein paar Fragen zu stellen, zunächst geht es mir nur um Gras.
Was haltet ihr davon? Gibt es noch prinzipielle Tipps? Im Grunde genommen möchte ich möglichst komplexe Szenen rendern, aber das ganze sollte in realistischer Zeit von einer einzelnen Person umsetzbar sein.