在Android设备上缺少DXT5纹理中的alpha通道

时间:2013-07-01 13:05:26

标签: android opengl-es tegra dds-format

我正在将移动游戏移植到Android,并希望在OpenGL中使用压缩纹理,就像我在iOS上使用PVR纹理一样。

我已经设法将纹理从PNG转换为DXT并使用Nvidia Tegra 2芯片组在Galaxy Tab 10.1上运行游戏。 但是我的DXT5格式化纹理中没有平滑的alpha。它们看起来像是带有1位alpha的DXT1纹理。

我已经从这里阅读并运行了这些示例: http://software.intel.com/en-us/articles/android-texture-compression

我试过这个非常好的图书馆: https://libregamewiki.org/Simple_OpenGL_Image_Library

但结果相同。没有alpha通道。 请帮我解决这个问题。我真的被卡住了。

感谢。

详细说明:

  1. 我使用了带有标志“-nomips -bc3 -alpha”的nvcompress工具版本2.1.0(导致很多变化,但没有成功)。
  2. 我正在使用OpenGL ES1库。
  3. 我的openGL代码:

    int width = //...
    int height = //...
    const unsigned char* textureData = //...
    int numMipMaps = //...
    int format = //...
    
    GLuint texture = 0;
    glGenTextures(1, &texture);
    
    glBindTexture(GL_TEXTURE_2D, texture);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    
    int blockSize;
    GLuint format;
    switch (format) {
        case S3TC_DXT1:
            format = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
            blockSize = 8;
            break;
        case S3TC_DXT3:
            format = GL_COMPRESSED_RGBA_S3TC_DXT3_EXT;
            blockSize = 16;
            break;
        case S3TC_DXT5:
            format = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT;
            blockSize = 16;
            break;
        case ATC:
            format = GL_ATC_RGBA_EXPLICIT_ALPHA_AMD;
            blockSize = 16;
            break;
        default:
            //Error...
            break;
    }
    
    int offset = 0;
    for(int i = 0; i < numMipMaps; i++)
    {
        int size = ((width + 3) / 4) * ((height + 3) / 4) * blockSize;
        glCompressedTexImage2D(GL_TEXTURE_2D, i, format, width, height, 0, size, textureData + offset);
        offset += size;
    
        //Scale next level.
        width  /= 2;
        height /= 2;
    }
    

1 个答案:

答案 0 :(得分:2)

终于找到了问题。我的游戏的OpenGL状态被配置为使用预乘alpha通道。 我已经为我的构建系统添加了特殊的'预乘'步骤并获得了正确的结果。

混合功能设置:

glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);