Основы программирования OpenGL в Borland С++Builder и Delphi. (2 стр)
Автор: Сергей Луковкин
Пример
Давайте нарисуем сферу, а потом заставим её крутиться. Итак, всё, что нам понадобится - это форма и таймер.
Установите интервал таймера на 10 миллисекунд (нам этого будет вполне достаточно). Теперь скопируйте все представленные выше фрагменты кода в соответствующие места. В процедуре Timer1Timer напишите одну сточку: Draw(); (в Delphi без скобок).
Теперь нам осталось только что-нибудь нарисовать, т.е. отредактировать функцию Draw.
void TForm1::Draw() { glClear( GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT); GLUquadricObj *quadObj; quadObj = gluNewQuadric( ); gluQuadricDrawStyle( quadObj, GLU_FILL); glColor3f( 1,0,0); gluSphere( quadObj, 2,10,10); glRotatef( 3, 0,1,0); gluDeleteQuadric( quadObj); SwapBuffers( ghDC); }
procedure TForm1.Draw; var quadObj :GLUquadricObj; begin glClear(GL_DEPTH_BUFFER_BIT or GL_COLOR_BUFFER_BIT); quadObj:=gluNewQuadric; gluQuadricDrawStyle( quadObj, GLU_FILL); glColor3f( 1,0,0); gluSphere( quadObj, 2,10,10); glRotatef( 3, 0,1,0); gluDeleteQuadric( quadObj); SwapBuffers( ghDC); end;
Всё, можно нажимать F9!!!
А теперь кое-что поясню (в процедуре Draw не встретилось ни одной знакомой строчки :( ).
glClear() сбрасывает значения всего перечисленного в качестве параметров (в нашем случае очищает буфер цвета и буфер глубины). Этой процедуре передавать много всяких буферов для очистки, но лично я использую только 3: GL_DEPTH_BUFFER_BIT, GL_COLOR_BUFFER_BIT, иногда GL_STENCIL_BUFFER_BIT (буфер трафарета).
glColor() устанавливает цвет фигуры. Существует следующий синтаксис как для glColor, так и для других функций OpenGL:
gl<name>[n][type]
Поясняю, каждая функция OpenGL начинается с префикса "gl". Далее следует название функции. После названия - количество параметров (если функция определена для разного количества параметров). И, наконец, переменными какого типа являются параметры:
- b - GLbyte байт
- s - GLshort короткое целое
- i - GLint целое
- f - GLfloat дробное
- d - GLdouble дробное с двойной точностью
- ub - GLubyte беззнаковый байт
- us - GLushort беззнаковое короткое целое
- ui - GLuint беззнаковое целое
- v - вектор - массив из n элементов указанного типа
Итак, glColor3f() означает, что цвет задаётся тремя компонентами типа GLfloat.
Для рисования сферы мы используем механизм из glu32.dll. Создаём объект типа GLUquadricObj() и инициализируем его функцией gluNewQuadric(). Далее устанавливаем стиль фигуры функцией gluQuadricDrawStyle(quadObj, GLU_FILL). Стиль может быть GLU_FILL, GLU_LINE или GLU_POINT. Что каждый из них значит, проверьте сами.
gluSphere() - делает из quadObj сферу. Три последних параметра - это радиус и количество разбиений поперёк и вдоль оси Z соответственно. Я взял маленькое число разбиений, чтобы было видно, что сфера крутится.
И не забудем освободить память, занимаемую под quadObj - gluDeleteQuadric(quadObj).
glRotatef() - заставляет нашу сферу крутиться. О том как - в следующей статье.
И, наконец, SwapBuffers(ghDC) выводит всё на экран.
Пока всё.
Исходники к статье: 20030501.zip
Советую почитать:
1. Тихомиров Ю. "Программирование трёхмерной графики".
Пишет мудрёно, но очень много полезной информации. Кстати, у него вышла вторая книга, может она ещё толковее и понятней?
2. wat. OpenGL: Основы.
Просто, доступно, но для другой ИСР.
2 мая 2003 (Обновление: 20 мая 2011)