Mehrere Texturen für Terrain



  • Hallo,
    ich probiere mich gerade an einer Möglichkeit mein Terrain automatisch Texturieren zu lassen. Das heißt das Endziel soll sein, dass entsprechend seiner Höhe und Steillage einem Face eine bestimmte Textur zugewiesen wird.
    Was mich jedoch vor ein Problem stellt ist folgendes: Bisher habe ich Terrains und Primitives mit nur einer Textur texturiert und dabei jedem Vertex seine Texturkoordinate zugewiesen. Doch nun muss ich ja irgendwie dem Vertex sagen welche Textur er verwenden soll...
    Multitexturing bringt mich da meiner Meinung nach auch nicht weiter, da ich dort soweit ich weiß immer für beide Texturen Koordinaten vergebe, ich will jedoch aber nur je eine für ein bestimmtes Face.

    Hat jemand eine Idee, wie man das Problem lösen könnte?

    (ich nutze übrigens dx9)

    gruß Flori



  • Warum stellst du die Textur nicht einfach um? 😕



  • Geht das ein wenig genauer?
    Wenn du einfach device->SetTexture(...) meinst dann dürfte mir das wenig nützen, da ich nicht die Textur des gesamten Terrain-Meshes beeinflussen will sondern speziellen Teilfaces eine Textur zuweisen will.



  • Du kannst doch auch die gewünschten Primitives einzeln texturieren?! Oder du nimmst eine große Textur für das gesamte Terrain, die halt schon so aussieht, wie sie aussehen soll.



  • irgendwie hab ich einwenig das Gefühl wir reden aneinander vorbei...

    Oder du nimmst eine große Textur für das gesamte Terrain, die halt schon so aussieht, wie sie aussehen soll.

    Genau da besteht ja der Kern der Sache: Genau so soll es nicht gemacht werden. (sofern möglich)

    Du kannst doch auch die gewünschten Primitives einzeln texturieren

    Ich will keine Primitives texturieren sondern einzelnen Vertices/Faces eines Meshs unterschiedliche Texturen zuweisen und wie/ob das geht würde ich gerne wissen.



  • Schreib dir einen Satz von Shadern der anhand der Worldspace y-Koordinate der Face-Normale zwischen deinen Texturen blendet. So wirds normalerweise gemacht. Evtl. kann man auch sehr einfach was mit Volumentexturen basteln...



  • Flori() schrieb:

    Faces eines Meshs unterschiedliche Texturen zuweisen

    Mach SetTexture und rendere dann das Face.


  • Mod

    du kannst per vertex oder mittels einer blendmap zwischen verschiedenen texture layern blenden, so bist du geometrie unabhaengig (da terrain oft LODs verwendet und du kein shading/blending unterschied haben moechtest nur weil es weniger vertices werden).

    siehe:
    http://udn.epicgames.com/Three/TerrainAlphamaps.html



  • ich danke rapso und dot schonmal für ihre Vorschläge

    Bevor ich mich da jedoch ans probieren mache hätt ich zunächst noch eine Frage zu der von mir bisher verwendeten "Lösung". Ich habe ein Bild als Textur geladen, das 4geteilt ist in 4 verschiedene Texturen. Nun habe ich die Texturkoordinaten folgendermaßen vergeben:

    Vertex[i].u = (x%6)*0.1f;
    if( Vertex[i].Pos.y > 150.0f )
      Vertex[i].u += 0.5f;
    Vertex[i].v = (z%6)*0.1f;
    

    Das Ergebnis sind allerdings häßliche Streifen an den Rändern, die wohl durch den Sprung von 0.5f zurück auf 0.0f kommen. Hier ein Bild:
    http://www.bilder-hochladen.net/files/big/4stq-3f.jpg

    Hat vllt dazu jemand eine Idee (ob man was gegen die Streifen unternehmen kann)?


  • Mod

    mach das modulo weg und stell dein texture mode auf wrapping/repeat um, dann machst dass die graphikkarte automatisch, per texel.



  • Naja die kommen wohl daher dass das mit dem Wrapping so nichtmehr wirklich funktioniert, ist die Textur denn überhaupt Tileable? Aber wenn das ganze statisch sein soll kannst dus evtl. wirklich so machen wie ich vorgeschlagen hab: Pack deine Texturen in die Schichten einer Volume Texture. Deine Vertices bekommen dann einfach 3D Texcoords wobei u und v bleiben was sie immer waren und mit w wählst du deine Schicht aus. Damit funktioniert das Wrapping und du bekommst als Folge des Texture Filtering automatisches Blending zwischen den verschiedenen Texturen...



  • rapso schrieb:

    mach das modulo weg und stell dein texture mode auf wrapping/repeat um, dann machst dass die graphikkarte automatisch, per texel.

    Nachdem er jetzt offenbar einen Texture Atlas verwendet gibts natürlich kein Hardware Wrapping mehr...



  • Fuers erste waer wohl doch erstmal das effektivste, einfach jedes Face mit der passenden Textur zu zeichnen, wie es die Frage urspruenglich ja besagte...


  • Mod

    dot schrieb:

    Naja die kommen wohl daher dass das mit dem Wrapping so nichtmehr wirklich funktioniert, ist die Textur denn überhaupt Tileable? Aber wenn das ganze statisch sein soll kannst dus evtl. wirklich so machen wie ich vorgeschlagen hab: Pack deine Texturen in die Schichten einer Volume Texture. Deine Vertices bekommen dann einfach 3D Texcoords wobei u und v bleiben was sie immer waren und mit w wählst du deine Schicht aus. Damit funktioniert das Wrapping und du bekommst als Folge des Texture Filtering automatisches Blending zwischen den verschiedenen Texturen...

    damit wuerde mipmapping nicht mehr funktionieren und blenden wuerde auch nur zwischen den 2 benachbarten layern klappen, also recht eingeschrenkt nutzbar bei terrain.

    Nachdem er jetzt offenbar einen Texture Atlas verwendet gibts natürlich kein Hardware Wrapping mehr

    das hatte ich ueberlesen.
    dann muss man im pixelshader einmal frac(...) auf die koordinaten anwenden.



  • rapso schrieb:

    damit wuerde mipmapping nicht mehr funktionieren und blenden wuerde auch nur zwischen den 2 benachbarten layern klappen, also recht eingeschrenkt nutzbar bei terrain.

    Korrekt, aber es ist sehr einfach zu Implementieren, am Besten würde man das natürlich im Shader machen, aber ich vermute mal dass er noch die FFP verwendet...


Anmelden zum Antworten