Главная страница
Навигация по странице:

  • ^include

  • Используйте

  • Минимизируйте число изменений состояния

  • Избегайте использования команды

  • (int

  • GLUT_RGBA

  • GLUT INDEX

  • GLUT_STENCIL

  • Руководство по работе с графической библиотекой OpenGL. Руководство разработано с учетом опыта чтения курса Компьютерная графика


    Скачать 0.66 Mb.
    НазваниеРуководство по работе с графической библиотекой OpenGL. Руководство разработано с учетом опыта чтения курса Компьютерная графика
    Дата21.10.2022
    Размер0.66 Mb.
    Формат файлаdocx
    Имя файла221937-83556.docx
    ТипРуководство
    #747097
    страница18 из 30
    1   ...   14   15   16   17   18   19   20   21   ...   30
    else

    {

    glClear (GL_COLOR_BUFFER_Brr) ;

    }

    9.2.6. Разное

    Проверяйте ошибки GL во время написания программ

    Вызывайте команду glGetError() для проверки, не произошло ли ошибки во время вызова одной из функций OpenGL. Как правило, ошибки возникают из-за неверных параметров команд OpenGL или неверной последовательности команд. Для финаль­ных версий кода отключайте эти проверки, так как они могут существенно замедлить работу. Для проверки можно использо­вать, например, такой макрос:

    ^include #define CHECK_GL \

    assert (glGetErrorQ != GL_NO_ERROR);

    Использовать его можно так:

    glBegin (GL_TRIANGLES); glVertex3f (1 ,1 ,1); glEnd();

    128

    Глава 9. Оптимизация программ

    CHECK_GL;

    Используйте glColorMaterial вместо glMaterial

    Если в сцене материалы объектов различаются лишь одним параметром, команда glColorMaterial может быть быстрее, чем glMaterial.

    Минимизируйте число изменений состояния OpenGL

    Команды, изменяющие состояние OpenGL (glEnable, glDisable, glBindTexture и другие), вызывают повторные внутренние про­верки целостности, создание дополнительных структур данных и т.д., что может приводить к задержкам.

    Избегайте использования команды glPolygonMode

    Если вам необходимо рисовать много незакрашенных мно­гоугольников, используйте glBegin с GL_POINTS, GL_LINES, GL_LINE_LOOP или GL_LINE_STRIP вместо изменения режима рисования примитивов, так как это может быть намного быст­рее.

    Конечно, эти рекомендации охватывают лишь малую часть возможностей по оптимизации OpenGL-приложений. Тем не ме­нее, при их правильном использовании можно достичь суще­ственного ускорения работы ваших программ.

    9.3. Контрольные вопросы

    1. Перечислите известные вам методы высокоуровневой опти­мизации OpenGL-приложений.

    2. Почему предпочтительнее использование связанных при­митивов?

    9.3. Контрольные вопросы

    129

    3) Какая из двух команд выполняется OpenGL быстрее? glVertex3f (1 ,1 ,1);

    или

    float vet [3] = {1 ,1 ,1}; glVertex3fv ( vet );


    Часть III

    Создание приложений с OpenGL

    131
    Глава 10.

    OpenGL-приложения с помощью GLUT

    10.1. Структура GLUT-приложения

    Далее будем рассматривать построение консольного прило­жения при помощи библиотеки GLUT. Эта библиотека обеспечи­вает единый интерфейс для работы с окнами вне зависимости от платформы, поэтому описываемая ниже структура приложения остается неизменной для операционных систем Windows, Linux и других.

    Функции GLUT могут быть классифицированы на несколько групп по своему назначению:

    • инициализация;

    • начало обработки событий;

    • управление окнами;

    • управление меню;

    • регистрация функций с обратным вызовом;

    133

    134 Глава 10. OPENGL-приложения с помощью GLUT

    • управление индексированной палитрой цветов;

    • отображение шрифтов;

    • отображение дополнительных геометрических фигур (тор, конус и др.).

    Инициализация проводится с помощью функции:

    glutlnit (int *argcp , char **argv)

    Переменная argcp есть указатель на стандартную перемен­ную argc, описываемую в функции main(), a argv — указатель на параметры, передаваемые программе при запуске, который опи­сывается там же. Эта функция проводит необходимые начальные действия для построения окна приложения, и только несколько функций GLUT могут быть вызваны до нее. К ним относятся:

    glutlnitWindowPosition (int x, int у) glutlnitWindowSize (int width, int height) glutlnitDisplayMode (unsigned int mode)

    Первые две функции задают соответственно положение и размер окна, а последняя функция определяет различные режи­мы отображения информации, которые могут совместно зада­ваться с использованием операции побитового «или» (« | »):

    GLUT_RGBA Режим RGBA. Используется по умолчанию, ес­ли не указаны режимы GLUT_RGBA или GLUT_INDEX.

    GLUT_RGB To же, что и GLUT_RGBA.

    GLUT INDEX Режим индексированных цветов (использова­ние палитры). Отменяет GLUT_RGBA.

    GLUT_SINGLE Окно с одиночным буфером. Используется по умолчанию.

    GLUT_DOUBLE Окно с двойным буфером. Отменяет GLUT SINGLE.

    10.1. Структура GLUT-приложения

    135

    GLUT_STENCIL Окно с буфером маски. GLUT_ACCUM Окно с буфером-накопителем. GLUT_DEPTH Окно с буфером глубины.

    Это неполный список параметров для данной функции, од­нако для большинства случаев этого бывает достаточно.

    Работа с буфером маски и буфером накопления описана в главе 7.

    Функции библиотеки GLUT реализуют так называемый со-бытийно-управляемый механизм. Это означает, что есть некото­рый внутренний цикл, который запускается после соответству­ющей инициализации и обрабатывает одно за другим все собы­тия, объявленные во время инициализации. К событиям отно­сятся: щелчок мыши, закрытие окна, изменение свойств окна, передвижение курсора, нажатие клавиши и «пустое» (idle) собы­тие, когда ничего не происходит. Для проведения периодической проверки совершения того или иного события надо зарегистри­ровать функцию, которая будет его обрабатывать. Для этого ис­пользуются функции вида:

    void glutDisplayFunc (void (*func) (void)) void glutReshapeFunc (void (*func) (int width,

    int height)) void glutMouseFunc (void (*func) (int button,

    int state , int x, int y)) void glutldleFunc (void (*func) (void)) void glutMotioiiFimc (void (* func) (int x, int y)); void glutPassiveMotionFunc (

    void (*func)(int x, int y));

    Параметром для них является имя соответствующей функ­ции заданного типа. С помощью glutDisplayFimc() задается функ­ция рисования для окна приложения, которая вызывается при необходимости создания или восстановления изображения. Для

    136 Глава 10. OPENGL-приложения с помощью GLUT

    явного указания, что окно надо обновить, иногда удобно исполь­зовать функцию

    void glutPostRedisplay (void)

    Через glutReshapeFuncQ устанавливается функция обработки изменения размеров окна пользователем, которой передаются новые размеры.

    glutMouseFimcQ определяет функцию-обработчик команд от мыши, a glutldleFuncQ задаст функцию, которая будет вызывать­ся каждый раз, когда нет событий от пользователя.

    Функция, определяемая glutMotionFuncQ, вызывается, когда пользователь двигает указатель мыши, удерживая кнопку мы­ши. glutPassiveMotionFiinc регистрирует функцию, вызываемую, если пользователь двигает указатель мыши и не нажато ни од­ной кпопки мыши.

    Контроль всех событий происходит внутри бесконечного цик­ла в функции

    void glutMainLoop (void)

    которая обычно вызывается в конце любой программы, исполь­зующей GLUT. Структура приложения, использующего анима­цию, будет следующей:

    #include

    void Myldle(void)

    {

    /* Код, который меняет переменные, определяющие следующий кадр */

    "};

    void MyDisplay (void)

    { /* Код OpenGL, который отображает кадр */

    10.2. GLUT в среде MICROSOFT VISUAL C++ 6.0 137

    /* После рисования переставляем буферы */ glutSwapBuffers ();

    };

    void main(int argcp , char **argv)

    { /* Инициализация GLUT */ glutlnit (feargcp, argv); glutInitWindowSize(640, 480); glutlnitWindowPosition (0 , 0); /* Открытие окна */

    glutCreateWindow ( "My„OpenGLw Application " ) ; /* Выбор режима: двойной буфер и RGBA цвета */ glutlnitDisplayMode (GLUT_RGBA |

    GLUT_DOUBLE | GLIJT_DEFTH); /* Регистрация вызываемых функций */ glutDisplayFunc (MyDisplay ) ; glutldleFunc(Myldle) ;

    /* Запуск механизма обработки событий */ glutMainLoop () ;

    1   ...   14   15   16   17   18   19   20   21   ...   30


    написать администратору сайта