我最近完成了基于种子的高度图生成器,现在尝试在生成的地形中添加纹理。首先,我将纹理渲染实现到我的旧TerrainRenderer,后者使用GL_TRIANGLES进行绘制。
这对我的测试纹理很有效:
这是我的旧渲染代码:
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();
}
然后我重写了我的渲染器,并使用GL_TRIANGLE_STRIP进行大FPS提升。原始地形渲染完美。
所以我也尝试添加纹理,但我无法弄清楚如何计算三角形的纹理坐标。无论我做什么,总是至少有一个纹理没有正确旋转。 (因此,无缝纹理可能效果不佳)
在这里你明白我的意思:
这是我的新渲染代码:
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 :(得分: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);
}
// ...
在默认的采样器配置中,纹理坐标大于1环绕,导致纹理平铺。
顺便说一句,如果您的项目已经不是太大,我强烈建议放弃已弃用的功能,如glTextCoord2f(), glVertex3f()
等,并切换到现代OpenGL。