首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenGL DXT压缩纹理当宽度和高度不同时黑色

OpenGL DXT压缩纹理当宽度和高度不同时黑色
EN

Stack Overflow用户
提问于 2013-08-25 15:47:20
回答 1查看 1.5K关注 0票数 0

在本教程之后,我在OpenGL中实现了DXT压缩纹理的加载:

OpenGL DXT教程

问题是,当宽度和高度是相同的(总是2的幂)时,它工作得很好,但是当它们不工作时,它只会出现黑色(1024 * 512,256 *512等)。有什么问题吗?

我使用的是OpenGL 3.3,我的视频卡是一个AMDRadeonHD7610M(笔记本电脑,但相当不错)。此外,glGetError()没有显示错误(三重检查)。

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

代码语言:javascript
复制
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);
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-08-25 16:22:32

我想您的问题是由以下几行引起的:

代码语言:javascript
复制
width /= 2;
height /= 2;

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

您应该尝试将它们替换为如下所示:

代码语言:javascript
复制
width = MAX(1, width/2);
height = ...
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18430799

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档