我正在使用 libgdx 以及 gdxlw 制作动态壁纸,gdxlw 是 libgdx 之上的一个小框架,可以更轻松地使用 OpenGL 制作动态壁纸。
首先,我确保我没有使用 GL20。我希望尽量保持 GL10/GL11。我正在使用一个简单的 OrthographicCamera。
我每次渲染调用做什么:
1...使用
gl11.glClearColor(1, 1, 1, 1);
gl11.glClear(GL11.GL_COLOR_BUFFER_BIT);
我用白色填充屏幕。
2...我在上面画了一个黑色方块,使用 SpriteBatch 和
batch.setBlendFunction(GL11.GL_SRC_ALPHA, GL11.GL_ONE_MINUS_SRC_ALPHA);
3...在此之上,我使用 SpriteBatch 和
batch.setBlendFunction(GL11.GL_DST_COLOR, GL11.GL_ONE_MINUS_DST_COLOR);
然后只会在已经是黑色的地方绘制大图像,而不是在白色的地方。它按我的预期工作,非常适合我的项目。
这在我的 HTC Desire HD (Android 2.3.5) 上完美运行。然而,当我在我的 Acer Iconia A500 平板电脑(Android 3.2.1)上运行相同的应用程序时,大图像被绘制在黑色和白色背景上而没有混合。
无论我在绘制大图像时尝试将混合更改为什么,结果总是相同的。黑色方块是不可见的,它应该是。大图像只是在它上面推土机。
我可能做错了什么?我会错过什么吗?
需要注意的一件有趣的事情是,我尝试在使用各种混合绘制的大图像上(之后)绘制一些随机精灵,这证明了不同类型的混合实际上似乎确实有效。换句话说,混合并没有完全禁用。
混合时大图像的行为是否与小图像不同?
另一个需要注意的有趣的事情是,当我对大图像使用线性过滤时,您实际上可以非常模糊地辨认出黑色方块。但是,它在最近过滤时不可见。
请原谅我困惑的问题;我现在唯一想到的是“为什么会发生这种情况?” 我整天都在拉头发,尝试了很多方法,但都没有成功。
libgdx 是否与平板电脑或 Android 3+ 不兼容?我找不到任何参考。
gdxlw是罪魁祸首吗?
编辑:我做了一些测试,发现如果我将应用程序更改为使用 GL20 而不是 GL11,我在我的 Desire HD 上得到的结果与我的 Acer Iconia A500 相同。也就是说,我看到了我的大图像,并且非常(!)模糊地看到了它背后的黑色。
另外,我正在查看我在 Acer Iconia A500 平板电脑上运行 GL11 版本的 logcat。它指出...
02-10 10:58:19.010: D/libEGL(9907): loaded /system/lib/egl/libGLES_android.so
02-10 10:58:19.020: D/libEGL(9907): loaded /system/lib/egl/libEGL_tegra.so
02-10 10:58:19.040: I/DEBUG(81): tid 9915 does not exist in pid 9893. ignoring debug request
02-10 10:58:19.040: D/libEGL(9907): loaded /system/lib/egl/libGLESv1_CM_tegra.so
02-10 10:58:19.040: D/libEGL(9907): loaded /system/lib/egl/libGLESv2_tegra.so
02-10 10:58:19.050: D/QuickLog(9907): checkGL20 is: true
02-10 10:58:19.080: D/HAL(9907): [HAL] hw_get_module:share library path:/system/lib/hw/gralloc.tegra.so
02-10 10:58:19.290: D/HAL(9907): [HAL] hw_get_module:share library path:/system/lib/hw/gralloc.tegra.so
02-10 10:58:19.290: D/AndroidGraphics(9907): GL20: true
02-10 10:58:19.300: D/AndroidGraphics(9907): OGL renderer: NVIDIA AP
02-10 10:58:19.300: D/AndroidGraphics(9907): OGL vendor: NVIDIA Corporation
02-10 10:58:19.300: D/AndroidGraphics(9907): OGL version: OpenGL ES-CM 1.1
02-10 10:58:19.300: D/AndroidGraphics(9907): OGL extensions: GL_EXT_bgra GL_EXT_texture_compression_dxt1 GL_EXT_texture_compression_s3tc GL_EXT_texture_format_BGRA8888 GL_NV_texture_npot_2D_mipmap GL_OES_byte_coordinates GL_OES_compressed_ETC1_RGB8_texture GL_OES_compressed_paletted_texture GL_OES_draw_texture GL_OES_extended_matrix_palette GL_OES_EGL_image GL_OES_EGL_image_external GL_OES_EGL_sync GL_OES_fbo_render_mipmap GL_OES_fixed_point GL_OES_framebuffer_object GL_OES_matrix_get GL_OES_matrix_palette GL_OES_point_size_array GL_OES_point_sprite GL_OES_query_matrix GL_OES_read_format GL_OES_rgb8_rgba8 GL_OES_single_precision GL_OES_stencil8 GL_OES_texture_cube_map GL_OES_vertex_half_float
02-10 10:58:19.300: D/AndroidGraphics(9907): framebuffer: (5, 6, 5, 0)
02-10 10:58:19.300: D/AndroidGraphics(9907): depthbuffer: (16)
02-10 10:58:19.300: D/AndroidGraphics(9907): stencilbuffer: (0)
...在我看来,这听起来像是在使用 OpenGL ES 1.1。我找不到有关“CM”代表什么的信息。但是,从我的 Desire HD 中查看我的logcat,运行相同的应用程序版本:
02-10 11:04:16.515: D/AndroidGraphics(10851): GL20: true
02-10 11:04:16.525: D/AndroidGraphics(10851): OGL renderer: Adreno 205
02-10 11:04:16.525: D/AndroidGraphics(10851): OGL vendor: Qualcomm
02-10 11:04:16.525: D/AndroidGraphics(10851): OGL version: OpenGL ES-CM 1.1
02-10 11:04:16.525: D/AndroidGraphics(10851): OGL extensions: GL_AMD_compressed_3DC_texture GL_AMD_compressed_ATC_texture GL_AMD_performance_monitor GL_APPLE_texture_2D_limited_npot GL_EXT_texture_filter_anisotropic GL_EXT_texture_format_BGRA8888 GL_EXT_texture_type_2_10_10_10_REV GL_OES_blend_equation_separate GL_OES_blend_func_separate GL_OES_blend_subtract GL_OES_compressed_ETC1_RGB8_texture GL_OES_compressed_paletted_texture GL_OES_depth_texture GL_OES_draw_texture GL_OES_framebuffer_object GL_OES_matrix_palette GL_OES_packed_depth_stencil GL_OES_point_size_array GL_OES_point_sprite GL_OES_read_format GL_OES_rgb8_rgba8 GL_OES_stencil_wrap GL_OES_EGL_image GL_OES_texture_cube_map GL_OES_texture_env_crossbar GL_OES_texture_float GL_OES_texture_half_float GL_OES_texture_half_float_linear GL_OES_texture_npot GL_OES_texture_mirrored_repeat GL_QCOM_binning_control GL_QCOM_extended_get GL_QCOM_tiled_rendering
02-10 11:04:16.535: D/AndroidGraphics(10851): framebuffer: (5, 6, 5, 0)
02-10 11:04:16.535: D/AndroidGraphics(10851): depthbuffer: (16)
02-10 11:04:16.535: D/AndroidGraphics(10851): stencilbuffer: (0)
...它声明它使用与我的平板电脑相同的 OpenGL 版本。
如果两者是相同的版本,两个实现不应该同样工作吗?
硬件,一个是 Nvidia Tegra,另一个是 Qualcomm,会有所作为吗?
在 Tegra 设备上,OpenGL 1.1 是否以某种方式“模拟”,而且不完美?
我也确实看到“OGL 扩展”列表有所不同。例如,搜索任何包含“混合”的东西,我发现GL_OES_blend_equation_separate
,在我的 Desire HD 上,GL_OES_blend_func_separate
而GL_OES_blend_subtract
在我的 A500 上,我找不到任何我能分辨的东西。
如果问题在于这些扩展,我该如何(如果可能)解决这个问题?
编辑:好的,所以现在我让它按照我想要的方式工作,但我只使用 GL20。但是,如果可能的话,我仍然想使用 GL10 或 GL11 解决问题,因为我希望更多设备能够运行该应用程序。