Народный учебник по OpenGL


Урок 22. Наложение микрорельефа - часть 8


        glLightfv(GL_LIGHT1, GL_DIFFUSE, LightDiffuse);

        glLightfv(GL_LIGHT1, GL_POSITION, LightPosition);

        glEnable(GL_LIGHT1);

}

 

Здесь грузится УЙМА текстур. Поскольку у функции auxDIBImageLoad() есть собственный обработчик ошибок, а LoadBMP() труднопредсказуема и требует блока try-catch, я отказался от нее. Но вернемся к процедуре загрузки. Сначала берем базовую картинку и создаем на ее основе три фильтрованных текстуры (в режимах GL_NEAREST, GL_LINEAR и GL_LINEAR_MIPMAP_NEAREST). Обратите внимание, для хранения растра используется лишь один экземпляр структуры данных, поскольку в один момент открытой нужна лишь одна картинка. Здесь применяется новая структура данных, alpha — в ней содержится альфа-слой текстур. Такой подход позволяет хранить RGBA-изображения в виде двух картинок: основного 24-битного RGB растра и 8-битного альфа-канала в шкале серого. Чтобы индикатор состояния работал корректно, нужно удалять Image-блок после каждой загрузки и сбрасывать его в NULL.

 

Еще одна особенность: при задании типа текстуры используется GL_RGB8 вместо обычного "3". Это сделано для совместимости с будущими версиями OpenGL-ICD и рекомендуется к использованию вместо любого другого числа. Такие параметры я пометил оранжевым.

 

int LoadGLTextures() {           // Загрузка растра и преобразование в текстуры

  bool status=true;              // Индикатор состояния

  AUX_RGBImageRec *Image=NULL;   // Создадим место для хранения текстур

  char *alpha=NULL;

 

  // Загрузим базовый растр

  if (Image=auxDIBImageLoad("Data/Base.bmp")) {

    glGenTextures(3, texture);    // Создадим три текстуры

 

    // Создаем текстуру с фильтром по ближайшему

    glBindTexture(GL_TEXTURE_2D, texture[0]);

    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);

    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);




- Начало -  - Назад -  - Вперед -