2017-03-20 8 views
0

Ich habe kürzlich meinen Seed-basierten Heightmap-Generator fertiggestellt und versuche nun, meinem generierten Terrain eine Textur hinzuzufügen. Zuerst habe ich das Textur-Rendering auf meinen alten TerrainRenderer implementiert, der GL_TRIANGLES zum Zeichnen benutzt hat.Einen Triangle Strip mit glTexCoord2f() texturieren?

Das funktioniert sehr gut mit meinem Test Textur:

This works very well with my test texture.

Hier ist mein alter Rendering-Code:

for(int z = 0; z < terrain.terrainSizeZ-1; z++) { 
GL11.glBegin(GL11.GL_TRIANGLES); 
    for(int x = 0; x < terrain.terrainSizeX-1; x++) { 
     GL11.glTexCoord2f(1, 0); 
     GL11.glVertex3f(x*size, terrain.terrain[x][z], z*size); 
     GL11.glTexCoord2f(1, 1); 
     GL11.glVertex3f(x*size, terrain.terrain[x][z+1], (z+1)*size); 
     GL11.glTexCoord2f(0, 0); 
     GL11.glVertex3f((x+1)*size, terrain.terrain[x+1][z], (z)*size); 
     GL11.glTexCoord2f(0, 0); 
     GL11.glVertex3f((x+1)*(size), terrain.terrain[x+1][z], z*size); 
     GL11.glTexCoord2f(1, 1); 
     GL11.glVertex3f(x*size, terrain.terrain[x][z+1], (z+1)*size); 
     GL11.glTexCoord2f(0, 1); 
     GL11.glVertex3f((x+1)*size, terrain.terrain[x+1][z+1], (z+1)*size); 
    } 
    GL11.glEnd(); 
} 

Dann schrieb ich meine Renderer und verwenden GL_TRIANGLE_STRIP für ein großes FPS-Boost. Das raue Terrain wird perfekt wiedergegeben.

Also habe ich auch versucht Texturing hinzuzufügen, aber ich kann nicht herausfinden, wie man die Texturkoordinaten für die Dreiecke berechnet. Es spielt keine Rolle, was ich mache, immer dreht sich mindestens eine Textur nicht richtig. (So, nahtlose Texturen möglicherweise nicht sehr gut)

Hier sehen Sie, was ich meine:

Here you see what i mean

hier mein neuer Rendering-Code ist:

private static void render() { 
    [...] 
    for(int z = 0; z < terrain.terrainSizeZ-1; z++) { 
     GL11.glBegin(GL11.GL_TRIANGLE_STRIP); 

     for(int x = 0; x < terrain.terrainSizeX-1; x++) { 
      nextTextureCoord(); 
      GL11.glVertex3f(x*size, terrain.terrain[x][z], z*size); 
      nextTextureCoord(); 
      GL11.glVertex3f(x*size, terrain.terrain[x][z+1], (z+1)*size); 
     } 

     clearTextureCoord(); 
     GL11.glEnd(); 
    } 
    [...] 
} 

private static int texCoord = 0; 
private static void nextTextureCoord() { 
    if(texCoord == 0) 
     GL11.glTexCoord2f(1, 0); 
    else if(texCoord == 1) 
     GL11.glTexCoord2f(1, 1); 
    else if(texCoord == 2) 
     GL11.glTexCoord2f(0, 0); 
    else if(texCoord == 3) 
     GL11.glTexCoord2f(0, 1); 

    if(texCoord < 3) 
     texCoord++; 
    else 
     texCoord = 0; 
} 

private static void clearTextureCoord() { 
    texCoord = 0; 
} 

Antwort

0

einfach die Fliesen-Funktion verwenden von Texturkoordinaten:

// ... 
for(int x = 0; x < terrain.terrainSizeX-1; x++) { 
    GL11.glTexCoord2f(x, z); 
    GL11.glVertex3f(x*size, terrain.terrain[x][z], z*size); 
    GL11.glTexCoord2f(x, z + 1); 
    GL11.glVertex3f(x*size, terrain.terrain[x][z+1], (z+1)*size); 
} 
// ... 

Im Standard sa mPler-Konfiguration, Texturkoordinaten über 1 Wrap-around, was zu einer Kachelung der Textur führt.

Übrigens, wenn Ihr Projekt nicht schon zu groß ist, würde ich dringend empfehlen, veraltete Funktionen wie glTextCoord2f(), glVertex3f(), etc aufzugeben und zu modernem OpenGL zu wechseln.

+0

Vielen Dank. – nik2038