使用glTexImage2D绘制63 * 63图像

时间:2013-09-26 08:44:07

标签: android ios opengl-es opengl-es-2.0 glteximage2d

在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);

我怎么能?

非常感谢!!!

3 个答案:

答案 0 :(得分:1)

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纹理和调整纹理坐标要差得多。

答案 1 :(得分:0)

纹理的大小取决于GPU和OpenGL ES的实现。在iOS上,只接受2个纹理的力量。而在PVR格式中,只接受功率为2的Square Square。您需要在实施之前阅读他们的文档。但对于跨平台,建议使用方形纹理的2的幂。

答案 2 :(得分:0)

如果我记得iOS OpenGLES2可以绘制2个纹理的非幂,但在某些情况下它不会绘制它们。 首先,我们讨论的是未压缩的纹理,因为这是您在代码中尝试做的事情。 其次,你没有提供很多信息。究竟什么“不起作用”? 我会假设通过不起作用你的意思是你的黑色纹理。

例如,如果指定:

,则可能出现mipmap不匹配
            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);

当纹理没有mip贴图级别时,指定mip贴图最小缩放滤镜将导致黑色纹理。 实际上,你不能使用非幂二纹理的mipmap。

另一件事是你不能将GL_REPEAT与非幂2纹理一起使用。 你无法在iOS上为非强力2纹理做到这一点:

        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,
                        GL_REPEAT);

相反,你可以这样做:

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,
        GL_CLAMP_TO_EDGE);

希望这有帮助。