我遇到了一个问题,我的 128 x 128 纹理被绘制为 164 x 128。或者 100x100 绘制为 128x100。几天来一直在尝试调试:非常感谢任何帮助我节省更多头发的帮助:)
我一直在使用 Kevin Glass 的 Space Invaders 104 LWJGL 代码作为参考(阅读:复制/粘贴/更改/学习!),但我不需要多种渲染方法:我正在构建一个仅使用 LWJGL for 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;
}
所以那里有很多我不完全理解的代码,但我无法直观地看到任何似乎会影响我的问题的东西?我的正确游戏大小似乎在每个相关点都通过了。