【问题标题】:OpenGL DXT compressed textures black when Width & Height differ当宽度和高度不同时,OpenGL DXT 压缩纹理变黑
【发布时间】:2013-08-28 03:44:43
【问题描述】:

我按照本教程在 OpenGL 中实现了 DXT 压缩纹理的加载:

OpenGL DXT tutorial

问题是,当宽度和高度相同(总是 2 的幂)时它可以正常工作,但是当它们不同时它只会显示黑色(1024 * 512、256 * 512 等不起作用.. .)。可能是什么问题?

我使用的是 OpenGL 3.3,我的显卡是 AMD Radeon HD 7610M(笔记本,但相当不错)。此外,glGetError() 没有显示错误(三重检查)。

我发布我的代码版本只是为了确定(不同之处在于我从打包文件格式中读取纹理,这不是问题,因为我从这些文件中加载了所有模型并且一切都很好):

void Texture::loadDDS(unsigned char* data)
{
    unsigned int height = *(unsigned int*)&(data[12]);
    unsigned int width = *(unsigned int*)&(data[16]);
    unsigned int mipMapCount = *(unsigned int*)&(data[28]);
    unsigned int fourCC = *(unsigned int*)&(data[84]);
    unsigned int format = GL_COMPRESSED_RGBA_S3TC_DXT1_EXT;

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

    glGenTextures(1, &_id);
    glBindTexture(GL_TEXTURE_2D, _id);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

    unsigned int blockSize = (format == GL_COMPRESSED_RGBA_S3TC_DXT1_EXT) ? 8 : 16;
    unsigned int offset = 124 + 4;

    for(unsigned int level = 0; level < mipMapCount && (width || height); ++level)
    {
        unsigned int size = ((width + 3) / 4) * ((height + 3) / 4) * blockSize;
        //if(size == 0) break; // neccessary?
        glCompressedTexImage2D(GL_TEXTURE_2D, level, format, width, height, 0, size, &data[offset]);

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

    glBindTexture(GL_TEXTURE_2D, 0);
}

【问题讨论】:

    标签: opengl size textures compression dds-format


    【解决方案1】:

    我想你的问题是由于以下几行:

    width /= 2;
    height /= 2;
    

    这将导致不正确的 0(零)值。

    你应该尝试用类似的东西替换它们:

    width = MAX(1, width/2);
    height = ...
    

    【讨论】:

    • 哇,谢谢,我不敢相信这是问题所在!在这种情况下,即使是原始教程和我发现的大部分代码都是错误的......有趣。
    猜你喜欢
    • 1970-01-01
    • 2015-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-09
    • 2012-02-27
    • 1970-01-01
    • 2017-02-23
    相关资源
    最近更新 更多