Die Alternative besteht darin, eine Landschaft zu Beginn eines neuen Spiels prozedural zu erstellen – entweder vollständig nach dem Zufallsprinzip oder unter Einbeziehung zusätzlicher Parameter (flache Landschaft, Hügelketten, Insel, Hochgebirge, etc.).
Die beiden nachfolgenden Vorträge (obgleich schon etwas älter, zählen sie meiner Meinung nach immer noch zu den besten Ausarbeitungen) befassen sich mit dieser Problematik und behandeln verschiedene Techniken, die im Rahmen der Landschaftserzeugung zum Einsatz kommen (Erosion, Procedural Noise, Voronoi-Diagramm, Verzerrung, etc.) – mit dem Ziel, dass ein auf diese Weise generiertes Terrain nicht nur „hübsch anzusehen“ sondern darüber hinaus auch für die Verwendung in einem Spiel geeignet (bespielbar) ist.
Procedural Terrain Generation von Jan Finis (Proseminar Game Design, TU München, 2007/2008):
Procedural Terrain Generation von Simon Hager (Proseminar Game Design, TU München, 2007)
Einen ersten Einblick in die Texturierung eines prozedural generierten Terrains bietet der Artikel Terrain Texture Generation von Tobias Franke aus dem Jahre 2001:
Obgleich schon etwas in die Jahre gekommen, beschreibt dieser Artikel eine Methode, die auch heutzutage noch – in Kombination mit weiteren Techniken – zum Einsatz kommt. Hierbei wird das Terrain zunächst in unterschiedliche Höhenbereiche aufgeteilt:
Höhenbereiche 1: Schnee
Höhenbereiche 2: Felsen
Höhenbereiche 3: Felsen+Gras
Höhenbereiche 4: Gras
Jedem Höhenbereich werden nun eine oder mehrere kachelbare Texturen zugeordnet, die beim Rendern miteinander kombiniert werden. Die Kombination der Texturen eines Höhenbereichs sollte jedoch nicht ausschließlich nach dem Zufallsprinzip erfolgen, sondern darüber hinaus die lokalen Gegebenheiten des Terrains berücksichtigen – steile Passagen sind anders zu texturieren als flache Bereiche.
Texture Splatting (alt):
Texture Arrays Terrain Rendering:
Texture Arrays in Kombination mit Gewichtungsfaktoren:
// Hinweis: Weight1+Weight2+Weight3+Weight4 = 1.0
vec4 SurfaceColor =
Weight1*texture(SurfaceTextureArray, vec3(gs_TexCoord[0].st, TextureID1))+
Weight2*texture(SurfaceTextureArray, vec3(gs_TexCoord[0].st, TextureID2))+
Weight3*texture(SurfaceTextureArray, vec3(gs_TexCoord[0].st, TextureID3))+
Weight4*texture(SurfaceTextureArray, vec3(gs_TexCoord[0].st, TextureID4));
vec4 SurfaceColor =
Weight1*texture(SurfaceTextureArray, vec3(gs_TexCoord[0].st, TextureID1))+
Weight2*texture(SurfaceTextureArray, vec3(gs_TexCoord[0].st, TextureID2))+
Weight3*texture(SurfaceTextureArray, vec3(gs_TexCoord[0].st, TextureID3))+
Weight4*texture(SurfaceTextureArray, vec3(gs_TexCoord[0].st, TextureID4));