Laden...

Terrain mit Textur versehen?

Erstellt von Robertico vor 17 Jahren Letzter Beitrag vor 17 Jahren 3.415 Views
R
Robertico Themenstarter:in
344 Beiträge seit 2006
vor 17 Jahren
Terrain mit Textur versehen?

Möchte ein Terrain erstellen mit vielen verschiedenen Texturen.
Um das zu lernen habe ich mir ein Projekt genommen:

http://www.codeproject.com/cs/media/terrainrendering.asp?df=100&forumid=101594&fr=26&select=1665398&msg=1665398

und für meine Zwecke umgebaut.

-- primitive, aber zunächst ausreichende, Camera
-- Diverse Funktionen in Lua
-- u.a Änderung der Höhen per Lua - Script

Soweit kein Problem ( außer den sicher für eure Augen unsauberen Code ) [es funzt aber]

So, jetzt das Terrain(Texturen). Ich habe keine Ahnung, wie ich dies verändern kann.

Im o.g. Beispiel werden durchgängig nur zwei verschiedene Texturen benutzt.
Oben Felsen, unten Gras.

Wie kann ich sinnvoll jedes Quadrat mit einer eigenen Textur versehen? (Wenn ich eins weis, weis ich alle)

Habe mal ein Spiel mit Terrain erforscht. Diese setzen jede 4erte Textur( X und Z ) und dazwischen wird vermutlich gemischt.

Mein Projekt:

http://robertico.ro.funpic.de/TerrainLua.7z

Wie gesagt: Lacht nicht.

Nötig ist:

DirektX für Managed Code herunter laden:
http://www.microsoft.com/downloads/details.aspx?FamilyId=A1788990-5E11-4AE2-B5E7-CC576822AED4&displaylang=en

Gruß Robert

R
Robertico Themenstarter:in
344 Beiträge seit 2006
vor 17 Jahren

Da ich bisher hier nur vernünftige Antworten bekommen habe, nehme ich an, mir kann niemand helfen.

Möchte keinen neuen Beitrag für meine Idee öffnen, darum mache ich es hier, da es dazu passt.

Man kann ja Terrain laden mit z. B :

                stream1 = Assembly.GetExecutingAssembly().GetManifestResourceStream("CUnit.Properties.Schnee1.bmp");

oder über file.

Nun interessiert mich, ob man eine Textur auch aus mehreren Stücken zusammensetzten kann. (nebeneinander und untereinander)

Bsp.: Habe 64 * 64 Bilder und möchte die zu einer Textur zusammenfügen.

Die Frage ist daher, da das einzelne Rendern der Texturen zu lange dauert. Da man mit SetTexture viel Zeit verliert. Ist es aber in einer Textur, so kann man das mit einem Aufruf der Karte gestalten.

49.485 Beiträge seit 2005
vor 17 Jahren

Hallo Robertico,

wenn du wissen willst, ob man mehrere Bitmaps zu einer großen zusammensetzen kann, das geht einfach: Neue Bitmap erzeugen (new), dann mit Graphics.FromImage ein Graphics-Objekt holen und über dieses mit Graphics.DrawBitmap die kleinen Bitmaps hineinzeichnen.

herbivore

R
Robertico Themenstarter:in
344 Beiträge seit 2006
vor 17 Jahren

Ja herbivore,

Daran habe ich auch gedacht. Nur dazu fehlt der Speicherplatz.

möchte 64 * 64 Bilder á 256 * 256 Pixel. Macht 268,435,456 mal 3. (ohne Transparenz)

Wenn ich die Bilder einzeln zur Grafikkarte schicke, bewältigt sie das spielend. Allerdings geht FPS in gewaltig in die Knie. 60 FPS. Ohne sonst etwas auf der Map.

Die schaffen das nur, dass es vollkommen realistisch aussieht.

Wenn ich die Bilder wesendlich verkleinere..... naja.

Ich kann auch ohne weiteres alle Texturen laden. Keine Ahnung wie das gemacht wird. Aber das Ergebnis ist gut.

