
Новичок
Профиль
Группа: Участник
Сообщений: 3
Регистрация: 22.12.2009
Репутация: нет Всего: нет
|
Задачей было: Создать программу, представляющую собой куб(условно) с различными текстурами на каждой грани. Размер текстур нужен больше 1000*1000. Также должна быть возможность "осмотреть" куб. Камера должна находится внутри. Код | unit Unit2;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Textures, OpenGL, ExtCtrls;
type TForm2 = class(TForm) Panel1: TPanel; Panel2: TPanel; Panel3: TPanel; procedure FormCreate(Sender: TObject); procedure FormCloseQuery(Sender: TObject; var CanClose: Boolean); procedure DrawScene; procedure InitializeRC; procedure SetDCPixelFormat; procedure FormDestroy(Sender: TObject); procedure FormResize(Sender: TObject); procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); private { Private declarations } RotZ,RotX,RotY,TransZ, //Координаты eyex, eyey, eyez,centerx, centery, // место в пространстве centerz, upx, upy, upz, // камера TransX,TransY:GLDouble; ReturnM:boolean;//признаки прорисовки. protected procedure WMPaint(var Msg: TWMPaint); message WM_PAINT; public { Public declarations } end;
var Form2: TForm2; DC:HDC; HRC:HGLRC; arx,ary,arz:real; Up,Front,Back,Bottom,Right,Leva: glUInt;
implementation
uses Cub;
const // ???????? ?????? MaterialColor: Array [0..6] of Glfloat = (1.0, 1.0, 1.0, 1.6, 1.0, 1.0, 1.0);
{$R *.dfm}
procedure Tform2.InitializeRC;// Иниц. света begin glEnable(GL_DEPTH_TEST); glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); end;
procedure Tform2.SetDCPixelFormat; //формат пикселей var nPixelFormat: Integer; pfd: TPixelFormatDescriptor; begin FillChar(pfd, SizeOf(pfd), 0); with pfd do begin dwFlags := PFD_DOUBLEBUFFER; cColorBits:= 32; cDepthBits:= 32; end; nPixelFormat := ChoosePixelFormat(DC, @pfd); SetPixelFormat(DC, nPixelFormat, @pfd); end;
procedure Tform2.WMPaint(var Msg: TWMPaint); // процедура перерисовки сцены var ps : TPaintStruct; begin BeginPaint(Handle, ps); DrawScene; EndPaint(Handle, ps); end;
procedure TForm2.FormCreate(Sender: TObject); begin // начальный поворот RotZ:=0; RotY:=45; RotX:=0; // начальное положение в пространстве TransZ:=0; TransX:=0; TransY:=0; ReturnM:=false; DC := GetDC(Handle); SetDCPixelFormat; hrc := wglCreateContext(DC); wglMakeCurrent(DC, hrc); InitializeRC; glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, @MaterialColor); // Борьба с мерцанием If DC=0 then showMessage('ков'); If hrc=0 then showMessage('ков-ков'); // Положение камеры glViewport(0, 0, ClientWidth, ClientHeight); glMatrixMode (GL_PROJECTION); glMatrixMode (GL_MODELVIEW); glLoadIdentity; eyex:=-0.5;eyey:=-0.5;eyez:=0.5; //положениг глаз centerx:=0;centery:=0.7;centerz:=0; //наблюдаемая точка upx:=0;upy:=1;upz:=0; //поворот камеры end;
procedure Tform2.DrawScene; begin // процедура рисования glClearColor (0.0, 0.5, 0.5, 0.0); glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); glLoadIdentity(); gluLookAt(eyex, eyey, eyez,centerx, centery, centerz, upx, upy, upz); GlPushMatrix;
glRotate(RotZ,0,0,1); glRotate(RotY,0,1,0); glRotate(RotX,1,0,0); glTranslatef(0.0,0.0,0); glRotatef(0.0, 1.0, 0.0, 0.0); // ----------------Куб с текстурами-------------------------- LoadTexture('1.jpg',Front, FALSE); glEnable(GL_TEXTURE_2D); glBegin(GL_POLYGON); // ----------------перед-------------------------- glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, -1.0, 1.0); glTexCoord2f(1.0, 0.0); glVertex3f( 1.0, -1.0, 1.0); glTexCoord2f(1.0, 1.0); glVertex3f( 1.0, 1.0, 1.0); glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, 1.0, 1.0); glEnd(); // ----------------верх(???????)-------------------------- LoadTexture('2.jpg',Up, FALSE); glBegin(GL_POLYGON); glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, 1.0, -1.0); glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, 1.0, 1.0); glTexCoord2f(1.0, 0.0); glVertex3f( 1.0, 1.0, 1.0); glTexCoord2f(1.0, 1.0); glVertex3f( 1.0, 1.0, -1.0); glEnd(); // ----------------зад ????-------------------------- LoadTexture('3.jpg',Back, FALSE); glBegin(GL_POLYGON); glTexCoord2f(1.0, 0.0); glVertex3f(-1.0, -1.0, -1.0); glTexCoord2f(1.0, 1.0); glVertex3f(-1.0, 1.0, -1.0); glTexCoord2f(0.0, 1.0); glVertex3f( 1.0, 1.0, -1.0); glTexCoord2f(0.0, 0.0); glVertex3f( 1.0, -1.0, -1.0); glEnd(); // ----------------низ(???)-------------------------- LoadTexture('4.jpg',Bottom, FALSE); glBegin(GL_POLYGON); glTexCoord2f(1.0, 1.0); glVertex3f(-1.0, -1.0, -1.0); glTexCoord2f(0.0, 1.0); glVertex3f( 1.0, -1.0, -1.0); glTexCoord2f(0.0, 0.0); glVertex3f( 1.0, -1.0, 1.0); glTexCoord2f(1.0, 0.0); glVertex3f(-1.0, -1.0, 1.0); glEnd(); // ----------------права------------------------------ LoadTexture('5.jpg',Right, FALSE); glBegin(GL_POLYGON); glTexCoord2f(1.0, 0.0); glVertex3f( 1.0, -1.0, -1.0); glTexCoord2f(1.0, 1.0); glVertex3f( 1.0, 1.0, -1.0); glTexCoord2f(0.0, 1.0); glVertex3f( 1.0, 1.0, 1.0); glTexCoord2f(0.0, 0.0); glVertex3f( 1.0, -1.0, 1.0); glEnd(); // ----------------лева------------------------------ LoadTexture('6.jpg',Leva, FALSE); glBegin(GL_POLYGON); glTexCoord2f(0.0, 0.0); glVertex3f(-1.0, -1.0, -1.0); glTexCoord2f(1.0, 0.0); glVertex3f(-1.0, -1.0, 1.0); glTexCoord2f(1.0, 1.0); glVertex3f(-1.0, 1.0, 1.0); glTexCoord2f(0.0, 1.0); glVertex3f(-1.0, 1.0, -1.0); glEnd(); SwapBuffers(DC); end;
procedure TForm2.FormDestroy(Sender: TObject); begin wglMakeCurrent(0,0);//обнуляем текущ. раоаметры wglDeleteContext(HRC);//уничтожаем контекст ReleaseDC(Handle,DC);{выпускаем контекст устройства} DeleteDC(DC);//уничтожаем дескриптор end;
procedure TForm2.FormCloseQuery(Sender: TObject; var CanClose: Boolean); begin form1.Close; end;
procedure TForm2.FormResize(Sender: TObject); begin glMatrixMode(GL_PROJECTION); glLoadIdentity; gluPerspective(30.0, Width / Height, 1.0, 10.0); glViewport(0, 0, Width, Height); glMatrixMode(GL_MODELVIEW); InvalidateRect(Handle, nil, False); end;
procedure TForm2.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); begin {поворот} case key of 40: begin RotZ:=5+RotZ;end;{__dwn} 38: begin RotZ:=-5+RotZ;end;{__up} //40: begin RotY:=5+RotY;end;{__right} //38: begin RotY:=-5+RotY;end;{__left} 37:begin RotX:=5+RotX;end;{__right} 39:begin RotX:=-5+RotX;end;{__left} else exit; end; {--------------------------------------------------------} InvalidateRect(Handle, nil, False); end;
end.
|
Реализовал куб, на который загружаются различные текстуры.[по путям, наверное, видно что они должны находиться в папке с проектом] (в приложенном файле находится библиотека, которую использовал для загрузки текстур) Поворот кривой(но лучшего не смог пока добиться).[в идеале должен быть мышкой. пытался.. вернее пытал куб. не получилось] Проблема в АХХХ каких тормозах. Даже при текстурах 250*250 имею(условно) 1-2 fps. Прошу помочь в ликвидации тормозов.(если возможно) Или в направлении разработки.(мб есть другой способ реализации этого?) Выполнить я это должен именно в OGL, именно на Delphi. Это сообщение отредактировал(а) zik3ak - 23.3.2010, 13:40
Присоединённый файл ( Кол-во скачиваний: 11 )
Textures.rar 292,50 Kb
|