首页 > 解决方案 > 只有开始的 DXT 纹理加载 openGL

问题描述

我最近开始学习openGL。在这样做的同时,我开始尝试实现纹理。这在使用外部解压缩库加载 jpeg 纹理时很容易工作,但是我随后尝试加载 DXT 纹理并创建了一些代码来加载 DXT 文件并将其用作纹理。当我尝试使用此纹理时,我尝试纹理化的对象的面如下所示:面部纹理不正确

然而,纹理应该是这样的:尝试使用的纹理 我创建了这个具有 10 个 mipmap 级别的 DXT 文件,从初始分辨率 512 * 512 一直到 1 * 1,我认为这个问题与文件中的所有 mipmap 有关被加载为一种纹理,但我不确定。我用来创建纹理的代码是:

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

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

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, buffer + offset);
    offset += size;
    width /= 2;
    height /= 2;
}
delete[] buffer;

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAX_LEVEL, mipMapCount);

其中 buffer 是包含图像的缓冲区,width 和 height 分别是宽度和高度,level 是 mipmap 级别,offset 是缓冲区中 mipmap 级别的偏移量,format 是图像格式,size 是大小单独的mipmap。其他标志,如纹理包裹和最大和最小过滤器放大功能是稍后设置的,但我认为它们与这个问题无关。

标签: c++opengldxt

解决方案


推荐阅读