Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Chase

Alter Hase

Beiträge: 753

Wohnort: Nagaoka / Darmstadt / Düsseldorf

Beruf: fauler Studi

  • Private Nachricht senden

11

25.01.2007, 23:36

Ich nehme mal an, du hast eine fertige20.000x10.000 grosse Textur (wo auch immer die herkommt :p)
Warum schreibst du dir nicht einfach ein kleines Tool, das diese riesen Textur in mehrere kleine Dateien zerteilt - am besten mit entsprechenden Koordinaten im Dateinamen. Dann musst du nicht zur Laufzeit die grosse Datei durchlaufen und kannst dynamisch das laden was gerade gebraucht wird..
Am besten legst du dir dann gleich verschiedene Hoehen an (zb. 200 Dateien a 1024*1024 aus 2km Entfernung und 10 Dateien a 1024*1024 aus 100km Hoehe). Zoomt man dann weit raus, muessten die vielen kleinen Texturen durch eine Grosse ersetzt werden. (aus optischen und Performancegruenden)
- nur eine Idee -

Edit: hhm, das Post von Nox stand eben noch nich da :)
"Have you tried turning it off and on again?"

Black-Panther

Alter Hase

  • »Black-Panther« ist der Autor dieses Themas

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

12

26.01.2007, 09:30

Danke für die vielen Antworten... Ist das dynamische Laden von Texturen nicht viel zu zeitaufwändig? Oder sollte ich das in einem Thread machen?

@chase
Das mit dem Aufteilen wollte ich sowieso machen... damit ich sie als Texture auch laden kann ;)

Wenn das mit dem dynamischen Laden schnell genug von statten geht, dann ist das bisher der vielversprechenste Ansatz... danke!

@Nox
Neinnein... wäre ja langweilig etwas zu programmieren, was es besser schon gibt ;)
Will nicht zu viel verraten... nur soviel: es handelt sich um ein Strategiespiel, wobei man auf der ganzen Welt agieren kann!
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

13

26.01.2007, 10:55

Zitat von »"Black-Panther"«

Danke für die vielen Antworten... Ist das dynamische Laden von Texturen nicht viel zu zeitaufwändig? Oder sollte ich das in einem Thread machen?

Also ich würde einen Thread schreiben der im Hintergrund prüft ob neue Daten geladen werden müssen, sie dann läd und die bestehenden Texturen austauscht.

Soweit mir das bekannt ist werden Texturen überwiegend ohne Kompression abgelegt. Also ist der Speicherbedarf bei einer Textur Breite * Höhe * Farbtiefe.

Vieleicht wäre es das beste wenn du nicht nur mehrere Detailstufen bei den Texturen, sondern auf bei der Planetenkugel verwendest. Dann läuft dein Prog schneller wenn die die halbe Welt darstellen musst und du hast die Möglichkeit deine Welt in Teile aufzuspalten, wenn es um Details geht.

Black-Panther

Alter Hase

  • »Black-Panther« ist der Autor dieses Themas

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

15

26.01.2007, 11:53

Also die Kugel wird sowieso dynamisch erstellt mit verschiedenen LODs...

Warum sollte ich das DDS Format brauchen... Benötige doch nur die große Texture mit allen Details, dann pars ich das Teil und erstell lauter kleine detailierte Texturen und deren MipMaps... dann hab ich doch schon alle LODs!

Nur wie das dann programmiertechnisch ablaufen soll ist mir noch nicht ganz klar.
Mittels Viewfrustum bekomm ich die Eckpunkt des Sichtbaren bereichs auf der Kugel. Dann hab ich mir gedacht (bisheriger Ansatz) dass ich alle nötigen Texturen für diesen Bereich lade und (wenn mehrere) in eine 2048x2048 Texture packe. Sobald das ist, rendere ich die Kugel mit einem Shader der mir mit linearer Kugelinterpolation ausgehend von den ViewFrustumEcken die Vertex-Texturekoordinaten berechnet.
Rein theoretisch müsste das funkionieren. Der einzige Punkt in diesem System, wo ich noch nicht genau weiß wie das funktionieren soll, ist das mit der 2048x2048 Texture. Wie bekomm ich ab besten den signifikanten Bereich in diese Texture hinein? Also... wie weiß ich, welche MipMap ich verwenden muss, wie die Texturen reinzukopieren sind uswusf. der technische aspekt eben ;)
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

