图像不是2的幂次方?

11

我用libGDX做了一个雨滴教程项目,但是当我尝试将其部署到模拟器时,出现错误提示说图像不是2的幂次方。但是我按照教程建议使用GIMP调整了图像大小为48X48。我想他可能添加了一些代码以确保可以添加不一定是2的幂次方的图像?

有人知道如何解决吗?让它成为2的幂次方会有点限制,不是吗?我非常仔细地跟随了教程!所以...我不确定该去哪里。我是libGDX的初学者。

LogCat Dump:

06-11 00:22:50.942: W/dalvikvm(545): threadid=11: thread exiting with uncaught exception (group=0x409c01f8)
06-11 00:22:50.952: E/AndroidRuntime(545): FATAL EXCEPTION: GLThread 72
06-11 00:22:50.952: E/AndroidRuntime(545): com.badlogic.gdx.utils.GdxRuntimeException: Texture width and height must be powers of two: 48x48
06-11 00:22:50.952: E/AndroidRuntime(545):  at com.badlogic.gdx.graphics.Texture.uploadImageData(Texture.java:197)
06-11 00:22:50.952: E/AndroidRuntime(545):  at com.badlogic.gdx.graphics.Texture.load(Texture.java:179)
06-11 00:22:50.952: E/AndroidRuntime(545):  at com.badlogic.gdx.graphics.Texture.create(Texture.java:159)
06-11 00:22:50.952: E/AndroidRuntime(545):  at com.badlogic.gdx.graphics.Texture.<init>(Texture.java:133)
06-11 00:22:50.952: E/AndroidRuntime(545):  at com.badlogic.gdx.graphics.Texture.<init>(Texture.java:122)
06-11 00:22:50.952: E/AndroidRuntime(545):  at com.badlogic.drop.Drop.create(Drop.java:38)
06-11 00:22:50.952: E/AndroidRuntime(545):  at com.badlogic.gdx.backends.android.AndroidGraphics.onSurfaceChanged(AndroidGraphics.java:292)
06-11 00:22:50.952: E/AndroidRuntime(545):  at android.opengl.GLSurfaceView$GLThread.guardedRun(GLSurfaceView.java:1455)
06-11 00:22:50.952: E/AndroidRuntime(545):  at android.opengl.GLSurfaceView$GLThread.run(GLSurfaceView.java:1216)
06-11 00:22:51.041: I/AndroidInput(545): sensor listener tear down
06-11 00:22:51.041: I/AndroidGraphics(545): Managed meshes/app: { }
06-11 00:22:51.041: I/AndroidGraphics(545): Managed textures/app: { }
06-11 00:22:51.041: I/AndroidGraphics(545): Managed shaders/app: { }
06-11 00:22:51.041: I/AndroidGraphics(545): Managed buffers/app: { }

2
32和64是2的幂。48不是。 - user149341
1
教程中提到我们可以将其更改为48x48。我认为他在其中添加了一些代码以确保它不会出错。有没有办法做到这一点?这样图片就不必是2的幂次方了吗?就像我说的,我按照教程中建议的将图像调整为48X48...奇怪:S - BigBug
http://code.google.com/p/libgdx/wiki/SimpleApp - BigBug
5
他说:“注意:我们明确要求使用OpenGL ES 2.0。这允许我们加载不具有二的次幂尺寸的图像,这对于在OpenGL ES 1.0中使用图像是必需的。” - BigBug
2
使用2的幂可能看起来有限制,但实际上你不会发现这是个问题。为了绕过这个限制,将你的纹理(在libgdx中有一个纹理打包器)打包成一个大纹理,并使用纹理图集访问每个单独的纹理区域。这是一件好事,因为对于OpenGL来说,切换纹理是一个相对较慢的操作。 - R Hyde
3个回答

30

48x48不是2的幂。根据文本所述,该应用程序需要OpenGL ES 2.0。标准模拟器仅运行OpenGL ES 1.0。您可以将图像重新缩放为32x32,然后在OpenGL ES 1.x上一切都将按预期工作。

我建议不要使用模拟器测试OpenGL ES应用程序。相反,请使用真实设备。


好的答案。这让我很烦恼,因为我正在开发的应用程序可以在设备上运行,但无法在模拟器上运行。谢谢!另外,伙计,非常棒的框架!继续保持好工作! - LoveMeSomeCode

17
您可以在游戏类的create()方法中设置以下代码行来停止强制要求二次幂的能力:
Texture.setEnforcePotImages(false);

谢谢 - 这是一个方便的解决方案..即使在支持OpenGL 1.0的目标平台上使用它是否安全?我更喜欢这个解决方案,因为我正在开发一个2D游戏,因此我只使用OpenGL的正交绘图模式。在许多情况下,对于我来说,提供所有图像尺寸的2的幂次方似乎太过限制。 - Christopher Stock
1
不知道有什么区别,但我必须写这个才能让它工作:GLTexture.setEnforcePotImages(false); - Mikaël Mayer

0

这对我有用 将所有从“com.badlogic.gdx.graphics.GL10”导入的“GL10”更改为从“com.badlogic.gdx.graphics.GL20”导入的“GL20”


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接