在android中,使用这段代码是可行的:
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);我怎么能?
非常感谢!
发布于 2013-09-26 09:10:59
纹理的大小取决于GPU和OpenGL ES的实现。在iOS上只有2种纹理的功率被接受。而在PVR模板中,只有2种大小的方形纹理被接受。在实现之前,您需要阅读他们的文档。但是对于跨平台来说,最好是使用2的平方纹理的功率。
发布于 2013-10-03 11:16:11
在您的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纹理和调整纹理坐标要糟糕得多。
发布于 2013-09-30 18:18:57
如果我还记得,iOS OpenGLES2可以绘制2种纹理的非幂,但在某些情况下它不会绘制它们。首先,我们讨论的是未压缩的纹理,因为这是您试图在代码中做的事情。其次,你没有提供太多的信息。什么是“不起作用”?我假设你的意思是你得到的是黑色的纹理。
可能存在mipmap不匹配,例如,如果您指定:
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);当您的纹理没有mip映射级别时,指定mip映射最小比例尺过滤器将导致黑色纹理。实际上,你根本不能使用带有非幂二纹理的mipmap。
另一件事是,你不能使用GL_REPEAT与非功率2纹理。对于非电源2纹理,您不能在iOS上这样做:
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,
GL_REPEAT);相反,您可以这样做:
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,
GL_CLAMP_TO_EDGE);希望这能有所帮助。
https://stackoverflow.com/questions/19023397
复制相似问题