menu

Forum

19. Mai 2012, 17:06:45 *

 
Willkommen Gast. Bitte einloggen oder registrieren.

Einloggen mit Benutzername, Passwort und Sitzungslänge
 
 


  Seiten: 1
  Drucken  
kbb
Newbie
*
Beiträge: 16

Wie viele Polygone/TexturMBs <=> Rechner/Grafikkarte ?
am: 02. Juli 2008, 13:43:43
Hallo Lutz,

ich arbeite an dem Projekt, unsere Altstadt vor 250 Jahren umzusetzen. Wir haben von den geschätzten 3-400 Häusern nun 20 fertig modelliert und teilweise texturiert, heute abend gehts testweise in Biont.

Meine Frage ist nun: wie kann ich mir ausrechnen, was Deine Engine im Verhältnis zu CPU und Graka so schafft? Wir haben jetzt an die 60K Polygone, wobei das so gut wie alles noch Quads sind. Engines arbeiten ja intern iDR. mit Triangels, so dass ich also erstmal mit ~120.000 rechnen muss. Dazu kommt dann noch Umgebung wie eine Stadmauer, Türme, Büsche und Bäume sowie dekorativer Kleinkram wie Brunnen, Eimer, Wagen, Ställe usw., so dass am Ende geschätze 2 Mio. Polys da stehen würden.

Natürlich sieht man die nie auf einmal, so dass vermutlich ein Clipping aktiv wird. Aber es gibt sehr wohl die Möglichkeit, etwas höher zu sehen und über einen Teil der Stadt zu schauen, oder auf dem Marktplatz an die 50 Häuser direkt oder durch Lücke zu sehen.

Gibt es da eine grobe Formel, ab wann ich an die Grenzen der Engine komme? Nicht dass die Frage eilig wäre: bis ich die 3-400 Häuser umgesetzt habe, vergeht vermutlich 1/2 Jahr :D Aber für den jetzigen Test wäre es schon klasse, die Last in Etwa ausrechnen zu können, zumal ich das gern per Laptop Freunden und Museen vorstellen möchte.

In die gleiche Richtung geht die Frage nach dem Texturspeicher, wobi der wohl hauptsächlich vom Graka RAM abhängt, oder? Kann man da einfach Breite x Höhe x 3 bzw 4 Byte (TGA mit Alphamap) nehmen, und wie hoch ist da die Last bei Sichtbarkeit/Clipping?

Danke für Deine Mühe :)
Kurt
Lutz
Administrator
Full Member
*****
Beiträge: 219

Re: Wie viele Polygone/TexturMBs <=> Rechner/Grafikkarte ?
Antworten #1 am: 02. Juli 2008, 16:55:06
Das ist echt ne gute Frage und die Antwort hängt stark von der verwendeten Grafikkarte und dem Prozessor des Rechners ab.

>Engines arbeiten ja intern iDR. mit Triangels
Ja, das ist so. Der Renderer von Cinema4D versteht allerdings Triangles und Quads - beim Raytracing ist aber ohnehin einiges ganz anders.

Ich versuche mal grob zu umreissen wie sich das alles in Shockwave3D bzw. Biont3D zusammensetzt.

