首页 > 解决方案 > RGBA4444 纹理在 iPhone 上变成黑框

问题描述

我打算使用 RGBA4444 纹理来减少 iPhone 上的内存使用,但令我惊讶的是,创建的纹理始终是屏幕上的黑框,相同的代码在 Win10 上运行良好。这是我用来创建 RGBA4444 纹理的代码:

{
    const int texSize = 256;
    vector<unsigned char> bytes(texSize * texSize * 2, 0xFF);

    GLuint id = 0;
    glGenTextures(1, &id);
    glBindTexture(GL_TEXTURE_2D, id);

    glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA4, texSize, texSize, 0, GL_RGBA, GL_UNSIGNED_SHORT_4_4_4_4, &bytes[0]);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
}

我完全不知所措,iphone原生支持RGBA4444对吧?

在 iPhone5s 和 iPad3 上测试,都是黑匣子。

谢谢你。

标签: iosiphone

解决方案


好的,事实证明 internalFormat 不正确:

glTexImage2D(GL_TEXTURE_2D
    , 0
    , GL_RGBA4  // <---- should be GL_RGBA instead of GL_RGBA4 on iPhone
    , texSize
    , texSize
    , 0
    , GL_RGBA
    , GL_UNSIGNED_SHORT_4_4_4_4
    , &bytes[0])
    ;

在 Win10 上,当 internalFormat 为 GL_RGBA4 (GLAD, es2.0) 时它可以正常工作,但是根据这个glTexImage2D,可接受的 internalFormats 是 GL_ALPHA、GL_LUMINANCE、GL_LUMINANCE_ALPHA、GL_RGB、GL_RGBA,所以即使在 WIN10 上,RGBA4444 的正确 internalFormat 仍然应该是 GL_RGBA。


推荐阅读