在安卓中,使用以下代码是工作的:
glTexImage2D(GL_TEXTURE_2D, 0, GL_BGRA_EXT, content.width, content.height, 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, content.pixels);
但是在iOS中不起作用,此代码仅绘制64 * 64(2的幂(
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, content.width, content.height, 0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, content.pixels);
我该怎么做?
非常感谢!!
在glTexImage2D
调用之前使用它:
// Use tightly packed data
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
更多信息请点击此处:http://www.khronos.org/opengles/sdk/1.1/docs/man/glPixelStorei.xml
[...]GL_PACK_ALIGNMENT指定内存中每个像素行开头的对齐要求。允许的值为 1(字节对齐(、2(与偶数字节对齐的行(、4(单词对齐(和 8(行从双字边界开始(。初始值为 4。[...]
这可能并非在所有设备上都可用。但是现在任何针对的严肃设备都应该支持它。但是,此方法仍然存在的一个缺点是,OpenGL 读取缓冲区一次只读取一个字节。因此,当使用 1 而不是默认值 4 时,对 glTexImage2D
的调用可能会慢 4 倍左右。当然,数据在内存中没有正确对齐,但这应该不是问题。不过,我必须建议使用大小为 2 的纹理,因为使用 63x63 纹理的缺点比仅加载 64x64 纹理和调整纹理坐标要糟糕得多。
纹理的大小取决于 GPU 和 OpenGL ES 实现。在 iOS 上,仅接受 2 次幂纹理。在 PVR 甲酸盐中,仅接受 2 次方尺寸的方形纹理。在实施之前,您需要阅读他们的文档。但是对于跨平台,建议使用具有方形纹理的 2 次幂。
如果我记得iOS OpenGLES2可以绘制2个纹理的非幂,但在某些情况下它不会绘制它们。首先,我们谈论的是未压缩的纹理,因为这是您尝试在代码中执行的操作。其次,你没有提供很多信息。究竟什么"不起作用"?我会假设不起作用的意思是你得到了黑色纹理。
您可能有 mipmap 不匹配,例如,如果您指定:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
当您的纹理没有 mip 贴图级别时,指定 mip 贴图最小比例过滤器将导致黑色纹理。实际上,您根本无法使用非电源两种纹理的mipmap。
另一件事是你不能将GL_REPEAT与非 Power 2 纹理一起使用。您无法在 iOS 上对非 Power 2 纹理执行此操作:
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,
GL_REPEAT);
相反,您可以这样做:
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,
GL_CLAMP_TO_EDGE);
希望这有帮助。