Программирование: Руководство Пользователя GLFW.Глава 1 и Глава 2.

Читай на DevTribe.ru!

» Раздел: C++

Перед вами перевод Руководства Пользователя библиотеки GLFW
Автор перевода: Nerevar

Часть 1

Введение

GLFW - это портируемое API (Application Program Interface) которое управляет специфическими задачами операционных систем относящихся к программированию с OpenGL. В то время как OpenGL в целом является портируемым, простым в использовании и в результате имеется чистый и компактный код, специфические механизмы операционных систем которые требуются для создания и управления OpenGL-окна являются сложными. GLFW пытается исправить это путем предоставления следующего функционала:
-открытие и управления OpenGL-окном
-управление вводом с клавиатуры,мыши и джойстика
-предоставление высокоточного таймера
-поддержка мульти-поточности
-поддержку запросов и использования OpenGL-расширений
-встроенную возможность загрузки изображений
Весь этот функционал реализован в виде набора простых для использования функций,что дает возможность написания OpenGL-приложения с помощью всего-лишь нескольких строк кода.
GLFW API не зависит от платформы и операционной системы,что дает простую возможность портирования OpenGL-приложений основанных на GLFW между поддерживаемыми платформами.
В данный момент поддерживаются следующие платформы:
-Microsoft Windows
-Unix or Unix-like systems running the X Window System with GLX version 1.3 or later
Существует также устаревшая поддержка Mac OS версий 10.3 и 10.4,используя Carbon API.

Часть 2

Приступаем к работе
В этой части вы узнаете,как написать простое OpenGL-приложение,используя GLFW.Мы начнем с инициализации GLFW,затем мы откроем окно и отловим некоторые действий пользователя.

2.1 Подключаем заголовок GLFW

Обычным способом подключения заголовка GLFW является:
#include <GL/glfw.h>
Этот заголовок определяет все константы,типы и прототипы функций GLFW API.Он также по-умолчанию включает заголовки OpenGL и GLU(Graphic Library Utils),предоставляемые вашей средой разработки и определяющие все необходимые константы и типы,которые нужны для работы этих заголовков на этой конкретной платформе.
По-умолчанию заголовок gl.h включен.Если вы хотите вместо этого включить gl3.h,определите GLFW_INCLUDE_GL3 перед включением заголовка GLFW.
Также по-умолчанию заголовок glu.h включен.Если вы хотите избежать этого,установите GLFW_NO_GLU перед включением заголовка GLFW.

2.2 Инициализация GLFW

Перед использованием любых функций GLFW,необходимо вызвать glfwInit.Это инициализирует части GLFW, не относящиеся к окну,такие как поточность,таймер или ввод с джойстика.C-синтаксис:
int glfwInit( void )
glfwInit возвращает GL_TRUE если инициализация прошла успешно, или GL_FALSE если не удалось инициализировать.
Когда ваше приложение выполняется с помощью GLFW, обычно в самом конце программы вы должны вызывать glfwTerminate. С-синтаксис:
void glfwTerminate( void )
Это освобождает все ресурсы, выделенные GLFW, закрывает окно,если оно открыто и уничтожает любые вторичные потоки,созданные GLFW (после этого вызова вы должны вызвать glfwInit снова,прежде чем использовать любые функции GLFW).

2.3 Открываем окно

Открытие OpenGL-окна осуществляется с помощью вызова функции glfwOpenWindow. Эта функция принимает 9 аргументов, которые используются для описания следующих свойств открываемого окна:
-размеры окна (ширина и высота) в пикселях
-размер цветового и альфа буфера в битах
-размер буфера глубины в битах (Z-buffer)
-размер буфера трафарета в битах
-следует ли использовать в полно-экранном или оконном режиме.
C-синтаксис функции glfwOpenWindow:
int glfwOpenWindow( int width, int height,
int redbits, int greenbits, int bluebits,
int alphabits, int depthbits, int stencilbits,
int mode )
 
