OpenGL + FreeImage белые текстуры
При попытке отрисовать текстуру, на экран отображается только белый квадрат и ничего более. Как только не пытался уже это исправить, поэтому обращаюсь к сторонней помощи. Вот код:
GLuint LoadTexture(IMAGE img, std::string filename) // функция загрузки текстуры
{
const char* charFilename = filename.c_str(); // открываем файл
GLuint texture; // создадим текстуру OpenGL
FIBITMAP* bitmap = FreeImage_Load(
FreeImage_GetFIFFromFilename(charFilename), charFilename, PNG_DEFAULT);
// Тип растрового изображения
// Имя файла для декодирования
// Флаги для включения или отключения функций плагина
// Преобразует растровое изображение в 32-битное.
FIBITMAP* pImage = FreeImage_ConvertTo32Bits(bitmap);//Аргумент - Дескриптор растрового изображения FreeImage.
int nWidth = FreeImage_GetWidth(pImage);// получаем ширину растрового изображения в пикселях
int nHeight = FreeImage_GetHeight(pImage);// получаем высоту
img.width = nWidth;
img.height = nHeight;
// тип текстуры, мипмап-уровень, в каком формате мы хотим хранить текстуру,
// указываем ширину и высоту результирующей текстуры, всегда должен быть равен 0,
// указываем формат и тип данных исходного изображения, фактические данные изображения
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, nWidth, nHeight,
0, GL_BGRA_EXT, GL_UNSIGNED_BYTE, (void*)FreeImage_GetBits(pImage)); //загрузка тестуры в память
// устанавливаем параметры наложения и фильтрации текстур (для текущего связанного объекта текстуры)
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);//Аргумент №1: С каким типом изображения (1D- или 2D-) мы собираемся работать
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);// Аргумент №2 : Для какой оси текстуры будет задаваться выбранный нами режим наложения
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);// мы хотим настроить его как для оси S, так и для оси T.
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);// Аргумент №3: Указываем режим наложения текстуры
// GL_LINEAR-фильтрацию для текстур, масштабируемых с увеличением масштаба.
FreeImage_Unload(pImage);// удаляет ранее загруженную карту FIBITMAP из памяти.
return texture;
}
// отрисовка текстуры
void drawImage(IMAGE img, int x, int y,int width, int height) {
glClear(GL_COLOR_BUFFER_BIT);
glBindTexture(GL_TEXTURE_2D, img.texture);
glEnable(GL_TEXTURE_2D);
glBegin(GL_QUADS);
glTexCoord2i(0, 0); glVertex2i(x, y);
glTexCoord2i(0, 1); glVertex2i(x, y+width);
glTexCoord2i(1, 1); glVertex2i(x+width, y+width);
glTexCoord2i(1, 0); glVertex2i(x+width, y);
glEnd();
}