Jump to content

  • Log In with Google      Sign In   
  • Create Account


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;
        cerr<<"Data of file "<<path<<" corrupted"<<endl;
        return false;


    //    check pixel format
    unsigned int format;

    case FOURCC_DXT1:
        format = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;
    case FOURCC_DXT3:
        format = GL_COMPRESSED_RGBA_S3TC_DXT3_EXT;
    case FOURCC_DXT5:
        format = GL_COMPRESSED_RGBA_S3TC_DXT5_EXT;
        cerr << "Compression type not supported or corrupted!" << endl;
        return false;

    glGenTextures(1, &ID);

    glBindTexture(GL_TEXTURE_2D, ID);

    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.