2

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

我怎样才能 ?

非常感谢!!!

4

3 回答 3

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

于 2013-10-03T11:16:11.437 回答
0

纹理的大小取决于 GPU 和 OpenGL ES 的实现。在 iOS 上,仅接受 2 次幂纹理。并且在 PVR 格式中,仅接受大小为 2 的方形纹理。在实施之前,您需要阅读他们的文件。但对于跨平台,建议使用具有方形纹理的 2 的幂。

于 2013-09-26T09:10:59.337 回答
0

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

您可能存在 mipmap 不匹配,例如,如果您指定:

            glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);

当您的纹理没有 Mip 贴图级别时指定 Mip 贴图最小比例过滤器将导致黑色纹理。实际上,您根本不能使用具有非幂二纹理的 mipmap。

另一件事是您不能将 GL_REPEAT 与非幂 2 纹理一起使用。对于非 power 2 纹理,您不能在 iOS 上执行此操作:

        glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,
                        GL_REPEAT);

相反,您可以这样做:

glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S,
        GL_CLAMP_TO_EDGE);

希望这可以帮助。

于 2013-09-30T18:18:57.093 回答