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