无法在LWJGL中绘制1280x800纹理

时间:2013-08-21 11:46:16

标签: java opengl lwjgl slick2d

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

enter image description here

这是我的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();

编辑:经过几个小时的搜索,我发现,在我看来,我已经找到了一个奇怪的解决方案,我将图像设为2048x1024并留下了额外的空白。有效。但这是应该如何工作的?所以我想让所有图像大小为2的能力留下空白?或者有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

这里真的没有足够的信息,但我怀疑你有一个非常古老的OpenGL实现(2.0之前的版本)。

较早版本的OpenGL无法使用非二次幂纹理。您必须在加载前重新缩放(拉伸以适合)图像,或者在调整大小后将部分图像留空并修改纹理坐标。

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

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