Простые трехмерные построения: куб (двойная буферизация)

Текст программы построен на основе предыдущей программы. Новые используемые команды - BeginPaint, EndPaint, SwapBuffers. В процедуре SetDCPixelFormat явно (а не по умолчанию) определен флаг pfd.dwFlags (см. справку). Так же впервые используем процедуру FormResize (это событие возникает при изменении размеров, положения и т.п. формы, в том числе и при создании). При создании формы (запуск программы) это процедура-событие FormResize возникает раньше FormPaint и поэтому в ней устанавливаются видовые параметры (и как наверное поняли - один раз). Снова FormResize будет выполнено только при изменении Form (см. выше). Маленькое отступление - ВЫ наверное замечали, что все предыдущие учебные программы при изменении положения скроллера и обновлении экрана Book3D редактора в "Главное окно" как-то странно перерисовывалось - возникали исчезающие полосы, мигания, помехи и т.п. - что это? - это одинарная буферизация. Двойная буферизация работает так: изображение рисуется в буфере, который не виден (ну т.е. за кадром :) и только после того как все нарисовано, изображение выводится на устройство, на котором рисуем - буферы меняются местами - невидимое становится видимым, а видимое очищается от старого изображения и становится невидимым, и готово к рисованию. Одинарный буфер - как ВЫ уже наверное догадались рисует сразу на "экран" хотя изображение бывает полностью неготово.
Как вы уже наверное заметили - куб цветной, хотя в предыдущей программе и задается цвет командой glColor - результат - унылый серый куб, все дело в одной команде - glEnable(GL_COLOR_MATERIAL), которая добавлена в процедуру OnCreate и разрешает учет цвета примитива при освещении.


При запуске программы последовательно происходит 4 действия:

1. Cоздание формы - OnCreate, в обработчике этого события находятся строки отвечающие за настройку интерфейса: настройка скроллеров (значение от -180 до 180, один прижат вниз, другой к левому краю формы) и сама форма размером 400 на 400 пикселей (Form1.Width := 400 и Form1.Height := 400) на которой вольготно расположилась Panel (на поверхности которой и будет все рисоваться) занимая всю форму (Panel1.Align := alClient), далее в переменную DC получаем ссылку на устройство на котором будем рисовать - рисуем на поверхности компонента Panel1, уже знакомая процедура SetDCPixelFormat(DC) возвращает формат пикселя устройства Panel1, но необходимо заметить, что установлением флага pfd.dwFlags указываем OpenGL, что рисуем на поверхности компонента используя двойную буферизацию - проще это объяснить так: просим, что хотим - получаем что есть (но по максимуму). И тем что есть пользуемся - wglCreateContext(DC) - соглашаемся этим что-то пользоваться и пользуемся - wglMakeCurrent(DC,hrc). Далее включаем свет - и опять простое объяснение: даем понять программе, что будем использовать свет - glEnable ( GL_LIGHTING ), только один источник - glEnable ( GL_LIGHT0 ) и включаем свет - glEnable ( GL_DEPTH_TEST ). Команда glEnable( GL_COLOR_MATERIAL) разрешает учет цвета примитива при освещении.
2. Событие FormResize устанавливает видовые параметры - glMatrixMode, далее знакомые команды и новая команда - InvalidateRect (см.справку по командам). Пока не стоит сильно думать, что это здесь делается - оставте на потом!
3.Событие-перерисовка OnPaint отличается от предыдущих программ наличием BeginPaint...EndPaint - здесь все просто: при выполнении BeginPaint(Panel1.Handle,ps) - выводится изображение на поверхность компонента Panel1 - но в невидимый буфер, как только все нарисовано - выводим невидимый буфер на экран - SwapBuffers(DC) и разрешаем окно перерисовать (обновить) - EndPaint.
4. При корректном завершении работы программы OnDestroy происходит возврат на круги своя - все, что получили возвращается в исходное состояние - все ссылки и контекст удаляются. Прочитав справочную информацию и так все поимете (щелкая мышью по гиперссылкам-командам OpenGL с интересующими Вас командами).
к оглавлению к оглавлению


Для переноса кода программы в Delphi необходимо выполнить следующие действия:

1. Сохранить текст программы под любым именем в формате TXT - Программа / Сохранить код программы - в выпадающем списке диалога "Тип файла" выбрать "Текстовый файл (*.txt)".
2. Открыть свои новый текстовый файл в любом редакторе и скопировать весь текст в буфер обмена.
3. Запустить Delphi и начать новый проект - все элементы имеют свои названия по умолчанию, поэтому Вам не следует изменять их - это важно.
4. Перейти на вкладку проекта Events и выполнить двойной щелчок в полях OnCreate, OnDestroy, OnPaint и OnResize. Так же необходимо добавить 2 скроллера в любое место формы - панель инструментов Standart\ScrollBar и дважды щелкнуть по каждому скроллеру. И не забудьте добавить компонент Panel - рисуется все на его поверхности.
5. Перейти к тексту программы Unit1, стереть его весь и на его место вставить текст из буфера обмена, можно воспользоваться комбинацией клавиш Ctrl+V.
6. Запустить Ваш новый проект - F9.
Если все сделали правильно - Вы получите тот же результат, что и в Book3D редакторе.

к оглавлению к оглавлению