我在三星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
由于它是OpenGL ES 1.0,您还需要调用
glEnable(GL_TEXTURE_2D);
这在OpenGL ES 2.0上是一个没有操作的地方,着色器说正在读取哪个纹理类型(好吧,这实际上是一个错误)。
调用glTexParameter()和glTexEnvf()对我来说有点奇怪,我会使用glTexParametersi()和glTexEnvi()(传递的值是枚举,它们是整数,而不是浮点)。但这不应该导致错误。
另一件事是最大纹理大小(你已经说过它是POT)。质地大吗?一些设备可能具有低至512乘512像素的最大纹理大小限制。
拆包对齐一般不会产生太大影响。如果将RGB数据存储为3个字节,则应为1;如果将RGB和RGBA存储为一个双字(=4个字节),则为4。如果你指定了一个不好的对齐方式,我可以想象纹理是乱码的(RGB或扫描线倾斜),但它通常不应该是白色的。另一方面,如果驱动程序拒绝这种解压缩对齐,则可能会使纹理为空并生成GL错误。看看有没有。
另一个因素是纹理坐标。一些设备在texcord插值器中的位数很小,指定较大的纹理坐标(例如,地形四边形上的-10000、+10000)可能会导致图形故障。这实际上大多是未记录的,许多设备都有问题
制作8x8亮绿色纹理对我来说总是很有帮助的(不是0x00ff00,例如0x8AC43C在转换为灰度或仅使用单个组件的情况下更容易识别)。然后,该纹理应应用于纹理坐标在[0-1]范围内的"小"四边形(一个完全在屏幕上且足够大以可见的四边形)。