Java LWJGL:纹理绘制宽度大于指定宽度

Java LWJGL:纹理绘制宽度大于指定宽度,java,opengl,lwjgl,texture-mapping,Java,Opengl,Lwjgl,Texture Mapping,我的128 x 128纹理绘制为164 x 128时出现问题。或100x100绘制128x100。几天来一直在尝试调试:非常感谢任何帮助,以避免我拔出更多的头发:) 我一直在使用凯文·格拉斯的《太空入侵者》104 LWJGL代码作为参考(阅读:复制/粘贴/更改/学习!),但我不需要多种渲染方法:我正在构建一个垂直滚动射击游戏,只使用LWJGL进行GL图形和键盘控制 这个问题似乎发生在我所有的“精灵”上,但我正在关注/调试我的播放器飞船精灵,所以我将在这里使用它作为我的示例。通过屏幕截图验证,它绘

我的128 x 128纹理绘制为164 x 128时出现问题。或100x100绘制128x100。几天来一直在尝试调试:非常感谢任何帮助,以避免我拔出更多的头发:)

我一直在使用凯文·格拉斯的《太空入侵者》104 LWJGL代码作为参考(阅读:复制/粘贴/更改/学习!),但我不需要多种渲染方法:我正在构建一个垂直滚动射击游戏,只使用LWJGL进行GL图形和键盘控制

这个问题似乎发生在我所有的“精灵”上,但我正在关注/调试我的播放器飞船精灵,所以我将在这里使用它作为我的示例。通过屏幕截图验证,它绘制的精灵比使用的原始PNG图像的像素宽。起初,我认为代码可能需要图像作为2^n值,因此我将源代码更新为128 x 128像素图像:这是以164 x 128绘制的。我将我的图像重新创建为100 x 100,并将其绘制为128 x 100。。。所以至少有一个一致的比率发生了!这个比率,以及它每次都是正确的这一事实,让我认为这是一个简单的错误或打字错误

所以我首先关注的是这段代码:

public void draw(整数x,整数y){
//存储当前模型矩阵
GL11.glPushMatrix();
//绑定到此精灵的相应纹理
texture.bind();
//翻译到正确的位置并准备绘图
GL11.glTranslatef(x,y,0);
GL11.GL3F(1,1,1);
//绘制一个四边形纹理以匹配精灵
GL11.glBegin(GL11.GL_QUADS);
{
GL11.glTexCoord2f(0,0);
GL11.glVertex2f(0,0);
GL11.glTexCoord2f(0,texture.getHeight());//texture.getHeight()返回1.0,在调试时确认
GL11.glVertex2f(0,高度);//高度=128px,调试时确认
GL11.glTexCoord2f(texture.getWidth(),texture.getHeight());
GL11.glVertex2f(宽度,高度);//宽度=128px,调试时确认
GL11.glTexCoord2f(texture.getWidth(),0);
GL11.glVertex2f(宽度,0);
}
GL11.glEnd();
//恢复模型视图矩阵以防止污染
GL11.glPopMatrix();
}
我对这段代码调试得最多,认为这是“奇迹发生的地方”,以确保我在适当的情况下通过了glVertex2f的128px,并且glTexCoord2f在适当的情况下获得了1.0的比率。所以我现在的逻辑是,给定的GL是面向3d的,坐标和实际像素之间可能有一些抽象(s T vs X Y?可能是胡说八道…)可能是“画布”或“显示”本身没有被正确设置?因此,游戏世界/GL世界认为当真实世界被绘制为800像素高时,世界是1000像素高的(例如),所以东西是垂直挤压的?因此,我的GL init代码是(包括Glass的注释!):

public void startRendering(){
试一试{
setDisplayMode();
Display.create();
//抓住鼠标,不要在我们玩的时候看到可怕的光标!
鼠标。setgrapped(true);
//启用纹理,因为我们要将其用于精灵
GL11.glEnable(GL11.GL_纹理_2D);
GL11.glEnable(GL11.Glu混合物);
GL11.glBlendFunc(GL11.GL_SRC_ALPHA,GL11.GL_ONE_减去SRC_ALPHA);
//禁用OpenGL深度测试,因为我们正在渲染2D图形
GL11.glDisable(GL11.GLU深度测试);
GL11.glMatrixMode(GL11.GLU投影);
GL11.glLoadIdentity();
GL11.glOrtho(0,GAMESIZE_X,GAMESIZE_Y,0,-1,1);
}捕获(LWJGLEXE){
系统出口(0);
}
初始化();
GameLoop();
}
私有布尔setDisplayMode(){
试一试{
//获取模式
DisplayMode[]dm=org.lwjgl.util.Display.getAvailableDisplayModes(
配子大小X,配子大小Y,-1,-1,-1,60,60);
org.lwjgl.util.Display.setDisplayMode(dm,新字符串[]){
“width=“+GAMESIZE_X,
“height=“+GAMESIZE_Y,
“freq=“+60,
“bpp=“+org.lwjgl.opengl.Display.getDisplayMode().getBitSperpix()});
返回true;
}捕获(例外e){
e、 printStackTrace();
System.out.println(“无法进入全屏,在窗口模式下继续”);
}
返回false;
}

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

我很惊讶这能起作用,在设置投影矩阵(
glOrtho(…)
后,您应该将矩阵模式设置为
glu MODELVIEW
)。将
glRotatef(…)
glTranslatef(…)
之类的转换应用到投影矩阵通常是没有意义的。还有,为什么你要花时间学习旧的、不受欢迎的OpenGL API?停止吧。学习现代OpenGL。谢谢你的建议Michael:我不知道这是不受欢迎的。我将确保搜索一些最近的示例代码。你知道有什么好的初学者教程,最好是工作示例吗?谢谢,安顿:但是没有用:我在glOrtho行之后尝试了GL11.glMatrixMode(GL11.GL_MODELVIEW),似乎没有效果。我尝试删除GL11.glMatrixMode(GL11.GL_投影);在顶部也是,但这导致了看起来像超级放大的图形…完全无法识别的模糊块颜色。