Описание программы.
Лабораторная работа №1
Задание: Используя примитивы «точка», «линия», «треугольник», «четырехугольник» и «многоугольник» изобразить фигуру, указанную в варианте.
Описание программы.
Выполнив следующие шаги, вы создадите простейшее приложение, использующее OpenGL.
1. Создайте новый проект в Delphi.
2. В секцию Uses добавьте модуль OpenGL.
3. Опишите процедуру для установки формата пикселей:
//Процедура заполнения полей структуры PIXELFORMATDESCRIPTOR
procedure SetDCPixelFormat (hdc: HDC);
var
pfd: TPIXELFORMATDESCRIPTOR; // данные формата пикселей
nPixelFormat: Integer;
Begin
With pfd do begin
nSize:= sizeof (TPIXELFORMATDESCRIPTOR); // размер структуры
nVersion:= 1; // номер версии
dwFlags:= PFD_DRAW_TO_WINDOW OR PFD_SUPPORT_OPENGL OR PFD_DOUBLEBUFFER;
// множество битовых флагов, определяющих устройство и интерфейс
iPixelType:= PFD_TYPE_RGBA; // режим для изображения цветов
cColorBits:= 16; // число битовых плоскостей в каждом буфере цвета
cDepthBits:= 32; // размер буфера глубины (ось z)
iLayerType:= PFD_MAIN_PLANE;// тип плоскости
end;
nPixelFormat:= ChoosePixelFormat (hdc, @pfd); // запрос системе - поддерживается ли выбранный формат пикселей
SetPixelFormat (hdc, nPixelFormat, @pfd); // устанавливаем формат пикселей в контексте устройства
End;
Более подробно о структуре PIXELFORMATDESCRIPTOR и предназначении её полей можно узнать из справочной литературы или файла помощи Delphi.
4. В секции Private описания класса формы объявите свойство hrc: HGLRC;
В нем будет храниться указатель на контекст воспроизведения OpenGL.
5. Добавить обработчики для следующих событий:
Создание формы – OnCreate
Уничтожение формы – OnDestroy
Перерисовка формы – OnPaint
Изменение размеров формы – OnResize
Для добавления обработчика достаточно в окне Object Inspector среды Delphi переключиться на закладку Events и дважды кликнуть мышью на названии соответствующего события. В результате Delphi автоматически создатс нужный код и переместит указатель на тело процедуры, отвечающей за обработку выбранного события.
6. Заполнить обработчики следующим образом:
OnCreate – Поместить код для установки формата пикселей, создания и установки контекста воспроизведения OpenGL. Для установки формата пикселей воспользуемся описанной ранее процедурой SetDCPixelFormat, вызвав её с параметром Canvas.Handle. Создание контекста воспроизведения и сохранение указателя на него в hrc производится с помощью функции wglCreateContext, а установка созданного контекста – процедурой wglMakeCurrent. Таким образом в получим следующий код:
procedure TForm1.FormCreate(Sender: TObject);
begin
SetDCPixelFormat(Canvas.Handle);// устанавливаем формат пикселей
hrc:= wglCreateContext(Canvas.Handle);//создаём контекст воспроизведения
wglMakeCurrent(Canvas.Handle, hrc);//устанавливаем контекст воспроизведения
end;
OnDestroy – Здесь должен быть расположен код, освобождающий контекст воспроизведения OpenGL и удаляющий его.
procedure TForm1.FormDestroy(Sender: TObject);
begin
wglMakeCurrent(0, 0); // освобождаем контекст воспроизведения
wglDeleteContext (hrc); // удаление контекста OpenGL
end;
OnPaint – в этом обработчике фактически происходит создание и показ изображения. Шаблон, который следует использовать для этого обработчика, выглядит так:
BeginPaint(Self.Handle,ps);
{ЗДЕСЬ РАСПОЛАГАЮТСЯ КОМАНДЫ РИСОВАНИЯ OpenGL}
SwapBuffers(Canvas.Handle);
EndPaint(Self.Handle,ps);
Команды рисования, используемые для нанесения на поверхность формы изображения, будут рассмотрены далее.
OnResize – вызывается каждый раз, когда изменяется размер формы. Здесь должны быть предусмотрены действия для изменения параметров отображения. Код, который следует поместить в данный обработчик, с необходимыми комментариями:
glMatrixMode(GL_PROJECTION);//Текущей матрицей устанавливается матрица проекций
glLoadIdentity;//Замена текущей матрицы единичной
gluPerspective(30.0, Width/Height, 1.0, 15.0);//Определение усеченного конуса
//видимости в видовой системе координат. Первые 2 параметры задают углы
//видимости относительно осей х и у, а последние 2 параметра – ближнюю и дальнюю
//границы видимости
glViewport(0, 0, Width, Height);//Определение области видимости
glMatrixMode(GL_MODELVIEW);//Текущей матрицей устанавливается видовая матрица
InvalidateRect(Handle, nil, False);//Принудительная перерисовка формы
7. Скомпилировав и выполнив созданную программу получим форму, клиентская область которой закрашена черным цветом. Рассмотрим, каким образом можно "оживить" это изображение. Все приведённые ниже команды должны быть помещены внутри блока
BeginPaint(Self.Handle,ps);
{Здесь должны находиться команды рисования OpenGL}
SwapBuffers(Canvas.Handle);
EndPaint(Self.Handle,ps);
процедуры OnPaint.
Для установки цвета фона следует воспользоваться командами
glClearColor(1.0, 1.0, 1.0, 1.0); // определение цвета фона
glClear(GL_COLOR_BUFFER_BIT);// установка цвета фона
Параметрами команды glClearColor являются красная, зелёная и синяя составляющие цвета и параметр «альфа», отвечающий за прозрачность. Значения всех параметров должны находиться в диапазоне от 0.0 до 1.0.
Перед выполнением следующих команд рисования необходимо загрузить единичную матрицу командой glLoadIdentity и сместить текущий центр коордынат на 10 единиц по оси z командой glTranslatef вызвав её с параметрами(0.0, 0.0, -10.0)
Чтобы определить какого цвета будет создаваемая фигура (примитив), следует вызвать процедуру glColor, параметры которой аналогичны параметрам процедуры glClearColor, описанной выше.
Для создания изображения примитива используются следующие команды:
glBegin(mode);
glVertex2d(1, 1);
//указание вершин создаваемой фигуры
//...
glVertex2d(-1, 1);
glEnd;
Параметр mode определяет примитивы, которые будут созданы из вершин, расположенных между командами glBegin(mode) и glEnd;
Вот перечень значений, которые может принимать параметр mode:
GL_POINTS – каждая вершина рассматривается как отдельная точка, параметры которой не зависят от параметров остальных точек.
GL_LINES – Каждая пара вершин рассматривается как независимый отрезок.
GL_LINE_STRIP – вершины определяют ломаную линию с началом в первой вершине и концом в последней.
GL_LINE_LOOP – вершины определяют замкнутую ломаную линию. Отличие от предыдущей в том, что первая и последняя вершины соединены.
GL_TRIANGLES – Каждая тройка вершин рассматривается как независимый треугольник.
GL_TRIANGLE_STRIP – Рисуется группа связанных треугольников, имеющих общую грань.
GL_TRIANGLE_FAN - Рисуется группа связанных треугольников, имеющих общую грань. Первая точка является вершиной каждого треугольника.
GL_QUADS – Каждая группа из 4 вершин рассматривается как независимый четырехугольник.
GL_QUAD_STRIP – Рисуется группа связанных четырехугольников.
GL_POLYGON – рисуется отдельный выпуклый многоугольник.
Если указано количество вершин, недостаточное для создания заданного примитива, то он не рисуется.
Для управления размерами точек и толщиной линий используются процедуры glLineWidth() и glPointSize();
Для создания вершины используется команда glVertex[2,3,4][s,i,f,d], где цифра [2,3,4] обозначает количество параметров, а буква [s,i,f,d] – тип этих параметров.
2 параметра – по умолчанию z = 0, alpha = 1.
3 параметра – по умолчанию alpha = 1.
4 параметра – заданы все координаты
s - GLshort
i - GLint
f - GLfloat
d – GLdouble
С другими командами используются также префиксы b, ub, us, ui. С их значениями вы можете ознакоимиться в справочной системе Delphi.
Пример использования некоторых команд приведён ниже.
glColor(0.0,0.0,0.0,1.0);//устанавливаем цвет рисования – черный
glPointSize(10);//устанавливаем размер точки
glLineWidth(5.0);//устанавливаем ширину линии
glBegin(GL_POINTS);//Изображаем точку
glVertex2d(0.0, 0.0);
glEnd;
glBegin(GL_LINES);//Изображаем линию
glVertex2d(1.0, 1.0);
glVertex2d(2.0, -2.0);
glEnd;
glBegin(GL_TRIANGLES); //Изображаем треугольник
glVertex2d(-1.0, 1.0);
glVertex2d(-1.0, 2.0);
glVertex2d(-2.0, 1.5);
glEnd;
glBegin(GL_QUADS); //Изображаем четырехугольник
glVertex2d(-1.0, -1.0);
glVertex2d(-2.0, -2.0);
glVertex2d(-3.0, -1.0);
glVertex2d(-2.0, 0.0);
glEnd;
Варианты заданий:
1.
|
| 9.
|
| 2.
|
| 10.
|
| 3.
|
| 11.
|
| 4.
|
| 12.
|
| 5.
|
| 13.
|
| 6.
|
| 14.
|
| 7.
|
| 15.
|
| 8.
|
|
|
Дата добавления: 2015-09-27 | Просмотры: 213 | Нарушение авторских прав
|