Мегаобучалка Главная | О нас | Обратная связь


Текст основных подпрограмм



2019-12-29 136 Обсуждений (0)
Текст основных подпрограмм 0.00 из 5.00 0 оценок




 

Процедура ‘Detal’ - собственна само изображение объекта на экране.

Для повышения быстродействия, написаны отдельные части кода для работы с треугольниками, четырехугольниками, и гранями, имеющими количество углом больше четырех. В зависимости от режима работы, текстура либо налагается, либо нет.

 

procedure TForm1.Detal;

var a:integer;

begin

a:=0;

if texturing=true then glEnable (GL_TEXTURE_2D);

while pols[a]<>0 do begin

if pols[a]=3 then begin inc (a);

glBegin (GL_TRIANGLES) ;

if texturing=true then glTexCoord2d (d*texture_ycoords[a],d*texture_xcoords[a]);

glVertex3f(fx[pols[a]], fy[pols[a]], fz[pols[a]]); inc (a);

if texturing=true then glTexCoord2d (d*texture_ycoords[a],d*texture_xcoords[a]);

glVertex3f(fx[pols[a]], fy[pols[a]], fz[pols[a]]); inc (a);

if texturing=true then glTexCoord2d (d*texture_ycoords[a],d*texture_xcoords[a]);

glVertex3f(fx[pols[a]], fy[pols[a]], fz[pols[a]]); inc (a);

glEnd; end;

if pols[a]=4 then begin inc (a);

glBegin (GL_Quads) ;

if texturing=true then glTexCoord2d (d*texture_ycoords[a],d*texture_xcoords[a]);

glVertex3f(fx[pols[a]], fy[pols[a]], fz[pols[a]]); inc (a);

if texturing=true then glTexCoord2d (d*texture_ycoords[a],d*texture_xcoords[a]);

glVertex3f(fx[pols[a]], fy[pols[a]], fz[pols[a]]); inc (a);

if texturing=true then glTexCoord2d (d*texture_ycoords[a],d*texture_xcoords[a]);

glVertex3f(fx[pols[a]], fy[pols[a]], fz[pols[a]]); inc (a);

if texturing=true then glTexCoord2d (d*texture_ycoords[a],d*texture_xcoords[a]);

glVertex3f(fx[pols[a]], fy[pols[a]], fz[pols[a]]); inc (a);

glEnd; end;

if pols[a]>4 then begin inc (a);

glBegin (GL_Polygon) ;

if texturing=true then glTexCoord2d (d*texture_ycoords[a],d*texture_xcoords[a]);

glVertex3f(fx[pols[a]], fy[pols[a]], fz[pols[a]]); inc (a);

if texturing=true then glTexCoord2d (d*texture_ycoords[a],d*texture_xcoords[a]);

glVertex3f(fx[pols[a]], fy[pols[a]], fz[pols[a]]); inc (a);

if texturing=true then glTexCoord2d (d*texture_ycoords[a],d*texture_xcoords[a]);

glVertex3f(fx[pols[a]], fy[pols[a]], fz[pols[a]]); inc (a);

if texturing=true then glTexCoord2d (d*texture_ycoords[a],d*texture_xcoords[a]);

glVertex3f(fx[pols[a]], fy[pols[a]], fz[pols[a]]); inc (a);

if texturing=true then glTexCoord2d (d*texture_ycoords[a],d*texture_xcoords[a]);

glVertex3f(fx[pols[a]], fy[pols[a]], fz[pols[a]]); inc (a);

if pols[a]=$ff then continue;

if texturing=true then glTexCoord2d (d*texture_ycoords[a],d*texture_xcoords[a]);

glVertex3f(fx[pols[a]], fy[pols[a]], fz[pols[a]]); inc (a);

glEnd;

end; end;

if texturing=true then glDisable (GL_TEXTURE_2D);

end;

 

    Выполняется подготовка к выводу очередного кадра: очищается Z буфер, выполняются необходимые преобразования координат. Затем обрисовывается объект и изображение переносится из виртуального экрана на экран.

 

procedure TForm1.FormPaint(Sender: TObject);

begin

 glClear (GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);     

 glPushMatrix;

 glTranslatef (0, 0.0, tx);

 glRotatef (rx, 1.0, 0.0, 0.0);

 glRotatef (ry, 0.0, 1.0, 0.0);

 Detal;

 glPopMatrix;

 SwapBuffers(DC);

end;

    Установка формата пикселей и связь его с текущим контекстом воспроизведения, выполняется один раз при запуске приложения.

 

procedure SetDCPixelFormat (hdc : HDC);

var

pfd : TPixelFormatDescriptor;

nPixelFormat : Integer;

begin

FillChar (pfd, SizeOf (pfd), 0);

pfd.dwFlags := PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER;

nPixelFormat := ChoosePixelFormat (hdc, @pfd);

SetPixelFormat (hdc, nPixelFormat, @pfd);

end;

 

           Создание формы. Инициализация рабочих массивов, создание контекста воспроизведения и связь его с окном формы. Определение атрибутов формы, включение Z буфера.

 

