Файл texture.cpp
| Код | #include "texture.h" // Конструктор CTexture::CTexture() { // В конструкторе инициализируем библиотеки IL и ILU. // Если этого не сделать, программа будет вываливатся с ошибкой. ilInit(); iluInit(); } // Деструктор CTexture::~CTexture() { } // Функция, непосредственно загружающая текстуру в переданную структуру. // В функцию передается тип файла, имя файла и указатель на текстуру. void CTexture::LoadTexture(ILenum FileType, char *filename, TextureImage *texture) { // Просим DevIL загрузить файл ilLoad(FileType, filename); // Проверяем, нет ли ошибок при открытии файла int err=ilGetError(); if(err!=IL_NO_ERROR) { const char* strError = iluErrorString(err); MessageBox(NULL, strError, "Ошибка при загрузке!", MB_OK); exit(1); } // Получаем данные текстуры texture->width = ilGetInteger(IL_IMAGE_WIDTH); // Ширина texture->height = ilGetInteger(IL_IMAGE_HEIGHT); // Высота texture->bpp = ilGetInteger(IL_IMAGE_BYTES_PER_PIXEL); // Байт на пиксель // Загружаем данные в нашу текстуру texture->imageData = ilGetData(); ilEnable(IL_CONV_PAL); // Тип данных изображения unsigned int type = ilGetInteger(IL_IMAGE_FORMAT); // Генерируем текстуру glGenTextures(1, &texture->texID); // Привязываем данные текстуры к ID glBindTexture(GL_TEXTURE_2D,texture->texID); // биндим мип-мапы gluBuild2DMipmaps(GL_TEXTURE_2D, texture->bpp, texture->width, texture->height, type, GL_UNSIGNED_BYTE, texture->imageData); // Устанавливаем качество текстур glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST); glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); } void CTexture::FreeTexture(TextureImage *texture) { }
|
Файл texture.h
| Код | #ifndef __TEXTURE_H #define __TEXTURE_H //#include "main.h" // Хидеры библиотеки DevIL #include <devil\il.h> #include <devil\ilu.h> // Создадим структуру TextureImage для хранения данных текстуры. typedef struct TextureImage { GLubyte *imageData; // Данные текстуры GLuint bpp; // Байт на пиксел GLuint width,height; // Высота и ширина GLuint texID; // ID текстуры }TextureImage; // Класс текстур. Загрузка и высвобождение. class CTexture{ public: CTexture(); ~CTexture(); // Собственно, класс наш делает немного - в нём только 2 функции - // загрузка и освобождение текстур =) void LoadTexture(ILenum FileType, char *filename, TextureImage *texture); void FreeTexture(TextureImage *texture); }; #endif
|
Загрузка текстуры:
| Код | void TForm1::LoadGLTextures() // загрузить изображения и преобразовать в текстуры { //DevIL Texture[0] = new CTexture(); Texture[0]->LoadTexture(IL_JPG, "t_001.jpg", &Textures[0]);
}
|
Объявление текстуры:
| Код | CTexture *Texture[3]; TextureImage Textures[3];
|
Рисуем сферу и накладываем текстуру:
| Код | GLUquadricObj *obj; glBindTexture(GL_TEXTURE_2D, Textures[1].texID); obj=gluNewQuadric(); gluQuadricTexture(obj, GL_TRUE); gluQuadricDrawStyle(obj, GLU_FILL); glPushMatrix(); glRotatef(-90,1.0f,0.0f,0.0f); glRotatef(23,0.0f,1.0f,0.0f); glRotatef(xrot,0.0f,0.0f,1.0f); gluSphere(obj, radius, 26, 26); gluDeleteQuadric(obj); glColor3ub(0, 0, 0); glPopMatrix();
|
В данном примере для загрузки рисунка я использовал библиотеки http://openil.sourceforge.net/.
Добавлено через 10 минут и 39 секунд Забыл:
Подключение
| Код | #include <DevIL\il.h> #include "texture.h" #include "texture.cpp"
|
а также
| Код | #pragma comment(lib, "devil.lib") #pragma comment(lib, "ilu.lib") #pragma comment(lib, "ilut.lib")
|
Вот вроде всё! |