Внимание!

Эта публикация перенесена в раздел уроков по адресу GLFW. Скелет OpenGL приложения со сглаживанием..
К ней прикреплена новая отдельная ветка комментариев форума, которую вы можетет найти после текста публикации.
Обсуждение публикации рекуомендуется вести по новому адресу, который указан выше.

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

Создадим скелет glfw приложения с полноэкранным сглаживанием.


Чем хороша glfw?

  • Тем, что она постоянно совершенствуется и поддерживается, по сравнению с тем же freeglut-ом, который давненько не обновляется(за исключением последнего обновления связанного с multitouch=)), об этом свидетельствует дата релиза последней версии glfw. Да, и freeglut и не будет дальше развиваться, так как достиг цели, стать открытым аналогом glut.
  • Она кроссплатформенна.
  • В ней есть встроенная кросс платформенная многопоточность, которую можно легко использовать перенося на другие платформы.
  • Она проста в использовании, и частично напоминает старый добрый glut.
  • В ней есть встроенная возможность загружать TGA изображения, и удобные функции установки текстуры.
  • Ее можно пролинковать статически.
Вот некоторые особенности glfw:
  • Простой в использовании API в стиле OpenGL API,
  • Дает вам окна и OpenGL контекста с двумя вызовами функции
  • Явная поддержка MSAA и OpenGL 3.2 +, включая профили и флаги
  • Клавиатура, мышь, джойстик (за исключением Mac OS X) и временные функции
  • Ввод может быть как опрос или доставляется через обратные вызовы
  • Основные ввода символов Unicode
  • Поддержка статического и динамического связывания
  • Open Source с либеральной OSI-сертифицированных лицензии
  • Make-файлы или файлы проекта для самых популярных C / C + + компиляторов
  • Примеры и всеобъемлющей документации
И так небольшой скелет 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 библиотеки.
Может Вам поможет это скриншот:



После удачной сборки и запуска можно по нажимать влево, вправо, чтобы по вращать четырехугольник.

Скачать проект(библиотека внутри)


Полезные ссылки
сайт glfw
Статья про создания OpenGL приложения с сглаживанием, на WinAPi в ручную
NeHe урок, про сглаживание в OpenGL
Сглаживание Википедия
0       1645        06.05.2012        2

Внимание!

Эта публикация перенесена в раздел уроков по адресу GLFW. Скелет OpenGL приложения со сглаживанием..
К ней прикреплена новая отдельная ветка комментариев форума, которую вы можетет найти после текста публикации.
Обсуждение публикации рекуомендуется вести по новому адресу, который указан выше.

0  
07.05.2012 00:00:00
надеюсь когда-нибудь попробую :D
хороший обзор, может есть еще какие-либо особенности, которые можно описать в отдельных статьях
0  
11.05.2012 00:00:00
Есть, и будут описаны чуть позже.)
^