Question

I'm porting mobile game to Android and want to use compressed textures in OpenGL the same way I did on iOS with PVR textures.

I've managed to convert my textures from PNG to DXT and run the game on Galaxy Tab 10.1 with Nvidia Tegra 2 chipset. However there were no smooth alpha in my DXT5 formatted textures. They looked like DXT1-textures with 1-bit alpha.

I've read and run the examples from here: http://software.intel.com/en-us/articles/android-texture-compression

I've tried this very good library: https://libregamewiki.org/Simple_OpenGL_Image_Library

But got same results. No alpha channel. Please, help me with this problem. I'm really stuck.

Thanks.

Details:

  1. I've used nvcompress tool version 2.1.0 with flags "-nomips -bc3 -alpha" (and of cause a lot of variations but with no success).
  2. I'm using OpenGL ES1 library.
  3. My openGL code:

    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;
    }
    
Was it helpful?

Solution

Finally found the problem. OpenGL state of my game was configured to work with premultiplied alpha-channel. I've added special 'premultiply' step to my build system and got proper result.

Blend-function settings:

glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top