Руководство Пользователя GLFW.Глава 1 и Глава 2.
Перед вами перевод Руководства Пользователя библиотеки 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
Смотрите также:
Комментарии
Глупый вопрос, но всеже, зачем вы подключили библиотеку stdlib.h ?(просто многие подумают, что она нужна...)
stdlib.h
для этого:
exit( EXIT_FAILURE );
...
exit( EXIT_SUCCESS );
а вообще SFML более трушная либа,чем эта
Прошу прощения, а где архив с файлами, прикреплённый к статье?
Прошу прощения, а где архив с файлами, прикреплённый к статье?
Статья вышла три года назад, может когда-то и был прикреплённый архив
CollectableItemData.cs
[CreateMenuItem(fileName = "newItem", menuName = "Data/Items/Collectable", order = 51]