2017-03-20 10 views
0

私は最近、seedbased heightmapジェネレータを完成させ、生成された地形にテクスチャを追加しようとしました。まず、テクスチャレンダリングを、以前のTerrainRendererに実装しました。これは、描画にGL_TRIANGLESを使用していました。glTexCoord2f()で三角形の線をテクスチャリングする?

これは私のテストの質感と非常によく動作します。ここでは

This works very well with my test texture.

は私の古いレンダリングコードです:

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(); 
} 

それから私は私のレンダラを書き直し、大きなFPSブースト用GL_TRIANGLE_STRIPを使用しました。生の地形は完全にレンダリングされています。

私はまた、テクスチャリングを追加しようとしましたが、私はどのように三角形ストリップのテクスチャ座標を計算するのか分かりません。私が何をするかは関係ありません。常に少なくとも1つのテクスチャが正しく回転していません。 (だから、シームレスなテクスチャは非常に良い動作しない場合があります)

ここでは、私が何を意味するかを参照してください。ここでは

Here you see what i mean

は私の新しいレンダリングコードです:

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; 
} 

答えて

0

ちょうどタイリング機能を使用しますテクスチャ座標の:

// ... 
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); 
} 
// ... 

デフォルトのsa 1つ上のテクスチャ座標がラップアラウンドし、テクスチャのタイリングが発生します。

あなたのプロジェクトがあまりにも大きくない場合は、glTextCoord2f(), glVertex3f()などの廃止予定の機能を放棄して最新のOpenGLに切り替えることを強くおすすめします。

+0

本当にありがとうございます。 – nik2038