Китай |
Простая программа на OpenGL
Упражнение 1. Создание простого графического окна (Simple)
// Simple.cpp : Defines the entry point for the console application. // #include "stdafx.h" // Прототипы функций void RenderScene(void); void SetupRC(void); // Точка входа приложения void main(void) { glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA); glutCreateWindow("Simple"); glutDisplayFunc(RenderScene); SetupRC(); glutMainLoop(); } //**************************************************** // Функция обратного вызова для рисования сцены void RenderScene(void) { // Окно очищается текущим цветом, // установленным функцией glClearColor() glClear(GL_COLOR_BUFFER_BIT); // В буфер вводятся команды рисования glFlush(); } //**************************************************** // Устанавливается состояние инициализации void SetupRC(void) { glClearColor(0.0F, 0.0F, 1.0F, 1.0F);// RGB + alpha-канал }Листинг 19.7. Файл реализации Simple.cpp
- Запустите приложение на выполнение
Оболочка выдаст предупреждение, что данная форма проекта является устаревшей.
Должен получиться такой результат
Разбор кода Simple
Наша простая программа содержит вызовы четырех функций библиотеки GLUT (с префиксом glut ) и три вызова "чистых" функций OpenGL (с префиксом gl ). Вспомогательная библиотека GLUT ( OpenGL Utility Toolkit - набор инструментов OpenGL ) написана Марком Килгардом (Mark Kilgard) и предназначена для межплатформенных примеров программирования и демонстраций. В нее входят графические элементы пользовательского интерфейса, включая использование меню, управление другими окнами, обеспечение поддержки джойстика и др. Ее использование как расширение OpenGL содействует обучению и такому написанию программ OpenGL, чтобы программист не занимался деталями конкретной среды, а сосредоточился на написании основного кода графического приложения. Библиотеку GLUT можно бесплатно найти в Internete.
Сама наша программа делает немного. Она создает стандартное окно графического интерфейса пользователя ( GUI ) с надписью Simple и синим фоном. В файл stdafx.h помещены подключения заголовков прототипов функций, используемых в программе.
Строка
glutInitDisplayMode(GLUT_SINGLE | GLUT_RGBA);
устанавливает режим отображения графического окна при его создании. Соединение макросов в параметрах вызова функции задает окно с одиночной буферизацией ( GLUT_SINGLE ) и режим цвета RGB с альфа-каналом ( GLUT_RGBA или GLUT_RGB ). Альтернативным режимом задания цветов является режим использования индексированных цветов ( GLUT_INDEX ). Одиночная буферизация означает, что все команды рисования выполняются прямо в отображаемом окне (на контексте, холсте). Существует еще двойная буферизация (задается параметром GLUT_DOUBLE ), когда команды рисования выполняются в буфере вне экрана, а затем быстро отображаются в окне.
Строка
glutCreateWindow("Simple");
создает графическое окно с надписью в строке заголовка из параметра вызова.
Строка
glutDisplayFunc(RenderScene);
устанавливает нашу функцию RenderScene как функцию обратного вызова (call back), в которой можно размещать вызовы функций визуализации OpenGL.
Строка
SetupRC();
является вызовом нашей функции упаковки кода, в которой разместили всю необходимую на данном этапе инициализацию OpenGL, которую нужно выполнить перед визуализацией окна. Многие состояния OpenGL устанавливаются только один раз и их не нужно обновлять при каждой визуализации кадра (экрана, заполненного графикой).
Строка
glutMainLoop();
вводит приложение в цикл сообщений. Она должна быть вызвана только один раз и работает до завершения приложения. Она обрабатывает обрабатывает все сообщения, связанные с операционной системой (управление курсором, нажатие клавиш и т.д.).
Строка
glClearColor(0.0F, 0.0F, 1.0F, 1.0F);// RGB + alpha-канал
устанавливает цвет модели RGB, используемый для очистки окна. Получая код цвета, Windows и OpenGL преобразуют его в ближайшую точную величину, поддерживаемую конкретной видеоаппаратурой. Последний аргумент в вызове этой функции определяет величину альфа-канала - уровень прозрачности (1 - нeпрозрачный, 0 - абсолютно прозрачный).
Строка
glClear(GL_COLOR_BUFFER_BIT);
выполняет собственно очистку. Она может очищать определенный буфер или комбинацию буферов. Буфер - это область хранения информации об изображении. В OpenGL существует несколько типов буферов: цвета, глубины, трафарета и накопления. С помощью рассматриваемой команды удаляют из окна последний отображаемый рисунок.
Обычно решение о подвижке очереди команд принимает сама операционная система. Но строка
glFlush();
дает указание системе выполнить все невыполненные команды OpenGL немедленно и освободить очередь команд. Если не обращаться к этой функции, изображение все равно появится на экране, но с видимой задержкой вывода, особенно при наличии на компьютере сетевого оборудования. В приведенном выше коде у нас есть только одна команда для немедленного выполения - glClear().
Во внутреннем представлении OpenGL используется конвейер, последовательно обрабатывающий команды. Команды OpenGL часто выстраиваются в очередь, чтобы потом драйвер OpenGL обработал несколько команд одновременно. Такая схема увеличивает быстродействие, поскольку связь с аппаратным обеспечением происходит медленно. Поставка аппаратному обеспечению сразу целого пакета данных гораздо быстрее, чем несколько отдельных обращений с каждой командой или инструкцией.