Daher kam der Gedanke, alles zu einer Textur zusammen zu fügen und dann mittels Index und TRIANGLE_STRIP zur Karte zu schicken.

Die Zeit der Erzeugung ist eher unwichtig. Danach geht es aber fix.

€dit: Probiert habe ich es noch nicht, wie du sagst, da ich es wegen meiner Rechnung nicht glaube.

Robert

R
Robertico Themenstarter:in
344 Beiträge seit 2006
vor 17 Jahren

Hallo herbivore,

wenn es das, was du geschrieben hast für Bitmaps auch für Texturen gäbe, dann wäre für mich die Welt in ordnung 😉 (zumindest für eine Zeit)

Robert

X
1.177 Beiträge seit 2006
vor 17 Jahren

Hoi Robertico,

Imho sind Texturen ja auch nur Bitmaps - ob jetz t32 oder 48 Bit ist ja egal^^

Aber zu deinem Problem:

Viele Spiele verwenden unterschiedliche Texturen - je nach Entfernung. Insofern sollte es auf alle Fälle eine Möglichkeit geben, einem Dreieck abhängig von der Entfernung eine Textur zuzuweisen.

Weiter gedacht:

Dein Terain ist ja auch nur eine Ansammlung von Dreiecken, welche die "default" (?) Textur benutzen - denen kann man garantiert auch eine andere zuweisen (wie stellt man sonst ein anderes Terrain (Strasse im Feld) dar?) Ich kenn mich nicht wirklich damit aus, aber werden die Dreiecke mittlerweile nicht nur in der Grafikkarte berechnet?

Sry, aber:

Such dir mal ein Beispiel mit einem Model und unterschiedlichen Boden-Texturen. Das sollte Aufschlüsse geben.

🙂

cu Xynratron

PS: Sry nochmal, dass ich hier grad nur theoretisch analysiere, aber hab mich noch nicht mit der Materie beschäftigt. Lass was von den Ergebnissen hören, habe gerne ein schnelles Nachschlagewerk zu Hand^^

Herr, schmeiss Hirn vom Himmel - Autsch!

Die Erfahrung zeigt immer wieder, dass viele Probleme sich in Luft auslösen, wenn man sich den nötigen Abstand bzw. Schlaf gönnt.

R
Robertico Themenstarter:in
344 Beiträge seit 2006
vor 17 Jahren

Hi Xynratron,

Es muss schon einen Unterschied zwischen Bitmaps und Textur geben. Zum einen dauert das Laden einer Bitmap nur halb so lange wie das einer Textur, zum anderen kommt beim Laden von 64 * 64 Bitmaps ein Error und beim Terrain nicht.

Trotzdem ist es eine dumme oder schlechte Idee von mir. da der Ramspeicher um 1,5 GB hochschnellt.

Es muss also einen anderen Weg geben.

Bisher habe ich trotz intensiver suche nur zwei Möglichkeiten gefunden.

Die eine ist eine Bitmap (1024 *1024) für das ganze Terrain. ==> schnell (800 FPS)

Die andere: zwei kleine Bitmaps (Gras und Steine) die je nach Höhe geblendet werden ==> langsam, aber wesendlich schöner. (60 FPS)

Hier hat quasi jedes Quad zwei Bitmaps, die mit unterschiedlicher Transparenz gerendert werden. Das wird u.a. in HLSL gemacht, wovon ich noch keine Ahnung habe. Und es sind nur zwei Bitmaps für die gesamte Map.

Was ich mir bisher gebastelt habe hat auch etwa 60 FPS. Habe aber die Befürchtung, das dies zu langsam ist, da eine Map ja nicht nur aus Terrain besteht.

Und damit die Übergänge von einem zum anderen Terrain nicht abgehackt sind, der Mischungsversuch an anderer Stelle hier. Ich wechsle bei jedem Quad die Textur.

