Здравствуйте.
Есть два BMP-файла
и код для загрузки их в качестве текстуры OpenGL:
GLuint LoadTextureBitmap(char* fileName)
{
FILE* file = fopen(fileName, "rb");
if (!file)
{
return 0;
}
BITMAPFILEHEADER bfh;
fread(&bfh, sizeof(BITMAPFILEHEADER), 1, file);
BITMAPINFOHEADER bih;
fread(&bih, sizeof(BITMAPINFOHEADER), 1, file);
int componentsCount = 3;
int imgLen = bih.biWidth * bih.biHeight * componentsCount;
unsigned char* data = new unsigned char[imgLen];
fseek(file, bfh.bfOffBits, SEEK_SET);
fread(data, 1, imgLen, file);
fclose(file);
unsigned char tmp;
for (int i = 0; i < imgLen; i += componentsCount)
{
tmp = data[i];
data[i] = data[i + 2];
data[i + 2] = tmp;
}
GLuint hTexture = 0;
glGenTextures(1, &hTexture);
if (hTexture)
{
glBindTexture(GL_TEXTURE_2D, hTexture);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
//glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
//glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
gluBuild2DMipmaps(GL_TEXTURE_2D, componentsCount, bih.biWidth, bih.biHeight,
GL_RGB, GL_UNSIGNED_BYTE, data);
glBindTexture(GL_TEXTURE_2D, 0);
}
delete data;
return hTexture;
}
Исходная 8-битная картинка (кстати, сегодня ей исполнился 21 год) выглядит так:
но если преобразовать ее в 24 бита, то она выглядит нормально:
Я знаю, что для загрузки картинок лучше использовать библиотеки типа STB или SOIL. В других проектах я именно так и делаю. Сейчас просто хочу понять, почему она напрямую не грузится.
Что надо изменить в коде, чтобы она правильно загрузилась?