【问题标题】:image is not a power of 2?图像不是2的幂?
【发布时间】:2012-06-11 00:26:25
【问题描述】:

所以,我通过 libGDX 制作了雨滴教程项目。但是,当我尝试将其部署到模拟器时,我收到一条错误消息,指出图像不是 2 的幂。但我确实使用 GIMP 将图像大小重新调整为 48X48(如教程所建议的那样)。我相信他已经添加了一些代码,以确保可以添加不一定是 2 次方的图像?

有谁知道我将如何解决这个问题?使它成为 2 的幂有点限制.. 不是吗?我非常密切地遵循教程!所以......我不知道从这里去哪里。 libGDX 的菜鸟。

LogCat 转储:

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: { }

【问题讨论】:

  • 32 和 64 是 2 的幂。 48 不是。
  • 教程说我们可以将其更改为 48x48。我认为他在其中添加了一些代码以确保它不会损坏。有没有办法做到这一点?这样图像就不必是二的幂了吗?就像我说的那样,我按照他在教程中的建议将图像重新调整为 48X48... 很奇怪:S
  • 他说“注意:我们明确要求使用 OpenGL ES 2.0。这允许我们加载没有二次幂大小的图像,这是在 OpenGL ES 中使用图像的必要条件1.0。”
  • 使用 2 的幂可能看起来有限制,但实际上您不会发现它有问题。要绕过限制,请将您的纹理(libgdx 中有一个纹理打包器)打包到一个大纹理中,并使用纹理图集访问每个单独的纹理区域。这是一件好事,因为切换纹理对于 OpenGL 来说是一个相对较慢的操作。

标签: android android-emulator libgdx


【解决方案1】:

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

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

【讨论】:

  • 好答案。这让我发疯了,因为我正在开发的应用程序将在设备上运行,而不是在模拟器上运行。谢谢!此外,伟大的框架老兄!继续努力!
【解决方案2】:

您可以通过在您的游戏类中的 create() 方法中设置以下代码行来阻止它强制执行两个要求的权力:

Texture.setEnforcePotImages(false);

【讨论】:

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

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

【讨论】:

    猜你喜欢
    • 2010-10-28
    • 2019-06-09
    • 2015-11-25
    • 1970-01-01
    • 1970-01-01
    • 2012-10-30
    • 1970-01-01
    • 2014-08-21
    • 2012-11-30
    相关资源
    最近更新 更多