# LWJGL: Terrain-Texturen / 2D-Array in Shader?



## Times (24. Jan 2016)

Hallo liebe Spieleentwickler 

ich bastle schon seit einiger Zeit an einem kleinen Spiel und habe immer mal wieder Probleme mit dem Koordinieren der darzustellenden Texturen.

Zu anfang habe ich das ganze über eine simple Blendmap (RGB) geregelt und später dann noch mit RGBA verfeinert, wobei hierbei das große Problem war das ich maximal 3 verschiedene Texturen haben kann auf meinem Terrain.
Dies habe ich dann durch eine zweite Blendmap auf 6 Texturen erweitern können.
Der Shader hat sich die Farben aus der ersten und der zweiten Blendmap geholt und diese zusammenaddiert. Dies könnte ich nun mit X weiteren Blendmaps machen, aber der Aufwand um diese zu generieren bei einem zufälligen Terrain ist sehr hoch.

Desweiten soll ich später vom Spieler möglich sein die Texturen zu ändern (zB. ist es möglich Terraforming zu betreiben) und dadurch sollen sich die Texturen auch ändern. Hierbei ist dann das Problem das ich eine Blendmap die in Benutzung ist nicht einfach so ändern kann. Ich müsste das Spiel dementsprechend pausieren - die Datei freigeben, bearbeiten, speichern und das ganze neu in den Shader laden und das scheint mir nicht die optimale Lösung zu sein.

Ich habe mir nun selber eine Art Lösung dafür überlegt und wollte zunächst einmal fragen was ihr davon haltet, bzw. ob ihr bessere Vorschläge habt - bzw. wie ich weiter verfahren kann wenn dies eine aktzeptable Lösung wäre (Da ich hierbei auch nicht weiter wüsste...)

Meine Idee:
Statt für jede "TerrainArt" eine Textur zu erstellen würde ich eine Textur-Datei für alle Texturen erstellen, welche jeweils die gleiche Grösse in der gesamten Datei haben.
Zum Beispiel in einer 1024x1024 großen Datei könnte ich 16 Texturen der Grösse 128x128 unterbringen.
Bei der Generierung der Blendmap würde keine Bilddatei mehr entstehen, stattdessen würde ich für jede Koordinate der Welt die Textur-Index'e abspeichern. 0|0 wäre also die erste Textur in der gesamten Textur-Datei. Um Transparenz zu ermöglichen müsste ebenfalls ein Transparenzwert abgespeichert werden, wobei: 
Problem: Ich müsste pro Koordinate beliebig viele Objekte mit TexurenIndex'e/Transparenz abspeichern können nunja.. auf einer 1000x1000 großen Map wären das 1.000.000 Listen, und das empfinde ich nicht als wirklich passend und würde vermutlich den ganzen RAM auseinanderreissen. Ich könnte mich allerdings auf 3 Einträge pro Koordinate beschränken und diese alle in ein Objekt packen.

Das andere Problem welchen sich mir dann noch in den Weg stellen würde wäre das ganze an den FragmentShader zu übergeben.
Da mir keine Möglichkeit bekannt ist eigene Objekte an den Shader zu übergeben müsste ich bei 3 Texturen pro Koordinate insgesamt 6 2D-Arrays an den Shader übergeben.
(3x vec2 für die Texture-Index'e und 3x für die Transparenzwerte).
Und hierbei bin ich mir nun auch nicht sicher ob das so optimal wäre,
da diese Arrays Grössen haben von [1000][1000].

Nun das war es von meiner Seite aus.
Falls ihr das was ich geschrieben habe für völligen Schwachsinn haltet, kann ich das durchaus verstehen.
Ich bin für jede Hilfe dankbar.

Grüße
Times


----------



## Times (24. Jan 2016)

Hallöschen,

habe nocheinmal darüber nachgedacht und nunja.. das mit der Übergabe von 2D-Arrays an den Shader ist natürlich vollkommender Schwachsinn. Ich übergebe ja bereits die TexturKoordinaten an den Shader. 
An dieser Stelle rechne ich diese nun direkt um auf die richtige Position in der Textur und danach sollte es auch funktionieren. Zusätzlich kann ich das Arrays noch um einen Transparenzwert erweitern.
Um zusätzliche TextureKoordinaten zu übergeben kopiere ich einfach das ganze beliebig oft und bin fertig.

Grüße
Times


----------



## Times (24. Jan 2016)

Hallo,

wollte nur nocheinmal Bescheid geben das es alles soweit geklappt hat wie im vorherigen Beitrag geschrieben.

/closed

Grüße
Times


----------

