Каркас Windows-приложения. Особенности нового каркаса. Перемещение в пространстве (с текстурированными стенами), страница 6

Затем, например, 3 его точки совмещаются с 3 точками примитива GL_TRIANGLE (отображение без искажений).

После этого 3 выбранные точки текстуры отображаются на 3 точки другого треугольника. При этом текстура растягивается (и OpenGL генерирует недостающие пикселы) или сжимается (и OpenGL усредняет цвет обобщаемых пикселов).

Заметьте, что в новом треугольнике только одна из вершин (верхняя) изменила свои координаты. Этот алгоритм может бsnm использован для анимации изображений. Далее в этом курсе мы покажем как это осуществить.

Текстурные координаты

При создании текстурированных объектов необходимо кроме координат вершин задавать координаты текстуры. OpenGL использует их для отображения (mapping) на поверхность объекта. Он как бы наклеивает текстуру на геометрический примитив. Текстурные координаты определяют какой texel в буфере текстуры соответствует данной вершине. Так же как и цвет, текстура во внутренней области примитива интерполируется на основе информации о значениях в вершинах примитива. Изменив координату текстуры и оставив неизменной соответствующую координату вершины, мы заставляем OpenGL либо растянуть, либо сжать текстурный узор.

Текстурные координаты могут иметь один, два, три или четыре компонента. Их принято обозначать как s, t, r, и q-координаты. Это решение создатели объясняют так: «чтобы не спутать с x, y, z, w — координатами объекта». Одномерные текстуры используют только s-компонент. Двухмерные — s и t. Говорят, что где-то есть реализации OpenGL, в которых работают 3D-текстуры. Они используют и r-компонент. Четвертый компонент q, как и координата w, обычно равен единице и может, как описано в advanced features, использоваться для создания однородных(?) координат. Для сопоставления координат текстуры с координатами вершины используют команду glTexCoord*. Ее обычно дают совместно с glVertex* и glNormal* внутри блока glBegin, glEnd, задающего примитив. Все компоненты заключены в диапазон [0, 1], но иногда, при создании повторяющихся узоров, они принимают значения в более широком диапазоне.

Двухмерная текстура, натянутая на трехмерный объект

Под растровым изображением (bitmap-image) в Windows понимают блок данных специального формата DIB (Device-Independent Bitmap), который используется для хранения и обработки изображений с учетом различных цветовых разрешений экрана. К сожалению, существует великое множество форматов хранения растровых изображений (см. Bitmap.doc в папке 3 семестра), даже под одной и той же вывеской bmp-файлов. OpenGL имеет свою собственную концепцию о том, как следует хранить и обрабатывать точечные изображения. Ниже мы используем именно эту концепцию.

В примере показано как создать двухмерное изображение OpenGL на основе bmp-файла и с помощью текстурных координат натянуть его на грани куба. В процедуру инициализации приложения Init надо вставить вызов новой функции LoadTexture, которая откроет bmp-файл. Файловый путь подается в функцию auxDIBImageLoad, которая читает файл и заполняет специальную структуру данных AUX_RGBImageRec, например так:

AUX_RGBImageRec *p = auxDIBImageLoad ("Data/Crate.bmp");

Далее, для выборки и управления текстурой пользуются указателем p. Cоздайте новый файл Texture.cpp, скопируйте в него коды из предыдущего файла Colors.cpp и введите изменения (новые глобальные переменные, новая функция LoadTexture, и изменеия в теле Init и Draw). Файлы NeHe.h и NeHe.cpp оставьте без изменения. Они определяют общее поведение Windows-приложения.

float angleX, angleY, angleZ; // X, Y and Z Rotation angles

TCHAR curDir[MAX_PATH], *pFile = 0; // Current directory and Bitmap file name

UINT texture;  // Texture identifier

bool LoadTexture (TCHAR *fn, UINT *pTexture)

{

if (fn == 0)

return false;

AUX_RGBImageRec *p = auxDIBImageLoad (fn);

if (p == 0)

return false;

glGenTextures (1, pTexture);

glBindTexture (GL_TEXTURE_2D, *pTexture); // Typical Texture Generation Using Bitmap

glTexImage2D (GL_TEXTURE_2D, 0, 3, p->sizeX, p->sizeY,