GLFW. Скелет OpenGL приложения со сглаживанием.

Блоговая публикация пользователя: Flashhell Эта публикация была перенесена из личного блога пользователя в общие разделы уровок сайта.

GLFW. Скелет OpenGL приложения со сглаживанием

В это уроке вы научитесь создавать приложения с использованием OpenGL в связке с библиотекой GLFW, предназначенной для создания оконных приложений, позволяющая быстро реализовывать поддержку OpenGL 3.2.

Перейдем к созданию скелета GLFW-приложения с полноэкранным сглаживанием.

В чем главные преимущества библиотеки GLFW?
  • она постоянно совершенствуется и поддерживается, по сравнению даже с Freeglut, который давненько не обновляется (за исключением последнего обновления связанного с multitouch), об этом свидетельствует дата релиза последней версии GLFW;
  • кроссплатформенность;
  • простота и доступность в использовании, и частично напоминает старый добрый glut;
  • встроенная возможность загружать TGA изображения и удобные функции установки текстуры;
  • можно пролинковать статически.

Итак, небольшой скелет GLFW-приложения:

Код:
/*http://esate.ru, Flashhell*/

#include "GL\glfw.h" // или <GL\glfw.h> если поместили либу в глобальные пути
#include <iostream>


int main()
{
    int     width, height;
    int     frame = 0;
    bool    running = true;

    glfwInit(); // инициализация библиотеки
    glfwOpenWindowHint(GLFW_FSAA_SAMPLES, 4); // установка количества образцов для просчета сглаживания буфера
    if( !glfwOpenWindow( 1024, 768, 0, 0, 0, 0, 0, 0, GLFW_WINDOW ) )// открытие окна с нужными параметрами
    {
        std::cout<<"error!";
        glfwTerminate(); // освобождает ресурсы, закрывает окно
        return 0;
    }

    glfwSetWindowTitle("GLFW Application"); // установка заголовка окна
    while(running) // главный цикл приложения MainLoop
    {
        if(glfwGetKey(GLFW_KEY_RIGHT))frame++;
   if(glfwGetKey(GLFW_KEY_LEFT))frame--;

        glfwGetWindowSize( &width, &height ); // получение размеров окна
        height = height > 0 ? height : 1; // защищаемся от деления на ноль

        glViewport( 0, 0, width, height ); // установка области просмотра

        glClearColor( 0.0f, 0.0f, 0.0f, 0.0f ); // установка цвета очистки
        glClear( GL_COLOR_BUFFER_BIT ); // чистим 

        glMatrixMode( GL_PROJECTION ); // ставим текущей матрицу проектирования
        glLoadIdentity(); // загрузка единичной матрицы
        gluPerspective( 65.0f, (GLfloat)width/(GLfloat)height, 1.0f, 100.0f );

        glMatrixMode( GL_MODELVIEW ); // ставим текущей модельную матрицу
        glLoadIdentity(); // загружаем единичную матрицу
        gluLookAt(0.0f, -10.0f, 0.0f,
                0.0f, 0.0f, 0.0f,
                0.0f, 0.0f, 1.0f );

        glRotatef(frame, 0.25f, 1.0f, 0.75f); // поворачиваем модельную матрицу
        glBegin( GL_QUADS ); // рисуем четырехугольник
           // установка цвета рисования
          glColor3f(1.0f, 0.0f, 0.0f );
           // задания позиции вектора фигуры
          glVertex3f(0.0f, 0.0f, -4.0f);
          glColor3f(0.0f, 1.0f, 0.0f );
          glVertex3f(-1.0f, -2.0f, -4.0f);
          glColor3f(0.0f, 0.0f, 1.0f );
          glVertex3f(3.0f, -2.0f, -4.0f);
          glColor3f(0.0f, 0.0f, 1.0f );
          glVertex3f(3.0f, 0.0f, -4.0f);
        glEnd();
        glfwSwapBuffers(); // меняем задний буфер и передний местами

         // выход из цикла при нажатии esc или при закрытии окна
        running = !glfwGetKey(GLFW_KEY_ESC) && glfwGetWindowParam( GLFW_OPENED);
    }

    glfwTerminate(); // освобождает ресурсы, закрывает окно (если оно открыто)

    return 0;
}


Некоторые моменты по коду:
  • glfwOpenWindowHint (GLFW_FSAA_SAMPLES, 4) - установка количества образцов, которые будут использованы в мультисэмплинг буфере для просчета сглаживания. Чем выше количество, тем лучше качество сглаживания. Но в то же время чем больше образцов, тем больше накладных ресурсов памяти для буферов, которые могут снизить производительность.
  • int glfwOpenWindow (int width, int height, int redbits, int greenbits, int bluebits, int alphabits, int depthbits, int stencilbits, int mode) - здесь все просто, мы передаем нужные параметры для открытия окна, но некоторые параметры у меня были переданы нулем. Это сделано для того, чтобы GLFW использовала параметры по умолчанию.
  • glfwGetKey(GLFW_KEY_ESC) - опрос клавиши Escape, если клавиша нажата, функция вернет 1, если нет, то 0.
Сборка приложения

Не забудьте пролинковать GLFW-библиотеку, либо локально, положив в тот же каталог, что и проект, и указав линкеру имя. Либо же поместив в глобальные пути вашей среды разработки, также указав имя линкеру. Также пролинкуйте OpenGL и GLU библиотеки (рис. 1).

Уроки OpenGL различных тематик: Линкование GLFW, OpenGL и GLU Рисунок 1. Линкование GLFW, OpenGL и GLU.
После удачной сборки и запуска можно понажимать влево и вправо, чтобы повращать четырехугольник.

Добавить комментарий
Расширенный режим добавления комментариев доступен на форуме: загрузка изображений, цитирование, форматирование текста, и т.д.
Ваше имя:
Текст сообщения:
^