Das Gurke

Community-Fossil

Beiträge: 1 996

Wohnort: Pinneberg

Beruf: Schüler

  • Private Nachricht senden

16

26.01.2007, 12:02

@ DDS: Wenn du dir Sorgen machst das das "Hintergrundladen" zu Zeitintensiv oder so wird, wäre DDS doch ein gutes Mittel das abzustellen? Dafür wurde das Format imho ja auch entworden, zur Verringerung von Ladezeiten.

17

26.01.2007, 13:52

Zitat von »"Black-Panther"«

Also... wie weiß ich, welche MipMap ich verwenden muss, wie die Texturen reinzukopieren sind uswusf. der technische aspekt eben ;)


Ich würde die Detailstufen statisch machen und jeder Detailstufe ein modell geben. Dann kannst du die Verteilung der Texturen vorher festlegen und musst sie nicht erst berechnen.

Um herauszufinden welche Detailstufe du einblendest reicht es doch eigentlich den Abstand zur Kugelmitte zu berechnen und dann zu entscheiden.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
if(abstand < 1.0f)
{
   SetDetail(1); // max

}
else if (abstand < 5.0f)
{
   SetDetail(2);
}
// ...

else
{
  SetDetail(x); // geringste Detailstufe

}


Ist doch ganz simpel oder versteh ich dich da so falsch?

Wenn du deine Kugel in Quads eingeteilt hast kannst du ja immer mehrere Quads zusammenfassen. Die neuen Eckpunkte sind dann die neuen Eckpunkte der neuen Texturen.

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

18

26.01.2007, 14:45

Also mein Ansatz für diese Problem:
Du errechnest den Punkt auf der Kugel über dem deine Kamera steht. Dann stellt man fest, auf welche der Texturen sich dieser Punkt befindet. Von dieser Textur nimmst du einfach dann die 8 benachbarten dazu. Wie groß du die Kacheln sein müssen, musst du wohl austesten. Auch mit den Detailstufen musst du einfach Von Bis Bereiche definieren und schauen, ob es gut aussieht.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Black-Panther

Alter Hase

  • »Black-Panther« ist der Autor dieses Themas

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

19

26.01.2007, 19:04

Danke... Ich schau mal wie weit ich komme... WErde mich auf jeden Fall (auch bei Erfolg) melden ;) thx @ all!
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

Black-Panther

Alter Hase

  • »Black-Panther« ist der Autor dieses Themas

Beiträge: 1 443

Wohnort: Innsbruck

  • Private Nachricht senden

20

26.02.2007, 14:22

HI!

Habs jetzt umgesetzt wie vorgeschlagen (imo recht gut)... DOCH: Jedesmal wenn der Thread arbeit bekommt, bricht die Framerate total ein und es kommt zu gewaltigen rucklern. Auch wenn ich auf frame-based-rendering (siehe anderen Thread) umsteige wirds nicht wirklich besser... Habt ihr eine Idee, wie man das ganze FLÜSSIG über die Bühne bekommt?

PS: Nochmals zur Erklärung:
Es wird 20x die Sekunde überprüft, ob sie die LOD-Stufe anpassen soll, oder ob sie der Sektor über dem die Kamera steht verändert hat. Falls ja, wird der Lade-Thread gestartet und mittels einer Pipe die Aufträge zugetragen. Wenn die Kamera bei einer LOD-Stufe von 2 und höher ist (0 ist die 2048x2048-Texture), dann werden lediglich die 3, 2 und 1 LOD der 9 Kacheln unterhalb der Kamera geladen, andernfalls auch die 0 (welche weitaus am längsten braucht!). Sobald der Thread die arbeit abgeschlossen hat, legt er sich selbst wieder schlafen (falls keine neuen aufträge anstehen!)
Im Endeffekt muss bei einem wechsel von Mittelsektor, der thread lediglich 3 weitere Kacheln neu laden, da die anderen 6 übernommen werden können!
stillalive studios
Drone Swarm (32.000 Dronen gleichzeitig steuern!)
facebook, twitter

Werbeanzeige