编辑 - 我在等待这个问题时修复了它。我会把这个留给那些遇到这个问题的人。
当我渲染地面图层四边形时,它会在其上方绘制纹理线条。
这是我唯一一个纹理。我甚至检查过是否可能在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;
}
答案 0 :(得分:1)
GL的默认纹理包裹状态为GL_REPEAT
,纹理坐标(1.0)和(0.0)实际上位于图像边缘/边界之间的边界上。
这意味着如果您使用线性纹理滤镜(也是默认值),您的纹素将在四边形的边缘从另一侧(因此称为“重复”)进行部分采样。有两种方法可以解决这个问题,但是如果你只是想在一次性上拉伸这个纹理,那么绝对最简单的方法就是GL_CLAMP_TO_EDGE
用于GL_TEXTURE_WRAP_S
和GL_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);
但是,纹理对象会持久跟踪此状态,因此您只需在首次加载纹理时执行此操作。