Wenn jemandem in der Richtung etwas über den Weg läuft, wäre ich für eine Info recht dankbar.

Robert

184 Beiträge seit 2005
vor 17 Jahren

Du kannst in DirectX Texturen blenden, wie schon beschrieben mit Detailstufen arbeiten (siehe MipMaps, LOD's) und zur Qualitätssteigerung Detailmaps und entsprechende Filterung einsetzen.
Wenn du mit diesen Stichwörtern in DirectX Foren suchst (kann auch unmanaged DirectX sein, das Prinzip ist das selbe), solltest du eigentlich ausreichend Infos bekommen (das mit dem Mega RAM Verbrauch sollte dir ja schon vom prinzip her zu denken geben, wenn du überlegst was andere 3D Anwendungen hinkriegen 😉)

Gruß
DCoder

E
265 Beiträge seit 2004
vor 17 Jahren

Gleiche Technick wie in 2D vielleicht?
Gemeint sind Tilesets. Es gibt eine große Bitmap die alle möglichen Texturen beinhaltet.
Den Quads weist man die richtigen Texture Koordinaten zu und schon werden nur bestimmte ausschnitte aus dieser Texture dargestellt (grass, schnee, stein).

Also mit dieser erklärung bin ich überhaupt nich zu frieden. Hoffentlich wisst ihr was ich meine.

1.373 Beiträge seit 2004
vor 17 Jahren

Hallo,

Ich muss gestehen, den Thread nicht vollständig gelesen zu haben, aber ich werfe an dieser Stelle den Begriff "Texture Splatting" ein, um den Vorschlag von DCoder zu konkretisieren.

Siehe z.B.
http://www.gamedev.net/reference/articles/article2238.asp oder andere Resourcen, die du über google und "texture splatting" erreichst.

Zeig mal, wenn was dabei herumgekommen ist!

Grüße,
Andre

R
Robertico Themenstarter:in
344 Beiträge seit 2006
vor 17 Jahren

@VizOne

Sieht recht interessant aus. Evtl. genau das, was ich brauche.

Und da mein verstaubtes Englisch immer mehr zum Vorschein kommt, werde ich da schon durchblicken. 😉

Danke, werde berichten.

Robert

N
31 Beiträge seit 2006
vor 17 Jahren

Ich benutze selber für meine Terrains auch nur eine Textur und 'Splatting'.

Die Textur und das Heightfield erstelle ich mit Terragen.

Hier ein Screenshot:

R
Robertico Themenstarter:in
344 Beiträge seit 2006
vor 17 Jahren

Hi neotec,

Ich bin ja auf der Suche nach dem richtigen Weg.

Sage mal meine Gedanken:

Nehme als Beispiel für mich ein Spiel: Siedler 5.

Dort kenne ich mich sehr gut aus. Allerdings nur in der Anwendung. (Maps erstellen/Scripten)

In diesem Spiel haben Sie die Auswahlmöglichkeit um Maps zu erstellen zwischen
64*64 und 768 * 768.

Sie speichern nur jede 4. Textur ab. (im savegame)

Daher müssen die zwei dazwischen eine Mischung sein. (Wenn unterschiedlich)

Und so genau, wie das hin kommt können das keine kleineren Bitmaps als 192 -256 sein.

Irgendwie muss das doch hin zu kriegen sein.

Vielleicht bringt die Endversion von XNA etwas. 😭

Robert

PS: so wie das Speil aufgebaut ist, sind maximal Teile von 4 der 64 *64 Felder sichtbar.

184 Beiträge seit 2005
vor 17 Jahren

Wenn du dich mit Techniken wie Filterung und Detailmaps (sind nur die bekanntesten, kannst dich auch in richtung shader informieren) auseinandersetzt, wist du schnell festsstellen, dass du auch mit kleineren texturen (z.B. 256x256) sehr gute ergebnisse haben kannst.
Einfach eine mega textur zu nehmen, am besten noch zwischen mehreren permanent hin und her switchen ist so das untere niveau der performance 😉