我按照本教程在OpenGL中实现了DXT压缩纹理的加载:
OpenGL DXT教程
问题是,当宽度和高度相同时(总是二的幂),它工作得很好,但当它们不相同时(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);
}
我想您的问题是由以下几行引起的:
width /= 2;
height /= 2;
这将导致错误的0(零)值。
你应该试着用之类的东西来代替它们
width = MAX(1, width/2);
height = ...