Open GL


Создаем текстуру в памяти


Одного вывода изображений недостаточно для создания полноценных трехмерных сцен. Часто возникает потребность накладывать изображение на трехмерные объекты и поворачивать/сдвигать их. Для этих целей существую текстуры. Также текстуры помогут вам покрыть весь объект в виде мозаики. Скажем, когда у вас имеется кирпичная стена, то вам не надо загружать изображение с кучей кирпичей. Достаточно загрузить один кирпич и указать, что эту текстуру нужно размножить по всей плоскости.
Сначала мы разберем создание и наложение текстур на плоскость. Затем рассмотрим наложение текстур на объекты, описанные в секции . И наконец, на все прочие, созданные из многоугольников; в частности, тор и чайник.

Для того, чтобы наложить текстуру на объект, вы должны:

  1. Загрузить графический файл в память
  2. Создать имя-идентификатор текстуры
  3. Сделать его активным
  4. Создать саму текстуру в памяти
  5. Установить параметры текстуры
  6. Установить параметры взаимодействия текстуры с объектом
  7. Связать координаты текстуры с объектом
  8. Первое вы уже научились делать в предыдущей секции. Создайте проект с именем Texture. Объявите следующие глобальные переменные:

    unsigned int photo_tex; AUX_RGBImageRec* photo_image; unsigned int space_tex; AUX_RGBImageRec* space_image;

    Переменные photo_tex и space_tex будут служить идентификаторами текстур. А в photo_image и space_image мы загрузим bmp-файлы. Тут нужно отметить, что текстуры в OpenGL должны иметь размер 2n x 2m, где n и m целые числа. Это сделано для ускорения работы, т.к. сжимать или растягивать такие текстуры быстрее и удобней. Вы, конечно, можете загрузить изображение любого другого размера, но его придется масштабировать. На мой взгляд, это неправильно. Результат масшабирования вас может и не устроить. Так что я использую графические файлы с размером, кратным степени двойки. Мне удобнее отредактировать изображение в каком-нибудь графическом пакете, урезать его или наоборот дополнить, чем потом выяснять, почему оно искажается. Впрочем, тут многое зависит от конкретного случая. Художнику, который делает текстуры, все равно какого размера ее делать, поэтому легче попросить его сделать изображение с подходящими размерами. Вставьте следующий код в функцию main.

    photo_image = auxDIBImageLoad("photo.bmp"); space_image = auxDIBImageLoad("space.bmp");




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



    Книжный магазин