Wie ordnet man Voxelgrafik Vegetation zu?



  • Einfache Tutorials die die Voxelgrafik, wie sie in Comanche, Outcast, Magic Carpet oder Delta Force verwendet wurden, erklären ja die Voxelgrafik oft als eine 2d Bitmapgrafik, deren Graustufen die Höhe in der Voxeldarstellung bestimmt.

    Dementsprechend wäre die einfachste Voxelszene eine graustufige Szene in der man Berge und Täler sieht und deren Höhe von der Graustufe abhängt.

    Im Speicher könnte man so etwas also wie ein Bitmap einfach als zweidimensionales Array ablegen.
    z.B. so:
    int voxelszene[10000][10000];

    Was etwa einer Kartengröße von 10000 Voxeln in x und y Richtung entspricht und bei 4 Byte pro Farbstufe 2^32 Höhenunterschiede zuläßt und 381 MB im Speicher belegt.

    Wenn man aber nun Vegetation in der Voxelszene unterbringen will, also z.B. eine grüne Fläche darstellen möchte, die den Rasen darstellen soll, wie bringt man das dann Speichertechnisch in der Szene unter?
    Fügt man dem Array noch eine dritte Dimension zu um derartige Werte zu bestimmen?

    Toll wäre ja so etwas:
    int voxelszene [10000] [10000] [256], wobei aber letzteres als Byte und nicht als int gewertet werden soll, aber so etwas kann man in Hochsprachen ja AFAIk leider nicht unterbringen, es sei denn man nutzt Pointer die wieder selbst extrem viel Platz verschwenden.

    Neben grünem Rasen möchte man natürlich noch ganz andere Sachen visuell darstellen.
    Z.b. eine braune Fläche für fruchtbare Erde.
    eine gelbe Fläche für sandige Wüsten.
    eine weiße Fläche für eine Eisfläche.
    eine blaue Fläche für Wasser.
    eine graue Fläche für Asphalt oder Beton.

    Usw. also alles Dinge, die in Comanche 3 dargestellt wurden.



  • Außerdem würde mich noch interessieren, wieviele Lichtquellen man bei einer Voxelgrafik überhaupt gleichzeitig darstellen kann und ob das von der Rechenpower und dem Verfahren her eine machbare Limitierung gibt?


  • Mod

    ich glaube comanche nutzte 1024x1024 als map groesse mit einem byte fuer die heightmap und einem fuer color.
    es gab dann ein paar spezialfarben die darauf hindeuteten dass an dieser stelle ein bestimmtes objekt z.b. baum oder grass gezeichnet werden soll. man hat also z.b. 240farben und 16 IDs fuer objekte.

    2MB war viel speicher vor 20jahren.



  • Datenstrukturen schrieb:

    Außerdem würde mich noch interessieren, wieviele Lichtquellen man bei einer Voxelgrafik überhaupt gleichzeitig darstellen kann und ob das von der Rechenpower und dem Verfahren her eine machbare Limitierung gibt?

    Das kommt auf deinen Zeichenalgorithmus und deine verwendeten Datenstrukturen an. Wenn du marching cubes machst und das Ergebnis auf die Grafikkarte schickst, bist du völlig unlimitiert. Bei Raytracing theoretisch auch, in der Praxis musst du sehr intelligent vorgehen, damit das bei vielen Lichtquellen echtzeitfähig ist.

    Objekte würde ich nebenbei nicht in der Voxelmap speichern, sondern separat verwalten.


  • Mod

    otze schrieb:

    Wenn du marching cubes machst und das Ergebnis auf die Grafikkarte schickst, bist du völlig unlimitiert. Bei Raytracing theoretisch auch, in der Praxis musst du sehr intelligent vorgehen, damit das bei vielen Lichtquellen echtzeitfähig ist.

    voellig unlimitiert was lichtquellen in echtzeit angeht? wie das?

    Objekte würde ich nebenbei nicht in der Voxelmap speichern, sondern separat verwalten.

    das waere eine menge an daten, gerade fuer sowas wie grass bietet es sich an das im terrain layer zu speichern. gibt viele MMO die das machen (vereinfacht die verwaltung).
    fuers rendern muss man das natuerlich in eine seperate struktur stecken, ueber voxel tracing bekommt man den baum nicht sauber in jedem frame herauss.


Log in to reply