一些三星设备上显示黑屏的 Android OpenGL ES 纹理问题

4
我最近参与了一个动态壁纸应用的开发。在测试我的Android动态壁纸时,我发现一个奇怪的问题。我使用我的HTC Wildfire S、三星Galaxy tab、摩托罗拉Droid Millstone和三星galaxy pop进行测试,同时结合模拟器一切正常,但是在三星手机上(三星Galaxy S II和三星Galaxy Player有这个症状),屏幕只是黑屏,但一旦进入设置界面并返回预览界面,就正常了。通过对这些手机进行一些调试,我发现壁纸可以正确加载,但贴图没有显示出来。我尝试搜索这个问题,但没有找到任何有用的信息。
我从本地代码中绑定一个纹理。我在其中使用OPEN GL库来绑定壁纸。我的OPENGL库初始化如下:
 glEnable(GL_TEXTURE_2D);
  glGenTextures(1, &textureConverted);
  glBindTexture(GL_TEXTURE_2D,textureConverted);
  //...and bind it to our array
  __android_log_print(ANDROID_LOG_DEBUG,
              "NDK initOpenGL()",
              "binded texture"
              );
  glTexParameterf(GL_TEXTURE_2D, 
          GL_TEXTURE_MIN_FILTER, 
          GL_NEAREST);
  glTexParameterf(GL_TEXTURE_2D, 
          GL_TEXTURE_MAG_FILTER, 
          GL_NEAREST);
  //Different possible texture parameters, e.g. GL10.GL_CLAMP_TO_EDGE
  glTexParameterf(GL_TEXTURE_2D, 
          GL_TEXTURE_WRAP_S, 
          GL_CLAMP_TO_EDGE);
  //GL_REPEAT);
  glTexParameterf(GL_TEXTURE_2D, 
          GL_TEXTURE_WRAP_T, 
          GL_CLAMP_TO_EDGE);
  //GL_REPEAT);
  glTexImage2D(GL_TEXTURE_2D,       /* target */
           0,           /* level */
           GL_RGBA,         /* internal format */
           textureWidth,        /* width */
           textureHeight,       /* height */
           0,           /* border */
           GL_RGBA,         /* format */
           GL_UNSIGNED_BYTE,/* type */
           NULL);
  //setup simple shading
  glShadeModel(GL_FLAT);
  //check_gl_error("glShademo_comdel");
  glColor4x(0x10000, 0x10000, 0x10000, 0x10000);

在我的drawFunction中:
 glClear(GL_COLOR_BUFFER_BIT);
  int max;
  glGetIntegerv(GL_MAX_TEXTURE_SIZE, &max);
    __android_log_print(ANDROID_LOG_DEBUG,
              "NDK drawFrame()",
              "GL_MAX_TEXTURE_SIZE: %d",
        max);
  glBindTexture(GL_TEXTURE_2D,textureConverted);
  int rect[4] = {0, textureHeight, textureWidth, nTextureHeight};
  glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_CROP_RECT_OES, rect);

  glTexSubImage2D(GL_TEXTURE_2D, /* target */
          0,        /* level */
          0,    /* xoffset */
          0,    /* yoffset */
          textureWidth,
          textureHeight,
          GL_RGBA,  /* format */
          GL_UNSIGNED_BYTE, /* type */
          pFrameConverted->data[0]);
  glDrawTexiOES(0, 0, 0, drawWidth, drawHeight); //drawWidth is th screenwidth and drawheight is the screenheight

为什么三星手机不能运行这个?

将glGetError放入代码中,查看是否有任何错误。你可能会超出GL_MAX_TEXTURE_SIZE的限制,但不能确定。 - Tim
我在代码中尝试使用glGetError()函数,它总是返回0。因此我认为那里没有问题。 - Satheeshkumar
你需要给我们更多的细节:textureWidth和textureHeight的值是多少?请展示加载纹理位图的代码和使用glTexSubmage的代码。 - Renard
@Renard,现在你可以获取我代码中使用的glTexSubmage的详细信息。textureWidth和textureHeight的值类似于256256、512512等。 - Satheeshkumar
你的代码乍一看好像没问题。你尝试过使用GLSurfaceView.setDebugFlags(GLSurfaceView.DEBUG_CHECK_GL_ERROR)吗? - Renard
我在我的代码中使用了这行代码GLSurfaceView.DEBUG_CHECK_GL_ERROR进行检查。它总是返回0。 - Satheeshkumar
2个回答

0
我解决了这个问题。问题出在OpenGL库的初始化上。当我添加了glViewport(0, 0, screenWidth, screenHeight);这行代码后,错误就被修复了。现在我的OpenGL应用程序可以在所有设备上渲染了。谢谢大家。

以前是否调用了glViewport?这似乎很奇怪,因为它在某些设备上可以工作,并且在SII刷新后也可以自行修复。看起来在某些设备的特定情况下,glViewport正在幕后被调用。 - Danny Parker

-2

一些没有OpenGL ES加速器的设备无法运行使用OpenGL库的应用程序...最好在清单文件中过滤这些设备,以防止在这些设备上安装应用程序...


1
每个 Android 设备需要支持 OpenGL,如果想通过 Android 兼容性计划,请参见第 7.1.4 章节。这是错误的。 - Renard
伙计,我在HTC Wildfire S上测试了一个OpenGL应用程序,但它不起作用,甚至还有一些其他设备...我怎么可能在不正确地了解它的情况下发表评论呢... - Manjunath
野火是少数使用软件模拟OpenGL的设备之一。因此,虽然这可能会破坏您的OpenGL应用程序,但仍然可以使用OpenGL。此外,OP在Galaxy S2上遇到了问题,该设备肯定具有GPU。 - Renard
就我所知,我已经在Galaxy S2上成功运行了OpenGL应用。你的观点是正确的。我的答案并没有错,只是在一些情况下是正确的。而且,“每个Android设备都需要支持OpenGL”这一说法显然是错误的。 - Manjunath
2
我遵循官方规范,该规范指出:设备实现必须支持Android SDK文档中所体现和详细描述的OpenGL ES 1.0和2.0。此外,你的答案是错误的,因为它忽略了问题发生在所有具有GPU的三星设备上这一事实。 - Renard

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