【问题标题】:Android opengl white textures on Samsung Galaxy variant三星 Galaxy 变体上的 Android opengl 白色纹理
【发布时间】:2012-10-02 15:13:50
【问题描述】:

我在三星 Galaxy 变体上得到白色纹理,但在我测试的其他手机上,纹理工作得很好。所以我的问题是导致这种行为的通常怀疑是什么?星系变体是否有任何特殊硬件并且缺少某些东西?

我的纹理加载代码是这样的

  GLuint texture;
  glGenTextures(1, &texture);
  glBindTexture(GL_TEXTURE_2D, texture);

  glPixelStorei(GL_UNPACK_ALIGNMENT, 2);

  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
  glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);

  glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,GL_MODULATE);

  if(alpha)glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, (GLvoid*) image_data);
  else glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, (GLvoid*) image_data);

并且绘图照常使用 GL_TRIANGLES 进行

*我面前没有实际的设备,所以我不能执行 glGetError

【问题讨论】:

  • 你能保证纹理是2的幂吗?如果您从位图工厂获取数据,则可以根据屏幕密度进行缩放,从而使 PO2 源图像变为 NPO2。
  • 是的纹理是罐子,不,我没有从位图工厂得到它们。我实际上是从 c++ 加载它们(通过访问 apk)但我不认为有问题,因为它只是 c++ 的东西不是 opengl ,如果问题在那里,我会在所有设备上都有它。
  • 每个纹理都是白色的,还是只是其中的一部分?它们都是 RGBA、RGB 还是混合的?为什么要使用 2 的解包对齐方式?
  • 如果我没记错的话 Galaxy Variant 有 Mali400 GPU。我在 Mali400 上遇到了一些着色器问题(与颜色精度有关),所以这也可能与着色器有关。你怎么画这个纹理?您是否尝试在不同的 GPU 上重现错误?
  • @SteveL - 这取决于你的image_data 的样子。行是否在任何边界上对齐?如果你的纹理是 RGBA,它们应该总是双字对齐,所以 1 或 4 就可以了。如果它们是 RGB,并且您没有任何行填充,则需要值为 1。

标签: android opengl-es galaxy opengl-es-1.1


【解决方案1】:

由于是OpenGL ES 1.0,所以还需要调用

glEnable(GL_TEXTURE_2D);

否则在 OpenGL ES 2.0 上是无操作的,其中着色器说明正在读取哪种纹理类型(嗯,它实际上是一个错误)。

调用 glTexParameterf() 和 glTexEnvf() 对我来说似乎有点奇怪,我会使用 glTexParameteri() 和 glTexEnvi() 代替(传递的值是枚举,它们是整数,而不是浮点数)。但这不应该导致错误。

另一件事是最大纹理尺寸(您已经说过它是 POT)。质地大吗?某些设备的最大纹理尺寸限制可能低至 512 x 512 像素。

解包对齐一般不会有太大影响。如果将 RGB 数据存储为 3 个字节,则它应该为 1,如果将 RGB 和 RGBA 都存储为一个双字(= 4 个字节),则它应该为 4。如果您指定了错误的对齐方式,我可以想象纹理是乱码(RGB 或扫描线倾斜),但它通常不应该是白色的。另一方面,如果驱动程序拒绝了这种解包对齐,它可能会将纹理留空并产生 GL 错误。看看有没有。

另一个因素是纹理坐标。某些设备在 texcoord 插值器中的位数很少,并且指定大的纹理坐标(例如,地形四边形上的 -10000、+10000)可能会导致图形故障。这实际上大多没有记录,许多设备都有问题。

制作 8x8 亮绿色纹理对我总是有帮助的(不是 0x00ff00,例如 0x8AC43C 在转换为灰度或以某种方式仅使用单个组件的情况下更容易发现)。然后应该将此纹理应用到一个“小”四边形(完全在屏幕上且大到足以可见),其 texcoords 在 [0-1] 范围内。

【讨论】:

  • 1) 我每次在绘制之前都启用 GL_TEXTURE_2D 2) 我不认为这是导致问题的原因 3) 我在像 64*64 这样的小纹理中也有同样的问题 4) 就像你说的那样不是白色纹理的原因 5)不,我只用
  • 6) 如果我遇到一些简单的无法正常工作的问题,我会这样做 - 实施一个应该在任何地方都可以工作的简单测试。很遗憾,这些都不能解决您的问题。如果您碰巧解决了它,请告诉我们问题所在。祝你好运...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多