用glTexCoord2f()纹理三角形条?

时间:2017-03-20 19:06:50

标签: java opengl rendering

我最近完成了基于种子的高度图生成器,现在尝试在生成的地形中添加纹理。首先,我将纹理渲染实现到我的旧TerrainRenderer,后者使用GL_TRIANGLES进行绘制。

这对我的测试纹理很有效:

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

然后我重写了我的渲染器,并使用GL_TRIANGLE_STRIP进行大FPS提升。原始地形渲染完美。

所以我也尝试添加纹理,但我无法弄清楚如何计算三角形的纹理坐标。无论我做什么,总是至少有一个纹理没有正确旋转。 (因此,无缝纹理可能效果不佳)

在这里你明白我的意思:

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

1 个答案:

答案 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。