Texturen:
Texturen werden im VRAM der Grafikkarte immer unkomprimiert gespeichert. Damit hängt der  benötigte Speicherplatz allein von den Ausmassen der Grafik ab. Liegen die Grafiken nicht in brauchbaren Pixelseitenverhältnissen vor, werden die Texturen auf das nächste brauchbare Mass hoch- oder runterskaliert. ( http://biont3d.com/doku/#punkt51 )

In Cinema4D kann man den Benötigten Speicherplatz für Texturen auch ablesen. Dazu einfach in einem Material unter "Illumination" die "Textur: Vorschaugrösse" verstellen bzw. ablesen was in Klammern hinter den Auflösungen steht.

512x512 (1 MB)
1024x1024 (4 MB)
usw.

Es lohnt sich also hier schon mit dem Haushalten zu beginnen. Für Internetanwendungen ist es besser man geht (abhänging von der Zielgruppe) von kleineren Werten aus (z.B. 128 MB).

Shader:
Je mehr Shader in einer Szene Verwendet werden, desto langsamer. Für gute Performance sollten es ~100 sein.

Je mehr Shader auf einem Modell verwendet werden (über Selektionen) desto langsamer wird es. Unter umständen lieber in seperate Modelle aufteilen.

Anzahl der Modelle:
Je mehr Modelle, desto langsamer (das ist relativ unabhängig von der Menge der Polygone). Wenn möglich also so gut es geht Modelle zusammenfassen.

Anzahl der Polygone:
Je mehr Polygone in einer Szene verwendet werden, desto langsamer wird es. Sind die Polygone auf wenige Objekte verteilt, wird es schneller.


Wie optimiert Biont3D?

1. Sichtfeld der Kamera
In Biont3D werden zunächst nur die Modelle gerendert, die auch im Sichtfeld der Kamera sind. Dieses Sichtfeld kann man mit dem "biont_fog" nach hinten clippen.

Es werden dann nur die Modelle gerendert, die sich innerhalb des Sichtpyramide der Kamera befinden.

Ob ein Modell gerendert wird, hängt davon ab, ob die "Boundingsphere" des Modelles innerhalb des Sichtfeldes der Kamera liegt.

Hierzu habe ich mal eine kleine "Terrain"-Demo gebaut:
http://biont3d.com/demo/terrain/
(~9 MB)

Zu sehen ist eine Szene mit insgesamt 281 250 Polygonen aufgeteilt auf 225 Modelle. Die Sichtweite wurde auf 7500 Einheiten begrenzt.

2. Dynamisch Polygonreduktion
Als zweite Methode zur verbesserung der Performance gibt es eine dynamische Polygonreduktion. Diese versucht zunächst bei Modelle die weiter von der Kamera entfernt sind polygone zu reduzieren.

Hierzu eine andere Demo:
http://biont3d.com/demo/highpoly
(~10 MB)

Hier sind 27 Modelle zu sehen, die insgesamt fast 1 000 000 Polygone besitzen. Die Polygonreduktion wird besonders dann sichtbar, wenn man unter "Options" auf "renderstyle: wire" umschaltet.
Wenn zusätzlich auch die "polygonereduction" auf "false" gesetzt wird, wird der Performanceunterschied deutlich.

Wenn man mit dem Button der unter der FPS Anzeige angebracht ist, die Framerate verringert, dann wird auch die dynamisch Polygonreduktion weniger aggressiv.

3. "Backfaceculling"
Standardmässig werden alle Polygone nur von einer Seite gerendert. Wer Modelle braucht, die von beiden Seiten sichtbar sein sollen, kann das auf zwei wegen machen.

Die erste Methode ist das "Shockwave3D-beidseitig" Tag zu verwenden (alternativ auch "mymodel|both") oder das Modell einmal kopieren, normalen umdrehen und mit dem Original "verbinden".

Der Unterschied ist, dass bei Modellen die mit "both" oder dem "Shockwave3D-beidseitig"-Tag markiert sind immer beide Seiten des Modelles gerendert werden. Damit ist die Anzahl der zu rendernden Polygone doppelt so hoch wie die eigentliche Anzahl der Polygone. Wenn man nun die doppelte Anzahl von Polygonen verwendet, wird stets die hälfte ausortiert und die resultierende Menge entspricht lediglich der einmaligen Polygonzahl des Ausgansobjektes. (Ich hoffe das war irgendwie halbwegs verständlich).


Kurzes Fazit:
Wenn die Polygone gleichmässig in der Szene verteilt sind, könnte das ganze theoretisch Funktionieren (Vorrausgesetzt es soll nur auf einem neuere Rechner mit schneller CPU und guter Grafikkarte laufen).

Biont3D ist eigentlich nicht wirklich dafür ausgelegt mit solch grossen Szenen zu hantieren, es sollte primär dazu dienen mit möglichst kleinen Dateien auch übers Internet 3D Inhalte zu verbreiten (und diese Dateien recht schnell und einfach anzufertigen).

Sollte das Projekt nicht in Biont3D funktionieren, kannst du Szene natürlich auch in anderen Engines verwenden. Das geht natürlich deswegen ganz gut, weil alle Arbeiten in Cinema4D erledigt werden und kein gesonderter Leveleditor verwendet werden muss.

Grundsätzlich ist es aber echt eine nicht ganz einfache Angelegenheit solche Szenen vernünftig zu handlen, ich glaube im neuen GTA4 ist das recht gut gelöst.

Grüsse
Lutz

kbb
Newbie
*
Beiträge: 16

Re: Wie viele Polygone/TexturMBs <=> Rechner/Grafikkarte ?
Antworten #2 am: 02. Juli 2008, 23:59:03
Hallo Lutz,

vielen Dank, das war sehr ausführlich!

Das Meiste war in etwa so, wie ich es von anderen 3D Engines her kenne. Was mir neu ist, ist die Wirkung der Anzahl der Shader. Wird wohl schon problematisch, denn die Häuser sind zur Zeit noch alle mit unterschiedlichen Texturen UV gemappt, die Kirche hat z.B. über 20 verschiedene Shader (Ich bin noch immer beim Modeling, hoffentlich wirds morgen was.. dann stelle ich das mal hier vor). Wenn ich die Häuser deshalb alle in Einzelobjekte aufteilte, würden es wieder viel zu viele Objekte. Also muss ich wohl die Texturen und UV Maps zusammenfassen, das müsste doch dann die effektivste Methode sein, richtig? Dann habe ich zum Schluss vllt. an die 1.000 -1.500 Objekte (ok das ist ne Menge) mit je 1 Shader, wobei einige Instanzen sind. Das hilft bei einer Echtzeitengine nicht unbedingt etwas, oder?

Was ich garnicht verstanden habe, war diese Aussage:
Zitat
Ob ein Modell gerendert wird, hängt davon ab, ob die "Boundingsphere" des Modelles innerhalb des Sichtfeldes der Kamera liegt.

Ich nehme mal an, die Boundingsphere hat nu nix mit der als Kollision eingestellten Methode zu tun, sondern ist das in der Boundingbox eingepasste Ellipsoid?! Wie auch immer: wenn nur ein Teil der Sphere in der Sichtpyramide liegt, ist doch auch ein Teil sichtbar. Wieso rendert Biont erst, wenn die ganze Sphere in der Pyramide liegt? Oder habe ich den Satz nu verkehrt interpretiert?

Deine HipolyDemo läuft hier immerhin mit 85 FPS, das ist zum Vorzeigen völlig i.O. Allerdings haste da glaube keinerlei Texturen drin, die das Ganze wiederum verlangsamen würden. Ausserdem habe ich das AA auf "anwendunsgesteuert" stehen, das scheint ohne zu sein.

OK, ich sage schonmal danke fürs Fragen beantworten im Voraus! und gehe noch ein paar Bäume pflanzen..


Edit: Wieso hat das Terrain eigentlich über 200 Objekte, ist das nicht überall die gleiche Textur, und somit effektiver, wenn das ganze Ding als 1 Objekt verpackt würde? Wenn man das besser aufteilt, muss ich das auch noch tun. Was ist da so sinnvoll - das ganze tiefenabhängig zu machen oder wieder Polygoncount?
« Letzte Änderung: 03. Juli 2008, 00:02:40 von kbb »
Lutz
Administrator
Full Member
*****
Beiträge: 219

Re: Wie viele Polygone/TexturMBs <=> Rechner/Grafikkarte ?
Antworten #3 am: 03. Juli 2008, 00:35:07
Noch mal kurz zur "Boundingsphere":

Diese Kugel wird um ein Modell gelegt, so das alle Polygone darin Platz finden. Der Mittelpunkt wird dabei aus der Summe aller Punkte gebildet und der Radius entspricht dann der Distanz zum entferntesten Punk.

Sobald diese Kugel in das Sichtfeld der Kamera gelangt (auch nur ein bisschen), wird das gesamte Modell gerendert. Das ist bei kleinen Modellen besser als bei Grossen. Also alles so wie Du es Dir schon gedacht hattest.

Bin übrigens schon sehr gespannt was von dem Projekt zu sehen.

Zitat
Wieso hat das Terrain eigentlich über 200 Objekte

Das ist nur eine Testdatei die hier rumlag. Aber in diesem Fall ging es mir darum, die Sichtweite der Kamera möglichst gut abschneiden zu können und zu testen wie gut das ganze funktioniert.

Für ein reales Projekt macht es dann doch mehr Sinn ein Terrain in Mehrere Stücke zu teilen die aber grösser sind. Cinema4D scheint auch mal abzustürzen wenn die Polygonanzahl bei einem Modell im hundertausender Bereich liegt.

kbb
Newbie
*
Beiträge: 16

Re: Wie viele Polygone/TexturMBs <=> Rechner/Grafikkarte ?
Antworten #4 am: 03. Juli 2008, 09:33:40
OK, verstehe.
Liege ich mit den Shadern denn richtig, ist es besser nur 1 UV Map + 1 Shader pro Objekt zu haben (dafür dann große Texturen)? Oder birgt das dann auch wieder Probleme? Bis auf den GraKa Speicher, da ists klar.
Lutz
Administrator
Full Member
*****
Beiträge: 219

Re: Wie viele Polygone/TexturMBs <=> Rechner/Grafikkarte ?
Antworten #5 am: 03. Juli 2008, 21:00:36
1 Shader pro Modell wäre schon am besten. Viele grosse Texturen machen es dann auch etwas anstrengend für die Grafikkarte. Wird aber erst dann langsam, wenn auf den normalen RAM ausgelagert werden muss.

Bin aber noch am überlegen auf welche Weise man eine so grosse Szene wie deine sinnvoll splitten könnte, so das Sektoren entstehen die dann dynamisch geladen und wieder entladen werden.

Ich werde auf jeden Fall mal schauen wie man noch weiter optimieren könnte.

Gruss
Lutz
kbb
Newbie
*
Beiträge: 16

Re: Wie viele Polygone/TexturMBs <=> Rechner/Grafikkarte ?
Antworten #6 am: 03. Juli 2008, 21:08:39
Super, danke!

Werde jetzt noch ein paar Bäume und Büsche in die Szene pflanzen und dann endlich mal testen (trau mich nicht :D). Backen muss ich mir erstmal sparen, da sich alle Polys überlagern, sinnigerweise.

Da fällt mir eine Frage zum Terrain ein: ist es möglich, das wie in anderen Games zu lösen? Also z.B. eine kostensparende gekachelte Grastextur unten drunter, ebensolche Erd- und Sandtextur als Sandwich obendrüber und dazwischen zwei terrainfüllende Alphamaps?
(Steht bestimmt wieder in Deiner exzellent ausführlichen Doku und ich habs wieder vergessen..)
Lutz
Administrator
Full Member
*****
Beiträge: 219

Re: Wie viele Polygone/TexturMBs <=> Rechner/Grafikkarte ?
Antworten #7 am: 03. Juli 2008, 22:26:04
Diese Methode um Terrains zu texturieren nennt sich "Texturesplatting" und ist nicht in Biont3D eingebaut (leider).

Das hat zwei einfache Gründe:
1. Es ist innerhalb der Shockwave3D-Engine ein Hack der buggy ist.
2. Ich hab noch keine Idee wie man das aus Cinema4D exportieren könnte.

Im Moment muss man das leider mit verschiedenen Shadern und Texturen lösen und irgendwie "kreativ" werden :)

