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:
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:
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;
}
Vielen Dank. – nik2038