0

我的图像是 1280x800,我的屏幕尺寸是 1280x800。它应该画得很完美。但它现在在我屏幕的左上角绘制了一个方形纹理,它超出了比例并且不够大。我不知道为什么它不起作用,我尝试在绘图时将纹理的大小写得更大,它似乎可以工作,但我不知道为什么在 1280x800 四边形上绘图时它不起作用.

在此处输入图像描述

这是我的 OPENGL 和显示设置代码:

    try {

        DisplayMode displayMode = null;
        DisplayMode[] modes = Display.getAvailableDisplayModes();

        for (int i = 0; i < modes.length; i++) {
            if (modes[i].getWidth() == World.SCREEN_WIDTH && modes[i].getHeight() == World.SCREEN_HEIGHT && modes[i].isFullscreenCapable()) {
                displayMode = modes[i];
            }
        }

        Display.setDisplayMode(displayMode);
        Display.setFullscreen(false);
        Display.create();

    } catch (LWJGLException e) {
        e.printStackTrace();
    }

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(0, World.SCREEN_WIDTH, World.SCREEN_HEIGHT, 0, 1, -1);
    glMatrixMode(GL_MODELVIEW);
    glEnable(GL_TEXTURE_2D);

这是我绘制纹理的代码:

    background = TextureLoader.getTexture("PNG", new FileInputStream(new File("res/menu/background.png")));
    girl_01 = TextureLoader.getTexture("PNG", new FileInputStream(new File("res/menu/girl_01.png")));
    girl_02 = TextureLoader.getTexture("PNG", new FileInputStream(new File("res/menu/girl_02.png")));

    glBindTexture(GL_TEXTURE_2D, background.getTextureID());
    glPushMatrix();
    glBegin(GL_QUADS);
    glTexCoord2f(0, 0);
    glVertex2f(0, 0); // Upper left

    glTexCoord2f(1, 0);
    glVertex2f(World.SCREEN_WIDTH, 0); // Upper right

    glTexCoord2f(1, 1);
    glVertex2f(World.SCREEN_WIDTH, World.SCREEN_HEIGHT); // Lower right

    glTexCoord2f(0, 1);
    glVertex2f(0, World.SCREEN_HEIGHT); // Lower left
    glEnd();
    glPopMatrix();

Edit : After searching for hours, I've discovered, I've arrived at a weird solution in my opinion, I made the image 2048x1024 and left the extra blank. it worked. BUT this is how it should work? So I'm suppose to make all image size powers of two leaving the extra space blank? Or is there a better way?

4

1 回答 1

1

There's really not enough information to go by here, but I suspect you have a very old implementation of OpenGL (pre-2.0).

Older versions of OpenGL are incapable of using non-power-of-two textures. You either have to rescale (stretch to fit) the image before loading or leave part of the image blank after resizing and modify your texture coordinates.

如果您有合法的 OpenGL 2.0 实现,它将支持非二次幂纹理。回到 OpenGL 2.0 时代,驱动程序供应商并没有很好地符合要求,并且经常声称无论主机硬件是否真正满足所有要求,都将实现 OpenGL 版本。非二次幂纹理可能是最大的违规,当时的许多硬件可以处理 OpenGL 2.0 所需的一切,除了 NPOT 纹理。

GL_ARB_texture_non_power_of_two在任何情况下,如果您在无法保证 OpenGL 2.0 的平台上,您应该在使用 npot 纹理之前检查扩展。

于 2013-08-21T15:27:50.617 回答