Компьютерная графика | ||||||||||||||||||||||||
теория, алгоритмы, примеры на С++ и OpenGL | ||||||||||||||||||||||||
2D теория | 3D теория | OpenGL | Обратная связь / Авторам | |||||||||||||||||||||
Мы vkontakte.ru ДрузьяСловарь синонимов русского языка |
Каркас OpenGL приложения с использованием GLUT
Сложность работы с OpenGL, как и с любой достаточно продвинутой
технологией, состоит в том, что до написания первой строчки кода, рисующей
что-либо на экране, требуется создать необходимые объекты, установить формат
пиксела, проинициализировать вспомогательные буферы и т.д. Т.е. сообщить OpenGL, что, где и как мы
собираемся рисовать. Во многих книгах первая глава, размером в несколько десятков страниц посвящена подробному разбору интеграции OpenGL в систему. Человеку, который хочет изучать графику, это обычно кажется невероятно скучным. Часто такое решение не является кроссплатформенным, в то время, как многие программы для научной визуализации создаются под Linux. Решением в данной ситуации является использование библиотеки GLUT. Она берет на себя работу по созданию окна, инициализации OpenGL, обработки сообщений от мыши и клавиатуры. Более того, используя библиотеку GLUT, такие функции, как включение аппаратного сглаживания, делаются в несколько строк кода. Прим. Существуют достаточно большие и сложные приложения, предназначенные для научной визуализации, созданные с использованием библиотеки GLUT. Так что эта библиотека используется не только в учебных целях, но и в ряде реальных продуктов, построенных на технологии OpenGL. Установка GLUTGLUT не идет по умолчанию в системе и в среде
разработки. Вам потребуется найти и скачать последнюю версию по ссылке: GLUT Downloads. Скопируйте *.dll файлы в папку system, находящуюся в директории c Windows. Файлы *.lib положите в папку lib Visual C++, файл glut.h в папку Include\gl. Прим. Версию 3.6 можно скачать по ссылке: glutdlls36.zip К примеру, файлы могут располагаться таким образом:
Код шаблонаПерейдем непосредственно к рассмотрению шаблона. Файл main.cpp:#include "engine.h" Engine *engine; GLvoid display(GLvoid) { engine->Draw(); glutSwapBuffers(); } GLvoid reshape(GLsizei width, GLsizei height) { engine->Resize(width, height); } int main(int argc, char** argv) { glutInit(&argc, argv); glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB); glutInitWindowSize(800, 600); glutInitWindowPosition(100, 100); glutCreateWindow("2.1. Каркас OpenGL приложения c использованием GLUT."); engine = new Engine(); engine->Init(); glutDisplayFunc(display); glutReshapeFunc(reshape); glutMainLoop(); return 0; } Это весь код, который необходим, чтобы рисовать на экране средствами OpenGL. Команды OpenGL, которые отвечают за установку проекции и рисование вынесены в класс Engine, чтобы разделить приложение на логические части. Часть приложения из модуля main.cpp отвечает за диалог с системой, а класс Engine за вывод графики. Прим. Разработка графических приложений, как и любых других, требует не только кодирования, но и создания определенной структуры. В данном случае, это разделение графического движка и кода, отвечающего за связь с системой. Приведем небольшие комментарии по приведенному коду:
Содержание модуля Engine.cpp: #include "engine.h" if (height == 0) { height = 1; } glViewport(0, 0, width, height); // Устанавливается область просмотра Height = height; Width = width; SetProjectionMatrix(); SetModelviewMatrix(); } GLvoid Engine::Init(GLvoid){ glClearColor(0.2f, 0.5f, 0.75f, glClearDepth( // заполнения буфера глубины по умолчанию glEnable(GL_DEPTH_TEST); // Включается тест глубины glDepthFunc(GL_LEQUAL); // Устанавливается значение, используемое // в сравнениях при использовании // буфера глубины glShadeModel(GL_SMOOTH); // Включается плавное затенение glEnable(GL_LINE_SMOOTH); // Включается сглаживание линий glHint(GL_LINE_SMOOTH_HINT, GL_NICEST); // Выбирается самый качественный // режим сглаживания для линий glEnable(GL_BLEND); // Включается смешение цветов, необходимое glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); // для работы сглаживания и задается // способ смешения } GLvoid Engine::Draw(GLvoid) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Очищается буфер кадра и буфер глубины glPushMatrix(); // Запоминается матрица модели glColor3f(1.0f, 1.0f, glutWireCube( glPopMatrix(); // Восстанавливается матрица модели } Подробные комментарии помогут вам разобраться в данном модуле, но все функции, так или иначе, будут рассмотрены подробнее в последующих статьях. Итак, шаблон создан. Последующие статьи будут базироваться на нём. Когда нам потребуется реагировать на действия пользователя, ввод с использованием библиотеки GLUT будет рассмотрен в отдельной статье. |