Einiges kann man zumindest auch über Shadowmaps bzw. Lightmaps lösen. Ich werde da noch mal versuchen eine Demo für anzulegen.

Gruss
kbb
Newbie
*
Beiträge: 16

Re: Wie viele Polygone/TexturMBs <=> Rechner/Grafikkarte ?
Antworten #8 am: 03. Juli 2008, 23:02:51
Wo liegt denn das Problem bei 2., also ausser dass Shockwave da buggy ist? Vllt. kann ich ja eine Idee beitragen. So Du die Methode überhaupt sinnig findest für Biont, der Zweck scheint ja mehr in Richtung Web-Apps gehen zu sollen, also eher kleine Umgebungen für z.B. Konfiguratoren oder Ähnliches, richtig?

Wenns im Moment nicht geht, backe ich mir das Sandwich in PS zusammen zu ner größreren Map und schnibbel dann das Terrain in Stücke von z.B. 4x4 Kacheln (das sind dann etwa 50x50m im Moment). Es werden dann hoffentlich einige Stücke dabei sein, die standardmässig mit nur einer der Texturen belegt sind. Ist zwar etwas umständlich, aber mit Sicherheit einer der geringsten Aufwände im Moment..
« Letzte Änderung: 03. Juli 2008, 23:04:26 von kbb »
Lutz
Administrator
Full Member
*****
Beiträge: 219

