我最近开始学习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。其他标志,如纹理包裹和最大和最小过滤器放大功能是稍后设置的,但我认为它们与这个问题无关。