AW: Aufbau von Klassen für 3D rendering
2. Jan 2012, 00:54
Minecraft ist wegen seiner Voxel-Welt ein Spezialfall. Im Grunde würde da ja jeder Würfel für sich gezeichnet werden, was aber nicht nötig ist, da oftmals eine Menge von Würfeln einfach nur eine große Fläche ergeben. Daher ist dort noch eine Zwischenschicht, die von den Objekten gesagt bekommt: "So würde ich gerne aussehen", der Tesselator weiss aber im Gegensatz zum einzelnen Objekt, dass es in der Nachbarschaft noch andere gibt, durch die sich das vereinfachen lässt.
Es gibt ganz grob zwei mögliche (und praktizierte) Wege in "normalen" 3D-Szenen:
1) Jeder zeichnet sich selbst
2) Jeder übergibt seine Randdaten an einen Renderer, der dann abschließend alles in einem Rutsch zeichnet
Nummer 2 hat den großen Vorteil, dass man durch entsprechend intelligentes Gruppieren seine Resourcen effizienter nutzen kann, und vor allem weit weniger State-Changes auslöst (Wechsel von Shadern, Texturen, Buffertypen), aber eben erkauft durch den Overhead einer Verwaltungsschicht. Der Gewinn ist dann eher bei komplexeren Szenen zu erwarten. Bei Methode 1 muss man auch ein wenig drauf achten, dass jedes Objekt seinen Durchlauf immer sauber verlässt, also Matrixstack anfangs gepusht, nachher gepoppt, States zurück gesetzt, etc. pp., sonst kann es mal passieren, dass das bloße Zeichnen eines Teils alle nachfolgenden bzw. untergeordneten Teile ungewollt beeinflusst.
1 ist also eher Quick & Dirty für kleinere überschaubare Dinge, Nummer 2 ist aufwendiger in Implementierung und (zunächst) Laufzeit, lohnt sich aber in aller Regel schon.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
|