Array ( )
Вход:




Главная | OpenGL | GLSL | AI | Сеть | Примеры | Библиотека

OpenGL: Текстуры - текстурные матрицы






В этом уроке я обьясню вам, что такое текстурные матрицы.
Возможно, вы уже слышали (а если нет, то знайте), что в 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);
}


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







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




Комментарии:

Войдите, чтобы оставить комментарий:












Яндекс.Метрика
 Яндекс цитирования.