三星Galaxy手机上的Android OpenGL白色纹理问题

5

我在三星Galaxy变体上遇到了白色纹理问题,但在我测试的其他手机上,纹理正常工作。那么我的问题是,通常会导致这种行为的罪魁祸首是什么? 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操作。


1
每个纹理都是白色的吗,还是只有一些是白色的?它们全部是RGBA、RGB还是混合的?为什么要使用解包对齐2? - Tim
如果我没记错的话,Galaxy Variant 有 Mali400 GPU。我在 Mali400 上遇到了一些着色器问题(与颜色精度有关),所以这可能也与着色器有关。你是如何绘制这个纹理的?你是否尝试在不同的 GPU 上重现错误? - keaukraine
@Tim,这些纹理是混合的(一些是RGB,一些是RGBA),而且每个纹理都是白色的。我不记得为什么要使用2来进行解包对齐 :) ,这听起来像是纹理错误的一个好理由。我应该使用1还是4? - SteveL
@KeauKraine 我忘了提到我使用的是OpenGL ES 1.0,所以没有着色器...我添加了OpenGL ES 2.0标签,因为在加载文本时基本上是相同的代码。 - SteveL
1
@SteveL - 这取决于你的 image_data 是什么样子。行是否对齐在任何边界上?如果你的纹理是RGBA格式,它们应该始终是dword对齐的,所以1或4都可以。如果它们是RGB格式,并且你没有任何行填充,那么你需要一个值为1。 - Tim
显示剩余2条评论
1个回答

4

由于这是OpenGL ES 1.0版本,您还需要调用

glEnable(GL_TEXTURE_2D);

在OpenGL ES 2.0中,调用着色器指定读取的纹理类型是必须的(否则会导致错误),所以该操作实际上不起作用。

我觉得调用glTexParameterf()和glTexEnvf()有点奇怪,我会改用glTexParameteri()和glTexEnvi()代替(传递的值是枚举,即整数类型,而非浮点类型)。但这不应该导致错误。

另一个问题是纹理的最大尺寸(你已经说过它需要是2的幂次方)。你的纹理尺寸是否很大?某些设备的纹理最大尺寸可能仅为512x512像素。

通常情况下,解包对齐参数并不会产生太大影响。如果你将RGB数据存储为3字节,则应设置其为1;如果同时存储RGB和RGBA为一个double-word(即4字节),则应将其设置为4。如果指定了错误的对齐方式,我可以想象到纹理会出现混淆(RGB或扫描线偏移),但通常不会变成白色。另一方面,如果驱动程序拒绝该对齐方式,可能会使纹理变空并产生GL错误。你可以查看一下是否出现此类情况。

另一个因素是纹理坐标。某些设备的纹理坐标插值器具有较少的位数,如果指定了大的纹理坐标(例如在地形四边形上指定-10000,+10000等),可能会导致图像出现故障。这主要是未经记录的情况,并且许多设备都存在问题。

我通常制作一个8x8的明亮绿色纹理(不是0x00ff00,例如0x8AC43C更容易在灰度转换或仅使用单个分量时进行识别)。然后将此纹理应用于"小"四边形上(完全显示在屏幕上且足够大),其纹理坐标范围为[0-1]。


  1. 我每次绘制之前都启用GL_TEXTURE_2D
  2. 我不认为那是问题的原因
  3. 我在小纹理(如64 * 64)中也有同样的问题 4)像你说的,这不是白色纹理的原因 5)不,我只绘制带有<=1纹理坐标的正方形纹理 6)我没听懂那个 :) 。谢谢你的回答,它是最完整的一个。
- SteveL
如果我遇到一些简单的问题无法解决,我会实现一个简单的测试来检查是否能够在所有地方正常工作。很遗憾,这些方法都没有解决你的问题。如果你最终解决了它,请告诉我们问题出在哪里。祝你好运... - the swine

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