glfwOpenWindow возвращает GL_TRUE если окно открыто правильно, или GL_FALSE если GLFW
не удалось открыть окно.
GLFW пытается открыть максимально соответствующее запрашиваемым параметрам окно.Некоторые параметры могут быть опущены установлением их в 0, что дает GLFW возможность использования стандартных значений или данный функционал будет выключен.Например,если ширина и высота будут установлены равными нулю,GLFW будет использовать стандартное разрешение экрана - 640х480.
Если размер буфера глубины равен нулю,открытое окно не будет иметь буфера глубины.
Аргументы режима используются для определение того,будет ли окно в полно-экранном или оконном режиме.
Если выбран режим GLFW_FULLSCREEN,окно будет охватывать весь экран и никакие границы окна или кнопки не будут видны.
Если это возможно,видео-режим будет выбран наиболее соответствующим переданным аргументам.
Кроме того,указатель мыши будет скрыт и заставки запрещены.Обычно это лучший режим для игры и демо-приложений.
Если выбран режим GLFW_WINDOW,окно будет открыто как обычно,с границами и кнопками.Указатель мыши не будет спрятан и заставки могут быть активированы.
Для закрытия окна вы можете использовать glfwTerminate, как написано выше,либо можете использовать
более логичный подход,используя функцию glfwCloseWindow, которая имеет C-синтаксис:
void glfwCloseWindow( void )
Обратите внимание,вам не нужно вызывать glfwTerminate и glfwInit перед открытием нового окна,после того как текущее будет закрыто вызовом glfwCloseWindow.

2.4 Используем отлов ввода пользователя

GLFW дает несколько путей отлова ввода пользователя, с которыми мы ближе познакомимся в главе 4. Один из простейших путей отлова ввода пользователя - использование функции glfwGetKey:
int glfwGetKey( int key )
Она определяет текущее состояние отдельных клавиш клавиатуры. Аргумент определяет, какую клавишу следует проверить,и это может быть либо печатный ISO 8859-1 (Latin 1) символ (например, 'A', '3 'или'. '), или специальный идентификатор ключа (см. справочное руководство GLFW для списка специальных идентификаторов ключей).
glfwGetKey возвращает GLFW_PRESS если клавиша в данный момент нажата, или GLFW_RELEASE если клавиша в данный момент не нажата. Например:
A_pressed = glfwGetKey( ’A’ );
esc_pressed = glfwGetKey( GLFW_KEY_ESC );
Для того,чтобы glfwGetKey имела какой-нибудь эффект, необходимо опрашивать входные события на регулярной основе. это можно сделать одним из двух способов:
-Неявным вызовом glfwSwapBuffers часто.
-Явным вызовом glfwPollEvents часто.
В основном вы не должны заботиться об этом,так как обычно вызов glfwSwapBuffers происходит для смены заднего и переднего буфера в каждом кадре. Однако,если это не происходит, вы должны вызывать glfwPollEvents порядка 10-100 раз в секунду чтобы держать GLFW в курсе состояния ввода пользователя.

2.5 Собираем всё вместе: минимальное GLFW-приложение

Теперь,когда вы знаете как инициализировать GLFW, открыть окно и обработать ввод пользователя, попробуем написать простое OpenGL-приложение
#include <GL/glfw.h>
#include <stdlib.h>
int main( void )
{
int running = GL_TRUE;
// Инициализируем GLFW
if( !glfwInit() )
{
   exit( EXIT_FAILURE );
}
// Открываем OpenGL-окно
if( !glfwOpenWindow( 300,300, 0,0,0,0,0,0, GLFW_WINDOW ) )
{
   glfwTerminate();
   exit( EXIT_FAILURE );
}
// Основной цикл
while( running )
{
// Функции отрисовки OpenGL находятся здесь
   glClear( GL_COLOR_BUFFER_BIT );
// Сменяем задний и передний буферы
   glfwSwapBuffers();
// Проверяем,нажата ли клавиша Esc,либо окно закрыто
   running = !glfwGetKey( GLFW_KEY_ESC ) && glfwGetWindowParam( GLFW_OPENED );
}
// Закрываем окно и деинициализируем GLFW
   glfwTerminate();
// Выходим из программы
   exit( EXIT_SUCCESS );
}
Эта программа открывает окно 300х300 и выполняется в цикле,пока клавиша Esc не будет нажата,либо окно не будет закрыто.Все функции OpenGL,которые вызываются в данном примере - это очистка окна.
Также к статье прикрепляю glfw.lib,glfwdll.lib,glfw.h,glfw.dll,OPENGL32.lib

Просмотров: 3 175

Xipxop #1 - 4 года назад 2
Глупый вопрос, но всеже, зачем вы подключили библиотеку stdlib.h ?(просто многие подумают, что она нужна...)
Nerevar #2 - 4 года назад 2
stdlib.h
для этого:
exit( EXIT_FAILURE );
...
exit( EXIT_SUCCESS );
а вообще SFML более трушная либа,чем эта
aversilov #3 - 2 года назад 0
Прошу прощения, а где архив с файлами, прикреплённый к статье?
LeikyS #4 - 2 года назад 0
aversilov:
Прошу прощения, а где архив с файлами, прикреплённый к статье?
Статья вышла три года назад, может когда-то и был прикреплённый архив