Поскольку OpenGL это вего лишь АПИ для рендеринга, то в нем отсутствуют почти все удобства, серьёно упрощающие жизнь тем кто избрал DirectX. Конкретно: в OpenGL нет функций позволяющих загружать изображения (конечно есть простенькие утилитарные библиотеки типа GLU или GLUT, но они особой погоды не дулают т.к. позволяют загружать максимум BMP файлы). Поэтому мы воспользуемся изученой ранее библиотекой DevIL (урок можно найти здесь). Поэтому с загрузки и начнем:
CCommonBitmap::InitDevIL(); CCommonBitmap::SetRenderer( ILUT_OPENGL ); CCommonBitmap Texture( "nvlogo.png" );
Обращение к текстуре в OpenGL осуществляется через её идентификатор:
unsigned int TextureHandle;
который перед использованием надо сгенерировать:
glGenTextures( 1 , &TextureHandle );
Затем надо сообщить системе что мы сейчас будем работать с текстурой с идентификатором TextureHandle:
glBindTexture( GL_TEXTURE_2D , TextureHandle );
Затем надо создать текстуру в видео памяти:
gluBuild2DMipmaps( GL_TEXTURE_2D , 3 , Texture.GetInteger( 0 ) , Texture.GetInteger( 1 ) , GL_RGB , GL_UNSIGNED_BYTE , Texture.GetData() );
Указать параметры фильтрации:
glTexParameteri( GL_TEXTURE_2D , GL_TEXTURE_MIN_FILTER , GL_LINEAR ); glTexParameteri( GL_TEXTURE_2D , GL_TEXTURE_MAG_FILTER , GL_LINEAR );
Смысл этих параметров следующий – очень редко бывает когда одному пикселю экрана соответствует один пиксель текстуры. Как правило бывает, что одному пикселю экрана соответствует несколько текселей (GL_TEXTURE_MIN_FILTER) или одному текселю несколько пикселей (GL_TEXTURE_MAG_FILTER). Параметры фильтрации указывают системе каким образом рассчитывать цвет пикселя. В данном случае используется режим GL_LINEAR, т.е. цвет текселя усредняется в квадрате 2х2 текселя. Теперь нам только осталось сообщить системе что мы собираемся использовать текстурирование
glEnable( GL_TEXTURE_2D );
и собственно осуществить отрисовку
// привязываемся к текстуре glBindTexture( GL_TEXTURE_2D , TextureHandle ); // рисуем геометрию glBegin( GL_QUADS ); glTexCoord2f( 0 , 1 );glColor3f( 1 , 1 , 1 );glVertex3f( -1.0f , -1.0f , 0.0f ); glTexCoord2f( 0 , 0 );glColor3f( 1 , 1 , 1 );glVertex3f( -1.0f , 1.0f , 0.0f ); glTexCoord2f( 1 , 0 );glColor3f( 1 , 1 , 1 );glVertex3f( 1.0f , 1.0f , 0.0f ); glTexCoord2f( 1 , 1 );glColor3f( 1 , 1 , 1 );glVertex3f( 1.0f , -1.0f , 0.0f ); glEnd(); // отвязываемся от текстуры glBindTexture( GL_TEXTURE_2D , 0 );
Вот собственно и всё на сегодня. Однако тему текстурирования рано закрывать, т.к. по ней планируется сделать ещё как минимум 2 статьи. Следите за обновлениями )).
ЗЫ Исходники.