Re: Wie viele Polygone/TexturMBs <=> Rechner/Grafikkarte ?
Antworten #9 am: 04. Juli 2008, 12:39:16
Zitat
Wo liegt denn das Problem bei 2., also ausser dass Shockwave da buggy ist?

Es kann zu Abstürzen führen und hat den weiteren Nachteil, das es die Modelle dann als transparent behandelt werden (dies fürht dann zu einem Problem mit anderen transparenten Modellen und deren z-Sortierung)
Transparente Modelle werden in Shockwave3D über den Abstand der Boundingsphere zur Kamera sortiert. Also nur "per Modell" und nicht per Pixel. Das hat zur Folgen das man dann etwas Tricksen muss um das z-Sorting zu überlisten.

Das zweite Problem ist, das der Shockwave3D-Exporter von Cinema4D ein bisschen eingewillig ist wenn es um Alpha-Kanäle geht. Wenn ein Alphakanal verwendet wird, kopiert der Exporter diesen Zusammen mit dem Kanal "Farbe" des Shaders in eine Grafik, so das später nicht mehr zwei Teile vorhanden sind.

Wir können aus Cinema4D heraus nur 4 verschiedene Texturlayer in einen Shader ablegen. Für ein Texturesplatting würde man aber 3 Basismaterialien und zwei Alphakanäle (hoffe ich rechne gerade richtig...) benötigen. Es wäre also notwendig, zunächst verschiedene Shader anzulegen und diese dann beispielsweise auf extra Modellen der Szene beizufügen und dann beim öffnen der Szene zusammenkopieren.

