![]() |
|
#1
|
|||
|
|||
![]() Программа запускается, никаких ошибок не выдает, но ничего не отображается. Может чего то не хватает? Помогите плиз.
Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, OpenGL; type TForm1 = class(TForm) Timer1: TTimer; procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure FormResize(Sender: TObject); procedure Timer1Timer(Sender: TObject); private { Private declarations } DC:HDC; // переменные для получения контекста воспроизведения hrc:HGLRC; // Angle:GLfloat; // угол, на который будет поворачиваться куб procedure Initsvet; procedure SetPixFormat;// формат пукселя procedure WMPaint( var Msg: TWMPaint );// похожа на OnPaint message WM_PAINT; // сообщение от OnPaint public { Public declarations } end; const MaterialColor: Array [0..3] of GLfloat = (0.3, 0.4, 1.0, 1.0); var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.FormCreate(Sender: TObject); begin Angle := 0; DC := GetDC(Handle); // получить окно SetPixFormat; // установим формат пикселя hrc := wglCreateContext(DC); wglMakeCurrent(DC, hrc); // сделаем "текущим контекст воспроизведения Initsvet; // включим свет glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE , @MaterialColor); glMatrixMode(GL_MODELVIEW); Timer1.Enabled := True; // включим таймер GLShadeModel(GL_SMOOTH); end; procedure TForm1.initsvet; // СВЕТ // const fogColor: array[0..3] of GLfloat = (0.7, 0.7, 0.7, 2.0); var fogMode : GLint; begin glEnable(GL_DEPTH_TEST); // разрешить тест глубины glEnable(GL_LIGHTING); // разрешить освещённость glEnable(GL_LIGHT0); // включить нулевую лампу end; procedure TForm1.SetPixFormat; var nPixelFormat: Integer; pfd: TPixelFormatDescriptor; begin FillChar(pfd, SizeOf(pfd), 0); with pfd do begin nSize := sizeof(pfd); nVersion := 1; dwFlags := PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER; iPixelType:= PFD_TYPE_RGBA; cColorBits:= 24; cDepthBits:= 32; iLayerType:= PFD_MAIN_PLANE; end; nPixelFormat := ChoosePixelFormat(DC, @pfd); SetPixelFormat(DC, nPixelFormat, @pfd); end; procedure TForm1.WMPaint(var Msg: TWMPaint); var quadObj : gluQuadricObj; begin quadObj := gluNewQuadric;//новый объект glRotate(5.0, 0.0, 1.0, 0.0);//повернём glPushMatrix;//перейдём к новым координатам, сохранив старые glRotated(-90,1.0,0.0,0.0);//ещё раз повернём gluSphere(quadObj,1.3,20,20);//а теперь нарисуем сферу "1.3 - радиус", // а 20 и 20 - это колличество разбиений glPopMatrix;//перейдём к старым координатам gluDeleteQuadric(quadObj);//эта функция сделает "чёрную" работу end; procedure TForm1.FormResize(Sender: TObject); begin glMatrixMode(GL_PROJECTION); // модель матрицы проекционная glLoadIdentity; // загрузить матрицу gluPerspective(60.0, Width / Height, 1.0, 10.0); glViewport(0, 0, Width, Height); // область вывода весь экран glMatrixMode(GL_MODELVIEW); // модель матрицы перспективная InvalidateRect(Handle, nil, False); // перерисовать всё окно end; procedure TForm1.FormDestroy(Sender: TObject); begin Timer1.Enabled := False; wglMakeCurrent(0, 0); // сделать контекст "текущим" wglDeleteContext(hrc); // удалить контекст воспроизведения ReleaseDC(Handle, DC); // удалить окно end; procedure TForm1.Timer1Timer(Sender: TObject); begin Angle := Angle + 1.0; // увеличиваем угол If (Angle >= 360.0) then Angle := 0.0; // если совершён полный оборот, то вернуть в 0 InvalidateRect(Handle, nil, False); // перерисовать окно end; end. |