Страница 17 |
Введение в OpenGl. Учебник |
|||
Главная Страница 1 Страница 2 Страница 3 Страница 4 Страница 5 Страница 6 Страница 7 Страница 8 Страница 9 Страница 10 Страница 11 Страница 12 Страница 13 Страница 14 Страница 15 Страница 16 Страница 17 Страница 18 Страница 19 Страница 20 Страница 21 Скачать учебник |
||||
---|---|---|---|---|
() и WinMain(). В первом случае параметры передаются в функцию в виде массива строк, тогда как во втором – в виде одной единственной строки, причем в этом случае количество параметров неизвестно. В свою очередь glutInit() ожидает параметры в формате main() с указанием их числа. Существует несколько вариантов решения этой проблемы. Если параметры вам нужны, следует создать (или позаимствовать) функцию разборки единой командной строки на составляющие с выяснением их количества (это довольно просто). Если же у вас нет нужды в параметрах командной строки можно передать в glutInit() подделку следующего вида:
Конечно, существуют и другие варианты. 1.10 АнимацияОдна из самых впечатляющих вещей, которую вы можете делать на компьютере – это рисование движущихся картинок. Являетесь ли вы инженером, пытающимся увидеть разрабатываемую деталь со всех сторон, пилотом, обучающимся летать на самолете с помощью симулятора или профессионалом в области создания компьютерных игр, вам должно быть абсолютно ясно, что анимация – это важная часть компьютерной графики. В кинотеатре движение достигается за счет проектирования серии картинок на экран со скоростью 24 кадра в секунду. Каждый кадр выдвигается на позицию перед лампой, открывается шторка и кадр показывается на экране. Шторка моментально закрывается, пленка передвигается к следующему кадру, он отображается на экране и так далее. Таким образом, когда вы просматриваете 24 кадра за одну секунду, ваш мозг объединяет их в непрерывную плавную анимацию. (Разрывы между кадрами были хорошо заметны в старых фильмах Чарли Чаплина, так как в то время фильмы снимались и показывались со скоростью 16 кадров в секунду.) Современные мониторы в среднем перерисовывают изображение от 60 до 76 раз в секунду (хотя скорость может достигать и 120 раз в секунду). Очевидно, что 60 кадров в секунду выглядят более гладко, чем 30, а 120 намного лучше, чем 60. Однако, частота обновления выше 120 кадров в секунду может находиться за гранью человеческого восприятия (это зависит, в основном, от индивидуальных особенностей). Ключевая причина, по которой кинопроектор способен создать эффект движения заключается в том, что каждый кадр уже готов на момент его показа. Предположим, что вы пытаетесь воспроизвести анимацию, состоящую из миллиона кадров, с помощью программы вроде следующей:
Если вы сложите время, которое требуется вашей программе, чтобы нарисовать кадр на экране и время, необходимое для очистки экрана, то выяснится, что программа выдает все более и более неприятные результаты по мере того, как это суммарное время приближается к 1/24 части секунды. Предположим, что рисование занимает практически всю 1/24 часть секунды. Тогда элементы изображения рисуемые первыми будут видны на экране практически постоянно, а те, что рисуются в конце, будут похожи на приведение, так как сразу после их отображения программа начнет стирать все изображение с экрана и, таким образом, большую часть времени наблюдатель будет видеть на месте этих элементов пустой фон. Проблема в том, что приведенная программа не воспроизводит готовые кадры, а рисует каждый из них и наблюдатель это видит. Большинство реализаций OpenGL предоставляет двойную буферизацию – аппаратный или программный механизм, который обеспечивает наличие двух полноценных цветовых буферов. Один отображается на экране, пока второй отрисовывается. Когда рисование кадра окончено, два буфера переключаются: тот, что только что был на экране, теперь используется для рисования и наоборот. Этот процесс похож на отображение проектором в кинотеатре пленки всего с двумя кадрами: пока один проецируется на экран, художник стирает и перерисовывает другой – невидимый. До тех пор, пока художник достаточно быстр, наблюдатель не заметит разницы между подобной техникой и той, где все кадры уже готовы и просто показываются друг за другом. С двойной буферизацией каждый кадр показывается только после того, как он полностью готов. Наблюдатель никогда не увидит частично нарисованное изображение. Модифицированная для использования двойной буферизации версия предыдущей программы может выглядеть следующим образом:
1.11 Частота обновления экранаВ некоторых реализациях OpenGL, функция Переключить_буферы() помимо простого переключения буферов, ждет, пока закончится текущий период обновления экрана, чтобы предыдущий кадр был полностью отображен и следующий был нарисован с самого начала. Предположим, что ваша система обновляет экран 60 раз в секунду. Это означает, что наивысшая скорость смены кадров, которую вы можете достичь – 60 кадров в секунду (frames per second -- fps) и если все ваши кадры будут очищаться и перерисовываться менее чем за 1/60 долю секунды, ваша анимация будет на этой скорости гладкой. Часто случается, что кадр слишком сложен, чтобы нарисовать его за 1/60 секунды, таким образом, каждый кадр показывается на экране более чем один раз. Если, например, рисование кадра занимает 1/45 секунды, вы получаете скорость 30 fps и ничем не занятое время в размере 1/30-1/45=1/90 секунды, то есть треть времени рисования кадра на каждый кадр. Кроме того, частота обновления монитора постоянна, что может вызвать неожиданные последствия для быстродействия. Например, при частоте обновления монитора 60 раз в секунду, анимация может идти со скоростями 60 fps, 30, fps, 20 fps, 15 fps, 12 fps и так далее. Это означает, что если пишете приложение и постепенно добавляете детали, сначала каждая деталь, которую вы добавляете, не оказывает воздействия на общее быстродействие – анимация по-прежнему идет со скоростью 60 fps. Затем вы добавляете еще одну деталь, и, система уже не может рисовать кадр за 1/60 долю секунды, вследствие чего, неожиданно, быстродействие падает до 30 fps |
||||