Jump to content

  • Log In with Google      Sign In   
  • Create Account


Jean-Claude

Member Since 26 Feb 2013
Offline Last Active Feb 28 2013 01:25 PM

Topics I've Started

Problem loading compressed DDS without pre-generated mipmaps

26 February 2013 - 12:57 PM

Hi everyone, 

 

I am currently working at rendering bitmap fonts. For that I want to load dds textures. Now the program I use creates these dds files without any mipmaps, but the dds-loader I used before for some model textures seems to only work with pre-generated mipmaps.  

 

This is my loader:

 

 

 

    //    structures for reading and information variables
    char magic[4];
    unsigned char header[124];
    unsigned int width, height, linearSize, mipMapCount, fourCC;
    unsigned char* dataBuffer;
    unsigned int bufferSize;


    fstream file(path, ios::in|ios::binary);


    //    read magic and header
    if (!file.read((char*)magic, sizeof(magic))){
        cerr<< "File " << path << " not found!"<<endl;
        return false;
    }


    if (magic[0]!='D' || magic[1]!='D' || magic[2]!='S' || magic[3]!=' '){
        cerr<< "File does not comply with dds file format!"<<endl;
        return false;
    }


    if (!file.read((char*)header, sizeof(header))){
        cerr<< "Not able to read file information!"<<endl;
        return false;
    }


    //    derive information from header
    height = *(int*)&(header[8]);
    width = *(int*)&(header[12]);
    linearSize = *(int*)&(header[16]);
    mipMapCount = *(int*)&(header[24]);
    fourCC = *(int*)&(header[80]);


    //    determine dataBuffer size
    bufferSize = mipMapCount > 1 ? linearSize * 2 : linearSize;
    dataBuffer = new unsigned char [bufferSize*2];


    //    read data and close file
    if (file.read((char*)dataBuffer, bufferSize/1.5))
        cout<<"Loading texture "<<path<<" successful"<<endl;
    else{
        cerr<<"Data of file "<<path<<" corrupted"<<endl;
        return false;
    }


    file.close();


    //    check pixel format
    unsigned int format;


    switch(fourCC){
    case FOURCC_DXT1:
        format = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
        break;
    case FOURCC_DXT3:
        format = GL_COMPRESSED_RGBA_S3TC_DXT3_EXT;
        break;
    case FOURCC_DXT5:
        format = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT;
        break;
    default:
        cerr << "Compression type not supported or corrupted!" << endl;
        return false;
    }


    glGenTextures(1, &ID);


    glBindTexture(GL_TEXTURE_2D, ID);
    glPixelStorei(GL_UNPACK_ALIGNMENT,1);
    //glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAX_LEVEL,0);


    unsigned int blockSize = (format == GL_COMPRESSED_RGBA_S3TC_DXT1_EXT) ? 8 : 16;
    unsigned int offset = 0;


    /* load the mipmaps */
    for (unsigned int level = 0; level < mipMapCount && (width || height); ++level) {
        unsigned int size = ((width+3)/4)*((height+3)/4)*blockSize;
        glCompressedTexImage2D(GL_TEXTURE_2D, level, format, width, height,
                            0, size, dataBuffer + offset);


        offset += size;
        width  /= 2;
        height /= 2;
    }




    textureType = DDS_TEXTURE;


    return true;
 

Now if there are no mipmaps, mipMapCount is equal to 0, and the loop does not start. I tried to set the glTexParameter and increased mipMapCount manually, but didn't really work(it showed only the "d" of "Hello World!" for some reason XD). So I'm kinda stuck now. 

 

I think somewhere I have to manually create the mipmaps with glGenerateMipmap but I'm not sure where and in what why the loop still works then.

 

I hope someone can help me out here. 
 

Thanks in advance. 


PARTNERS