Terrain Algo - Realtime Verformung



  • hallo,

    ich wollte hier eine Disskussionsrunde starten oder Ideen holen, wie man am besten Terrain für ein Strategiespiel (in der Art von Starctaft, WC3, C&C, ...) darstellen kann.

    Die wichtigen Aspekte die unbedingt berücksichtigt wereden sollen, sind:

    - RealTime-Verformung (Granaten anschläge, etc...)

    - Kamerasicht wie oben beschrieben, und da die Sicht fast von oben ist, spielt die Entfernung also auch LOD keine Rolle.

    Es gibt ja bekanntlich viele Techniken:

    a) BruteForce - denke mal bei heutigen Hardware immer noch zu langsam und uncool 🙂

    b) ROAM - es wird jede Frame jeder Dreieck ausgehen von der Terrain-Mitte immer weiter unterteilt.
    Wenn eine Verformung (Granate) statt findet, wird an der Stelle VertexBuffer gelockt, verändert und wieder an die Grafikkarte geschickt.

    c) GeoMipmapping - hier werden einige verschiedenauflösende Vertexbuffer erstellt und je nachdem passender gerendert. Das wird aber meistens in Spielen aus der Ich-Perspektive verwendet, da diese Vertex-Mipmap Stuffen abhängig von der Entfernung (LOD) genommen werden.
    Also halte ich dieses Verfahren eher ungeeignet für dieses Vorhaben.

    d) Geometrische Clipmaps - diese Technik ähnelt an GeoMipmapping. Finde also auch nicht direkt dafür geeignet.

    Fazit:
    Am geeignetesten finde ich also für so ein Strategiespiel (Perspektive und Verformung) den ROAM-Algorithm, oder hat einer bessere Idee ?


  • Mod

    Sergius schrieb:

    - Kamerasicht wie oben beschrieben, und da die Sicht fast von oben ist, spielt die Entfernung also auch LOD keine Rolle.

    wieso solltest du dann irgend LOD algo verwenden? nur weil's cool ist?

    somit ist die loesung:

    a) BruteForce



  • Ok, also ich habe mich vorerst für eine Lösung ohne LOD Algorithmen entschieden, und werde einfach BruteForce - Ansatz nehmen, da es in der Situation am geeignetesten ist. Wobei ich dann das Terrain noch mit Quadtree in ein paar Terrain-Patches unterteile (ca.32x32 Dreiecke), damit ich nur den Bereich anzeigen (ca. 4 x 4 Patches), der im ViewFrustum liegt.

    Soweit wäre es ok.

    Die zweite Frage war/ist ja noch, wie man Terrainverformung am besten schafft.

    Da habe ich einige Ansätze:

    1. Kompletten Terrain-VertexBuffer (alle Patches) in x,y,z-Koordinaten vorberechnen (FFP) und bei Bedarf (z.B. Granatenanschlag) den VertexBuffer an bestimmten Stelle locken/unlocken, verändern.

    Ist aber ziemlich langsam.

    1. Kompletten Terrain-VertexBuffer (alle Patches) in x,z-Koordinaten vorberechneny und y-Koordinate (Höhe) jede Frame über Heightmap mit Hilfe von VertexShadern mit richtigen Koordinaten füttern.
      Bei TerrainVerformung (z.B. Granatenanschlag) wird Heightmap als RenderTarget an der nötigen stelle upgedated, somit updaten sich auch automatisch die y-Koordinaten des VertexBuffers.

    Diese Methode scheint den Transfer-Bus zu entlasten (hin und her schieben vom VertexBuffer), aber belastet stark die GPU, da die y-Koordinate jede Frame bei jedem Vertex neu gesetzt werden muss.
    Ausserdem ist das glaube ich erst ab VS 3.0 in akzeptabler Geschwindigkeit möglich, da VertexShader erst ab der Version die Heightmap Textur dafür missbrauchen kann (bin mir unsicher).

    So, gibts noch andere Ansätze oder gibts an diese was auszusetzen und was würdet ihr empfehlen ?


Anmelden zum Antworten