Опубликован: 13.07.2010 | Уровень: специалист | Доступ: платный
Самостоятельная работа 19:

Простая программа на OpenGL

Упражнение 1. Создание простого графического окна (Simple)

  • Заполните файл реализации Simple.cpp следующим кодом
// 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
  • Запустите приложение на выполнение

Оболочка выдаст предупреждение, что данная форма проекта является устаревшей.


  • Установите флажок Do not show this dialog again и щелкните на кнопке 19_16

Должен получиться такой результат


Разбор кода 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 обработал несколько команд одновременно. Такая схема увеличивает быстродействие, поскольку связь с аппаратным обеспечением происходит медленно. Поставка аппаратному обеспечению сразу целого пакета данных гораздо быстрее, чем несколько отдельных обращений с каждой командой или инструкцией.

Александр Очеретяный
Александр Очеретяный
Украина, Киев
Анастасия Балыбердина
Анастасия Балыбердина
Украина, Киев, НТУУ КПИ