5

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

我的纹理加载代码是这个

  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

4

1 回答 1

4

由于是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] 范围内。

于 2012-10-30T13:31:30.040 回答