LWJGL在我的纹理上方添加了一条线

时间:2013-12-24 18:32:14

标签: java opengl render lwjgl slick2d


编辑 - 我在等待这个问题时修复了它。我会把这个留给那些遇到这个问题的人。

问题是我加载的图像是1280 x 100,这不是一个合适的宽高比,所以当我把它改成1280 x 720时,它就自行修复了。

当我渲染地面图层四边形时,它会在其上方绘制纹理线条。 It is the only texture that does that.

这是我唯一一个纹理。我甚至检查过是否可能在PAINT.NET中画了一条额外的线但不是,它在游戏外看起来很正常。

    //Ground
    GL11.glPushMatrix();

    Color.white.bind();
    TextureBuffer.Level_TutorialGround.bind();

    GL11.glBegin(GL11.GL_QUADS);

    GL11.glTexCoord2f(0, 0);
    GL11.glVertex2f(-100, 650);
    GL11.glTexCoord2f(1, 0);
    GL11.glVertex2f(1950, 650);
    GL11.glTexCoord2f(1, 1);
    GL11.glVertex2f(1950, 500);
    GL11.glTexCoord2f(0, 1);
    GL11.glVertex2f(-100, 500);

    GL11.glEnd();

    GL11.glPopMatrix();

这是我的渲染代码,以防万一。

奇怪的是,当我第一次将四边形放置在场景中时它看起来很好,但是在我通过热代码交换(eclipse中的调试模式)重新定位后,它添加了这条线。

编辑:    我的纹理加载东西:(为了空间,我删除了其他纹理的加载东西)

public static void loadTextures() throws IOException {
    try {
    Level_TutorialGround = TextureLoader.getTexture("PNG", ResourceLoader.getResourceAsStream("res/textures/Level_TutorialGround.png"));
        System.out.println("Texture loaded: " + "Level_TutorialGround");
        System.out.println(">> Image width: " + Level_TutorialGround.getImageWidth());
        System.out.println(">> Image height: " + Level_TutorialGround.getImageHeight());
        System.out.println(">> Texture width: " + Level_TutorialGround.getTextureWidth());
        System.out.println(">> Texture height: " + Level_TutorialGround.getTextureHeight());
        System.out.println(">> Texture ID: " + Level_TutorialGround.getTextureID());
    } finally {
        doneLoading = true;
    }

1 个答案:

答案 0 :(得分:1)

GL的默认纹理包裹状态为GL_REPEAT,纹理坐标(1.0)和(0.0)实际上位于图像边缘/边界之间的边界上。

这意味着如果您使用线性纹理滤镜(也是默认值),您的纹素将在四边形的边缘从另一侧(因此称为“重复”)进行部分采样。有两种方法可以解决这个问题,但是如果你只是想在一次性上拉伸这个纹理,那么绝对最简单的方法就是GL_CLAMP_TO_EDGE用于GL_TEXTURE_WRAP_SGL_TEXTURE_WRAP_T

您可以通过设置纹理的换行状态来解决此问题:

TextureBuffer.Level_TutorialGround.bind ();

GL11.glTexParameteri (GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_S, GL12.GL_CLAMP_TO_EDGE);
GL11.glTexParameteri (GL11.GL_TEXTURE_2D, GL11.GL_TEXTURE_WRAP_T, GL12.GL_CLAMP_TO_EDGE);

但是,纹理对象会持久跟踪此状态,因此您只需在首次加载纹理时执行此操作。