2

OpenGLを使用してライブ壁紙を簡単に作成できるようにするためのlibgdxの上にある小さなフレームワークであるgdxlwと同様に、libgdxを使用してライブ壁紙を作成しています。

まず、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) でまったく同じアプリを実行すると、大きな画像が混合せずに黒と白の両方の背景に描画されます。

大きな画像を描画するときにブレンドを変更しようとしても、結果は常に同じです。本来あるべき黒い四角が表示されていません。大きな画像はそのすぐ上をブルドーザーします。

私は何が間違っているのでしょうか?私は何かが欠けている可能性がありますか?

注目すべき興味深い点は、さまざまなブレンドを使用して大きな画像を描画した後 (後で)、いくつかのランダムなスプライトを描画しようとしたことです。つまり、ブレンドが完全に無効になっているわけではありません。

ブレンドするとき、大きな画像は小さな画像とは異なる動作をしますか?

注意すべきもう 1 つの興味深い点は、大きな画像で線形フィルタリングを使用すると、実際には黒い四角形が非常にかすかに見えることです。ただし、Nearest フィルタリングでは表示されません。

混乱した質問をお許しください。今は「どうしてこうなった」ということしか頭にありません。私は一日中髪を引っ張っていて、多くのアプローチを試みましたが成功しませんでした.

libgdx はタブレットや Android 3 以降と互換性がありませんか? 私はそれへの参照を見つけることができません。

gdxlwが犯人ですか?

編集: いくつかのテストを行ったところ、GL11 の代わりに GL20 を使用するようにアプリを変更すると、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 を使用していると記載されています。

両方が同じバージョンである場合、両方の実装が同じように動作するはずではありませんか?

1 つは Nvidia Tegra で、もう 1 つは Qualcomm で、ハードウェアに違いはありますか?

OpenGL 1.1 は Tegra デバイス上で何らかの形で、そして不完全に「エミュレート」されていますか?

また、「OGL 拡張機能」のリストが一部異なることもわかります。たとえば、「blend」を含むものを検索するGL_OES_blend_equation_separateGL_OES_blend_func_separateGL_OES_blend_subtractDesire HD では A500 では何も見つかりませんでした。

問題がこれらの拡張機能にある場合、(可能であれば) どうすれば解決できますか?

編集:わかりましたので、思い通りに動作するようになりましたが、GL20のみを使用しています。ただし、アプリを実行できるデバイスを増やしたいので、可能であれば GL10 または GL11 を使用して問題を解決したいと考えています。

4

0 に答える 0