Категория: OpenGL
Просмотров: 4613
    Добрый вечер! Сегодняшний урок, как явственно следует из названия будет посвящен текстурированию. Что это за зверь? Давайте разбираться. Представьте, что у нас есть некий полигональный объект, которому отчаянно не хватает детализации. Какие будут ваши действия? Добавить ещё полигонов? Ну это не всегда возможно, т.к. увеличение детализации таким способом убьёт FPS. Поэтому и возникла идея часть деталей просто нарисовать на поверхности объекта. Именно в этом и заключается суть текстурирования – отрисовываемому объекту ставится в соответствие некий растр, в котором хранится изображение, накладываемое на полигоны. Вот вроде бы краткий брифинг завершен и можно приступать непосредственно к рассмотрению тонкостей процесса текстурирования в OpenGL'е.

    Поскольку 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 статьи. Следите за обновлениями )).

    ЗЫ Исходники.