procedure TForm1.FormCreate(Sender: TObject);

var x:integer;

begin

for x:=0 to 22 do pols[x]:=pols_start[x];

for x:=0 to dots do fx[x]:=fx_start[x];

for x:=0 to dots do fy[x]:=fy_start[x];

for x:=0 to dots do fz[x]:=fz_start[x];

for x:=0 to poligons do pols_pointer[x]:=pols_pointer_start[x];

for x:=0 to 22 do texture_xcoords[x]:=texture_xcoords_start[x];

for x:=0 to 22 do texture_ycoords[x]:=texture_ycoords_start[x];

Bitmap := TBitmap.Create;

DC := GetDC (Handle);

SetDCPixelFormat(DC);

hrc := wglCreateContext(DC);

wglMakeCurrent(DC, hrc);

glClearColor (0.5, 0.5, 0.75, 1.0);

glColor3f (0.0, 0.0, 0.0

glLineWidth (1);

Form1.Color:=$c08080;           

glEnable (GL_DEPTH_TEST);

statusbar1.Panels.Items[0].Text:='Имя объекта: '+object_name;

statusbar1.Panels.Items[1].Text:='Точек: '+inttostr(dots);

statusbar1.Panels.Items[2].Text:=Полигонов: '+inttostr(poligons);

end;

                                                                                                                                                                                        

           Освобождение памяти занимаемой программой, выполняется при закрытии приложения.

 

procedure TForm1.FormDestroy(Sender: TObject);

begin

 wglMakeCurrent(0, 0);

 wglDeleteContext(hrc);

 ReleaseDC (Handle, DC);

 DeleteDC (DC);

 Bitmap.Free;

end;

 

                          Изменение размеров формы.    Т.к. размер формы в ходе работы приложения изменить невозможно, то процедура выполняется лишь раз, при запуске программы. Выполняются действия, необходимые для корректной работы OpenGL.

 

procedure TForm1.FormResize(Sender: TObject);

begin

glViewport(0, 0, ClientWidth, ClientHeight);

glMatrixMode (GL_PROJECTION);

glLoadIdentity;

glFrustum (-1, 1, -1, 1, 2, 29);

glMatrixMode (GL_MODELVIEW);

glLoadIdentity;

glTranslatef(0.0, 0.0, -6.0);  

glPolygonMode (GL_FRONT_AND_BACK, GL_LINE) ;

end;

   

           Процедура загрузки текстуры в предназначенный для нее массив. После загрузки задаются необходимые параметры текстурирования, инициализируется форма №2.

 

procedure TForm1.Texture1Click(Sender: TObject); 

var x,y:integer;

begin

opendialog1.Filter:='Texture file (Bitmap 256*256)|*.bmp';

if opendialog1.Execute then begin

Form2.Image1.Picture.LoadFromFile(opendialog1.FileName);

Bitmap.LoadFromFile(opendialog1.FileName);

for y:=0 to $ff do begin

for x:=0 to $ff do begin

texture[x,y,0]:=GetRValue(Bitmap.Canvas.Pixels [x,y]);

texture[x,y,1]:=GetGValue(Bitmap.Canvas.Pixels[x,y]);;

texture[x,y,2]:=GetBValue(Bitmap.Canvas.Pixels[x,y]);

end; end;

glPixelStorei(GL_UNPACK_ALIGNMENT,1);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

glTexImage2d(GL_TEXTURE_2D, 0, 3, 256, 256, 0, GL_RGB, GL_UNSIGNED_BYTE, @texture);

glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);

Form2_prepearing;

Form2.show;

Form2.paintpoligon;

end; end;

 

Заключение

 

           Конечно же, данная работа не претендует на пример использования библиотеки OpenGL с полной отдачей. Даже затронутая тема облегания тела поверхностью раскрыта не полностью. Однако, это скорее говорит не о слабом использовании предоставляемых OpenGL возможностей, а об их почти неограниченном количестве. С внедрением этой библиотеки, программисты при работе с графикой освободились от написания огромного количества одинаковых процедур и от требования обязательных навыков программирования на языках низкого уровня. Кроме того, появилась возможность создать полноценное качественное приложение почти без знаний математических принципов трехмерной графики и формул цветовых смешений.

 

Список литературы

 

1. OpenGL. Графика в проектах Delphi. М. Краснов.

2. OpenGL. Игорь Тарасов.

3. Материалы с сайта ‘opengl.org.ru’.

4. Компьютерная графика. Полигональные модели Шикин А. В., Боресков Л. В.  

5. 3D programming FAQ. Андрей Аксёнов.



2019-12-29 136 Обсуждений (0)
Текст основных подпрограмм 0.00 из 5.00 0 оценок









Обсуждение в статье: Текст основных подпрограмм

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:
Как построить свою речь (словесное оформление): При подготовке публичного выступления перед оратором возникает вопрос, как лучше словесно оформить свою...
Как выбрать специалиста по управлению гостиницей: Понятно, что управление гостиницей невозможно без специальных знаний. Соответственно, важна квалификация...



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (136)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.007 сек.)