LWJGL:纹理绘制比指定的更宽

时间:2013-08-29 12:07:59

标签: java opengl lwjgl texture-mapping

我遇到的问题是我的128 x 128纹理被绘制为164 x 128.或100x100绘制128x100。一直试图调试好几天:非常感谢任何帮助,以节省我拉出更多的头发:)

我一直在使用Kevin Glass的Space Invaders 104 LWJGL代码作为参考(阅读:复制/粘贴/更改/学习!),除了我不需要多种渲染方法:我正在构建一个垂直滚动射击游戏LWJGL用于GL图形和键盘控制。

问题似乎发生在我的所有“精灵”上,但我正在集中/调试我的玩家船精灵,所以我将把它作为我的例子。通过屏幕截图验证,它绘制的精灵比使用的原始PNG图像的像素更宽。起初我想也许代码需要图像为2 ^ n值,所以我将源更新为128 x 128像素图像:这是以164 x 128绘制的。我将图像重新创建为100 x 100,然后绘制它为128 x 100 ...所以至少有一个比例正在发生!这个比例,以及它每次抽出Y的事实让我觉得这是一个简单的错误或错字......

所以我的第一个重点是这段代码:

public void draw(int x, int y) {
    // store the current model matrix
    GL11.glPushMatrix();

    // bind to the appropriate texture for this sprite
    texture.bind();

    // translate to the right location and prepare to draw
    GL11.glTranslatef(x, y, 0);     
    GL11.glColor3f(1,1,1);

    // draw a quad textured to match the sprite
    GL11.glBegin(GL11.GL_QUADS);
    {
      GL11.glTexCoord2f(0, 0);
      GL11.glVertex2f(0, 0);
      GL11.glTexCoord2f(0, texture.getHeight()); // texture.getHeight() returns 1.0, confirmed while debugging
      GL11.glVertex2f(0, height); // height = 128px, confirmed while debugging
      GL11.glTexCoord2f(texture.getWidth(), texture.getHeight());
      GL11.glVertex2f(width,height); // width = 128px, confirmed while debugging
      GL11.glTexCoord2f(texture.getWidth(), 0);
      GL11.glVertex2f(width,0);
    }
    GL11.glEnd();

    // restore the model view matrix to prevent contamination
    GL11.glPopMatrix();
}

我调试了这个代码最多,认为这是“神奇发生的地方”,以确保我在适当的时候明确地为glVertex2f传递128px,并且glTexCoord2f在适当的情况下获得比率1.0。所以我现在的逻辑是,鉴于GL适用于3D,并且坐标和实际像素之间可能存在一些抽象(ST与XY?也许是说垃圾......)也许它是“画布”或“显示”本身还没有设置属性?所以游戏世界/ GL世界认为世界是1000像素高(例如)当真实世界被绘制800像素高,所以事情被垂直挤压?所以我的GL初始代码是(包括Glass的评论!):

public void startRendering() {

    try {
        setDisplayMode();
        Display.create();

        // grab the mouse, dont want that hideous cursor when we're playing!
            Mouse.setGrabbed(true);

            // enable textures since we're going to use these for our sprites
        GL11.glEnable(GL11.GL_TEXTURE_2D);
        GL11.glEnable(GL11.GL_BLEND); 
        GL11.glBlendFunc(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);

        // disable the OpenGL depth test since we're rendering 2D graphics
        GL11.glDisable(GL11.GL_DEPTH_TEST);

        GL11.glMatrixMode(GL11.GL_PROJECTION);
        GL11.glLoadIdentity();

        GL11.glOrtho(0, GAMESIZE_X, GAMESIZE_Y, 0, -1, 1);

    } catch (LWJGLException le) {
        System.exit(0);
    }

    initialise();
    GameLoop();
}

private boolean setDisplayMode() {
    try {
        // get modes
        DisplayMode[] dm = org.lwjgl.util.Display.getAvailableDisplayModes(
                GAMESIZE_X, GAMESIZE_Y, -1, -1, -1, -1, 60, 60);

        org.lwjgl.util.Display.setDisplayMode(dm, new String[] {
                "width=" + GAMESIZE_X,
                "height=" + GAMESIZE_Y,
                "freq=" + 60,
                "bpp=" + org.lwjgl.opengl.Display.getDisplayMode().getBitsPerPixel() });

        return true;
    } catch (Exception e) {
        e.printStackTrace();
        System.out.println("Unable to enter fullscreen, continuing in windowed mode");
    }

    return false;
}

所以那里有很多我不完全理解的代码,但我不能直观地看到任何似乎会影响我的问题的东西?正确的游戏规模正在看似每一个相关点。

0 个答案:

没有答案