2

我正在将手机游戏移植到 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

但得到了相同的结果。没有阿尔法通道。请帮我解决这个问题。我真的被困住了。

谢谢。

细节:

  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;
    }
    
4

1 回答 1

2

终于发现问题了。我的游戏的 OpenGL 状态配置为使用预乘 alpha 通道。我在构建系统中添加了特殊的“预乘”步骤并得到了正确的结果。

混合功能设置:

glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
于 2013-08-01T07:53:22.187 回答