移动摄影机时,纹理的边界上会显示白线(或空格)。Java、OpenGL

移动摄影机时,纹理的边界上会显示白线(或空格)。Java、OpenGL,java,opengl,textures,Java,Opengl,Textures,纹理绘制不正确。 正如我所看到的,程序用底线来改变像素的顶行。它将左栏改为右栏。 如果纹理是空的,比如说,在顶部,但底部有黑色像素-当你向上或向下移动相机时,你会看到底线变为空,而顶线不时变为黑色。所以当你向左或向右移动时,它也会改变列。 为了避免这种情况,我尝试擦除边界上的所有像素,并将纹理彼此靠近几个像素,以某种方式将它们粘合起来。但效果有一半好。修正了一个-另一个出现了。 出于某些原因,它会在纹理之间绘制白色或接近白色的线条。我也尝试过修复这个问题,并将纹理移动得更近。到目前为止,他们是一

纹理绘制不正确。 正如我所看到的,程序用底线来改变像素的顶行。它将左栏改为右栏。 如果纹理是空的,比如说,在顶部,但底部有黑色像素-当你向上或向下移动相机时,你会看到底线变为空,而顶线不时变为黑色。所以当你向左或向右移动时,它也会改变列。 为了避免这种情况,我尝试擦除边界上的所有像素,并将纹理彼此靠近几个像素,以某种方式将它们粘合起来。但效果有一半好。修正了一个-另一个出现了。 出于某些原因,它会在纹理之间绘制白色或接近白色的线条。我也尝试过修复这个问题,并将纹理移动得更近。到目前为止,他们是一个接一个的,但这种影响仍然是可见的

当然,我已经检查了StackOverflow,只有一个可能的问题长期没有答案。 这似乎是相似的,并有相关的根源

-常规

-带空格

下面是犯同样错误的小程序的代码:

public class WorkWrong
{
public static void main(String[] args)
{
    //creating a Display
    int wX=650,wY=650;
    try
    {
        Display.setDisplayMode(new DisplayMode(wX, wY));
        Display.setTitle("Useelees");
        Display.setResizable(false);
        Display.create();
    }
    catch(LWJGLException e)
    {
        e.printStackTrace();
        System.exit(0);
    }

    //The Mystery of OpenGL... This code is not mine, and I've never 
    //changed anything here. I just don't know what is changable. 
    GL11.glEnable(GL11.GL_TEXTURE_2D);
    GL11.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);
    GL11.glEnable(GL11.GL_BLEND); //Enables Blending
    GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
    GL11.glViewport(0, 0, wX, wY);
    GL11.glMatrixMode(GL11.GL_MODELVIEW);
    GL11.glMatrixMode(GL11.GL_PROJECTION);
    GL11.glLoadIdentity();
    GL11.glOrtho(0, wX, wY, 0, -1, 1);
    GL11.glMatrixMode(GL11.GL_MODELVIEW);
    GL11.glRenderMode(0);

    //reading textures
    Texture[] texture = new Texture[5];
    texture[0]=PNGUP("0.png");
    texture[1]=PNGUP("1.png");
    texture[2]=PNGUP("2.png");
    texture[3]=PNGUP("3.png");

      while(true)
      {
        //Drawing a square of 4 pictures.
        SquareRender(texture[0],0,0,64,64);
        SquareRender(texture[1],0,64,64,128);
        SquareRender(texture[2],64,0,128,64);
        SquareRender(texture[3],64,64,128,128);

        if(Display.isCloseRequested())
        {
            AL.destroy();
            Display.destroy();
            System.exit(1);
        }

        Display.update();
        Display.sync(30);
     }
     }
现在方法:

private static Texture PNGUP(String n)
{
    try
    {
        TmpTex= TextureLoader.getTexture("PNG", ResourceLoader.getResourceAsStream(n));
    }
    catch(IOException e)
    {
        e.printStackTrace();
    }
    return TmpTex;
}
static Texture TmpTex;


你能添加一些渲染代码来帮助我们更好地理解你在做什么吗?是的!当然可以。让我拿第二个,我会做一个小代码。你使用什么纹理过滤器,什么包裹模式?你可能想用GL_-CLAMP_-TO_-EDGE来防止边界处的缠绕。对不起,我不理解所有这些,因为我对OpenGL有点不了解。我不知道在哪里使用这个GL_夹具,我对包装一无所知。幸运的是,我找到了一个方法,几个小时后我会把它贴在这里。但是,那样做是愚蠢的。如果你能告诉我在哪里使用你建议的东西。。。这将是很好的。因为我在这个网站上被阻止了一个真正糟糕的答案,所以,在我离开之前。如果有人有类似的问题,我对相关问题的糟糕回答可能会对你有所帮助。试一试:
public static void SquareRender(Texture T,float x1,float y1,float x2,float y2)
{
    T.bind();
    GL11.glBegin(GL11.GL_QUADS);
    GL11.glTexCoord2f(0, 0);
    GL11.glVertex2f(x1,y1);
    GL11.glTexCoord2f(1, 0);
    GL11.glVertex2f(x2,y1);
    GL11.glTexCoord2f(1, 1);
    GL11.glVertex2f(x2,y2);
    GL11.glTexCoord2f(0, 1);
    GL11.glVertex2f(x1,y2);
    GL11.glEnd();
}