В этом уроке я обьясню вам, что такое текстурные матрицы.

Возможно, вы уже слышали (а если нет, то знайте), что в OpenGL есть 3 разных вида матриц: проекции, моделей и текстур (GL_PROJECTION, GL_MODELVIEW, GL_TEXTURE).

Матрицы проекции в какой-то мере определяют, как трехмерная сцена будет проецироваться на наш плоский экран. Матрица моделей определяет вид 3д сцены, она условия определяет передвижения объектов в пространстве сцены и передаёт вид туда, где расположена наша камера.

Ну а что делает матрица текстур? Используя матрицу текстур, мы можем создать так так сказать шейдероподобные объекты. В наше время много текстурных эффектов достигается пиксельными шейдерами. Эти шейдеры пишутся на специальном языке и
затем исполняются непосредственно видеокартой. Но кроме шейдеров манипуляции с текстурами также могут быть осуществлены с использованием текстурной матрицы.

Всё, что мы хотим сделать — написать приложение, дающее нам возможность вращать, перемещать, изменять размер текстурных координат. Подробности — в коде main.cpp

Файлы взяты из прошлого урока (загрузка текстур).

В этом уроке изменяем только main.cpp:

// Прежде всего увеличим количество загружаемых текстур до двух:
TextureImage textures[2];
//                    ^// Теперь в функции Init() добавим загрузку ещё одной текстуры:
void Init(HWND hWnd)
{
…………
…………
Texture->LoadTexture(IL_BMP,«image.bmp»,&textures[1]);
}// И переходим к функции RenderScene(). Вот как она выглядит:
void RenderScene()
{
// Создаем 2 статичных переменных для хранения угла вращения и перемещения:
static float moveX = 0.0f;
static float rotateZ = 0.0f;

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();

// Переместимся назад, чтобы видеть наш квадрат:
glTranslatef(0,0,-5);

// Включаем текстуры
glEnable(GL_TEXTURE_2D);

// Матрицы текстур работают очень просто. Мы просто указываем OpenGL,
// что хотим работать с текстуами вызовом функции glMatrixMode() с необходимым
// аргументом:
glMatrixMode(GL_TEXTURE);
glPushMatrix();
glLoadIdentity();
// И теперь glTranslatef() коснется не геометрических фигур, а
// нанесённых на них текстур:
glTranslatef(moveX,0,0);
glBindTexture(GL_TEXTURE_2D, textures[0].texID);
glBegin(GL_QUADS);
glTexCoord2f(0, 1); glVertex3f(2.5, 0, 0);
glTexCoord2f(1, 1); glVertex3f(1.5, 0, 0);
glTexCoord2f(1, 0); glVertex3f(1.5, 1, 0);
glTexCoord2f(0, 0); glVertex3f(2.5, 1, 0);
glEnd();
glPopMatrix();

// Теперь попробуем вращение:
glPushMatrix();
glLoadIdentity();
// Тут то же самое: glRotatef() относится к текстуре, нанесенной
// на второй квадрат:
glRotatef(rotateZ,0,0,1);
glBindTexture(GL_TEXTURE_2D, textures[1].texID);
glBegin(GL_QUADS);
glTexCoord2f(0, 0); glVertex3f(1, 0, 0);
glTexCoord2f(1, 0); glVertex3f(0, 0, 0);
glTexCoord2f(1, 1); glVertex3f(0, 1, 0);
glTexCoord2f(0, 1); glVertex3f(1, 1, 0);
glEnd();
glPopMatrix();

// В конце увеличим угол вращения и перемещение:
moveX+=0.01f;
rotateZ+=0.5f;

SwapBuffers(g_hDC);
}

 

Вот и всё, это действительно просто. По сути текстурные матрицы можно назвать «убогими шейдерами» =)

Исходные коды к уроку