Das ist alles relativ umständlich im Workflow und es kann eben den Player crashen. Ich werde mir das ganze aber trotzdem nochmal ansehen, ich hatte es bisher erstmal rausgelassen und wollte das erst wieder anfassen, wenn es so funktioniert wie es gedacht ist.

Gruss
kbb
Newbie
*
Beiträge: 16

Re: Wie viele Polygone/TexturMBs <=> Rechner/Grafikkarte ?
Antworten #10 am: 06. Juli 2008, 21:42:51
Hallo Lutz,

erst einmal heißen Dank, dass Du Dich dem Thema widmest, wenn es für Dich eigentlich ganz hinten an steht!

Die Anzahl der Layer beim Splatting hängt letztlich davon ab, wieviele verschiedene Materialien man verarbeiten will. Manchmal reichen sicher auch 2+1, also 2 Texturen (Gras+Stein) und 1 Alpha dazwischen, ein andermal sinds 8+7, (Pflaster, Stein, Sand, Gras, Wiese, Heu, Wege Matsch, Wege Stein ...) und den Alphas dazwischen..

Ist mal laut gedacht, ich weiß ja nicht, welche Möglichkeiten Du mit den exportierten Daten hast. Ich vermute mal, Du lässt Biont die Shockwave-Daten interpretieren? Wenn dem so ist, gäbe es dann z.B. die Möglichkeit, einen Umweg über Nullobjekte zu machen? Ich habe gerade die Vorstellung, eine Objektgruppe zu erstellen, wobei das erste das Terrain-Objekt inkl. Mappingkoordinaten ist (solange es noch nicht gesplittet ist) sowie evtl. eine Shadow/Lightmap, und alle weiteren drunter oder drüber sind NULs, die durchnummeriert sind und lediglich eine der gewünschten Texturen oder Alphas tragen, Häufigkeit der Kachelung z.B. über die Namensvergabe festgelegt.
U.U. dann den Alphakanal direkt oder zusätzlich im Colorchannel, je nachdem wie Cinema die beiden Kanäle mischt (Addition, Multiplikation.. was weiß ich ..). Über Deine  Kennzeichnung könnte man dann auslesen, a) was es ist, also Textur oder Alpha, und b) natürlich, wie viele Layer es werden und c) halt die Kachelung, so das überhaupt mit unterschiedlichen Skalierungen geht.
Tja, und zum Schluss muss das Ganze dann irgendwie wieder zusammengemischt werden, am besten gleich mit einem internen Split des Terrains :)  k.A. welche Möglichkeiten Dir da offenstehen.
  Seiten: 1
  Drucken