| Описание программы.Лабораторная работа №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 | Просмотры: 280 | Нарушение авторских прав 
 
 
 
 
 |