Помощь в написании студенческих работ
Антистрессовый сервис

Минимальное приложение на OpenGL

РефератПомощь в написанииУзнать стоимостьмоей работы

Понятие двойной буферизации очень важно для анимации, поэтому рекомендуется всегда ее использовать. Простейший способ построения анимации заключается в том, что рендеринг осуществляется непосредственно в ту область видеопамяти, которая отображается на экране/в окне. Такой подход называется одиночной буферизацией и обычно ведет к возникновению неприятного мерцания. Представьте себе, что необходимо… Читать ещё >

Минимальное приложение на OpenGL (реферат, курсовая, диплом, контрольная)

Ниже приведен пример минимального приложения на OpenGL. Для создания окна, куда будет производиться рендеринг, и чтения сообщений от мыши и клавиатуры используется библиотека GLUT:

Минимальное приложение на OpenGL.
Минимальное приложение на OpenGL.

Функция glutlnit служит для инициализации библиотеки GLUT и должна быть первой командой GLUT, вызываемой в приложении. Далее посредством команды glutlnitDisplayMode задается, какие именно буферы нам нужны: в данном примере мы требуем наличия буфера цвета (GLUT_RGB), буфера глубины (GLUT_DEPTH) и поддержки двойной буферизации (GLUT_DOUBLE).

Понятие двойной буферизации очень важно для анимации, поэтому рекомендуется всегда ее использовать. Простейший способ построения анимации заключается в том, что рендеринг осуществляется непосредственно в ту область видеопамяти, которая отображается на экране/в окне. Такой подход называется одиночной буферизацией и обычно ведет к возникновению неприятного мерцания. Представьте себе, что необходимо вывести изображение белого квадрата, перемещающегося по черному фону. Тогда для каждого кадра анимации мы сначала очищаем окно, заполняя его черным, а потом поверх черного рисуем белый квадрат. Однако при этом в какой-то (очень малый) момент времени на месте белого квадрата будет черный фон. И глаз человека очень хорошо это воспринимает: будет казаться, что квадрат ощутимо и неприятно «мерцает».

Для борьбы с этим эффектом и была предложена двойная буферизация. Она заключается в том, что вместо одной области видеопамяти, которая отображается на экране и в которую мы осуществляем рендеринг, используются две области/буфера — передняя и задняя. Одна из них отображается на экране, а в другую осуществляется рендеринг. Когда рендеринг очередного кадра завершен, эти области меняются местами. В результате человек видит не процесс построения изображения, а только готовое изображение.

Все, что нужно для поддержки двойной буферизации в GLUT, — это задать флаг GLUT_DOUBLE при вызове glutlnitDisplayMode.

Команды glutlnitWindowSize и glutlnitWindowPos служат для задания размера создаваемого окна и его положения на экране (в пикселах). После завершения рендеринга кадра вызывается glutSwapBuffers, для того чтобы сообщить системе, что буферы можно менять местами.

При помощи вызова команды glutCreateWindow создается окно с заданными ранее размером и положением на экране. Единственным аргументом этой функции является строка — заголовок окна. Именно эта функция создает так называемый контекст OpenGL. До нее (г.е. пока контекст нс создан) нельзя вызывать никаких функций OpenGL. Эта функция возвращает целочисленный идентификатор окна.

Команды glutDisplayFunc, glutReshapeFunc и glutKeyboardFunc.

устанавливают обработчики событий — функции, которые будут вызываться соответственно при необходимости произвести рендеринг в окно, при изменении размеров окна и при нажатии на клавишу (генерирующую ASCII-код).

Независимо от того, запросили ли мы поддержку двойной буферизации, в функции, осуществляющей рендеринг в окно (display), после осуществления рендеринга необходимо вызвать glutSwapBuffers. Этот вызов сообщает системе, что изображение готово и может быть показано в окне.

В действительности в библиотеке GLUT поддерживается гораздо больше обработчиков событий, чем те, что мы рассмотрели.

И наконец, функция glutMainLoop запускает цикл обработки сообщений, в ходе которого будут обрабатываться принимаемые сообщения от оконной системы и, при необходимости, вызываться установленные обработчики. Обратите внимание, что из этой функции управление никогда не возвращается, для прекращения работы программы явно нужно вызвать exit.

Также обратите внимание, что все рисование может происходить только при получении соответствующего сообщения от оконной системы, т. е. только в функции, установленной с помощью glutDisplayFunc. Если необходимо что-то изменить в изображении, нужно сообщить оконной системе о том, что изображение нуждается в перерисовке. Для этого вызывается функция glutPostRedisplay.

Библиотеку GLUT вам необходимо скачать отдельно. Для Microsoft Windows это можно осуществить по адресу https://www. opengl.org/resources/libraries/glut/. Для операционной системы Linux можно воспользоваться менеджером пакетов для установки пакета freeglut-dev. Для операционной системы Mac OS X при установке среды разработки GLUT устанавливается автоматически.

Первое, что должна сделать программа, строящая какое-либо изображение, — очистить все используемые буферы. Для этого служит команда glClear, которая на вход получает целое число, различные биты которого соответствуют основным используемым буферам OpenGL. Так, следующая команда очищает сразу буфер цвета, буфер глубины, буфер трафарета и буфер накопления:

glClear (GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT|.

GL_STENCIL_BUFFER_BIT|GL_ACCUM_BUFFER_BIT);

При этом для очистки каждого из буферов используется свое значение, которое прописывается для всех пикселов соответствующего буфера. В OpenGL есть команды, которые служат для задания значений, которые будут использоваться при очистке соответствующих буферов. Так для задания цвета, который будет использоваться для очистки буфера цвета, служит команда glClearColor, получающая на вход четыре числа с плавающей точкой, задающих цвет в виде RGB, А (каждое из этих чисел должно лежать в отрезке [0, 1]).

Для задания значений, используемых при очистке буферов глубины и трафарета, служат команды glClearDepth и glClearStencil:

glColorDepth (I.O);

glClearStencil (O);

Показать весь текст
Заполнить форму текущей работой