我在三星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,GL_RGBA,width,height,GL_UNSIGNED_BYTE,(GLvoid*) image_data);
else glTexImage2D(GL_TEXTURE_2D,GL_RGB,(GLvoid*) image_data);
GL_TRIANGLES正如往常一样进行绘图
*我没有在我面前的实际设备所以我不能做glGetError
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)可能导致图形故障.这实际上大部分都没有记录,许多设备都有问题.
制作8×8亮绿色纹理总是有帮助的(不是0x00ff00,例如0x8AC43C在转换为灰度或不知何故仅使用单个组件的情况下更容易发现).然后应该将这个纹理应用于“小”四边形(一个完全在屏幕上并且足够大以便可见),使用[0-1]范围内的texcoords.