3.         Засобами бібліотеки Opengl активізувати джерело світла на формі

(рис. 1)

unit frmMain;

interface

uses

Windows, Messages, Classes, Graphics, Forms, ExtCtrls, Menus,

Controls, Dialogs, SysUtils,

OpenGL;

type

TfrmGL = class(TForm)

procedure FormCreate(Sender: TObject);

procedure FormResize(Sender: TObject);

procedure FormDestroy(Sender: TObject);

procedure FormPaint(Sender: TObject);

procedure FormKeyDown(Sender: TObject; var Key: Word;

Shift: TShiftState);

private

DC : HDC;

hrc : HGLRC;

Angle : GLfloat;

uTimerId : uint;

MaterialColor: Array[0..3] of GLfloat;

procedure Init;

procedure SetDCPixelFormat;

end;

const

GLF_START_LIST = 1000;

var

frmGL: TfrmGL;

implementation

uses mmSystem;

{$R *.DFM}

const

stripeImageWidth = 32;

var

stripeImage : Array [0..3*stripeImageWidth-1] of GLubyte;

procedure makeStripeImage;

var

j : GLint;

begin

For j := 0 to stripeImageWidth - 1 do begin

If j <= 4

then stripeImage[3*j] := 255

else stripeImage[3*j] := 0;

If j > 4

then stripeImage[3*j + 1] := 255

else stripeImage[3*j + 1] := 0;

stripeImage[3*j+2] := 0;

end;

end;

procedure OutText (Litera : PChar);

begin

glListBase(GLF_START_LIST);

glCallLists(Length (Litera), GL_UNSIGNED_BYTE, Litera);

end;

procedure TfrmGL.Init;

const

sgenparams : Array [0..3] of GLfloat = (1.0, 1.0, 1.0, 0.0);

begin

glEnable(GL_DEPTH_TEST);// разрешаем тест глубины

glEnable(GL_LIGHTING); // разрешаем работу с освещенностью

glEnable(GL_LIGHT0); // включаем источник света

makeStripeImage();

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);

glTexParameterf(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

glTexParameterf(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);

glTexImage1D(GL_TEXTURE_1D, 0, 3, stripeImageWidth, 0,

GL_RGB, GL_UNSIGNED_BYTE, @stripeImage);

glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);

glTexGenfv(GL_S, GL_OBJECT_PLANE, @sgenparams);

glEnable(GL_TEXTURE_GEN_S);

glEnable(GL_TEXTURE_1D);

end;

procedure TfrmGL.FormPaint(Sender: TObject);

begin

glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);

glPushMatrix;

glRotatef(Angle, 0.0, 1.0, 0.0); // поворот на угол

glMaterialfv(GL_FRONT, GL_AMBIENT_AND_DIFFUSE, @MaterialColor);

OutText ('Включення світла');

glPopMatrix;

SwapBuffers(DC);

end;

procedure FNTimeCallBack(uTimerID, uMessage: UINT;dwUser, dw1, dw2: DWORD) stdcall;

begin

With frmGL do begin

Angle := Angle + 0.2;

If (Angle >= 720.0) then Angle := 0.0;

MaterialColor [0] := (720.0 - Angle) / 720.0;

MaterialColor [1] := Angle / 720.0;

MaterialColor [2] := Angle / 720.0;

InvalidateRect(Handle, nil, False);

end;

end;

procedure TfrmGL.FormCreate(Sender: TObject);

begin

Angle := 0;

DC := GetDC(Handle);

SetDCPixelFormat;

hrc := wglCreateContext(DC);

wglMakeCurrent(DC, hrc);

wglUseFontOutlines(Canvas.Handle, 0, 255, GLF_START_LIST, 0.0, 0.15,

WGL_FONT_POLYGONS, nil);

Init;

uTimerID := timeSetEvent (1, 0, @FNTimeCallBack, 0, TIME_PERIODIC);

end;

procedure TfrmGL.FormResize(Sender: TObject);

begin

glViewport(0, 0, ClientWidth, ClientHeight);

glMatrixMode(GL_PROJECTION);

glLoadIdentity;

gluPerspective(40.0, ClientWidth / ClientHeight, 1.0, 20.0);

glMatrixMode(GL_MODELVIEW);

glLoadIdentity;

glTranslatef(0.0, 0.0, -8.0);

glRotatef(30.0, 1.0, 0.0, 0.0);

InvalidateRect(Handle, nil, False);

end;

procedure TfrmGL.FormDestroy(Sender: TObject);

begin

timeKillEvent(uTimerID);

glDeleteLists (GLF_START_LIST, 256);

wglMakeCurrent(0, 0);

wglDeleteContext(hrc);

ReleaseDC(Handle, DC);

DeleteDC (DC);

end;

procedure TfrmGL.FormKeyDown(Sender: TObject; var Key: Word;

Shift: TShiftState);

begin

If Key = VK_ESCAPE then Close

end;

procedure TfrmGL.SetDCPixelFormat;

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;

end.

Завдання №4 (11)

procedure TfrmGL.FormKeyPress(Sender: TObject; var Key: Char);

begin

if key = '-' then mx:=mx+1;

if key = '+' then mx:=mx-1;

InvalidateRect(Handle, nil, False);

end;

end.


Список використаної літератури

1.         Блінова Т.О., Порєв В.М. Комп’ютерна графіка / За ред. В.М. Горєва. – К.: Видавництво “Юніор”, 2004. – 456с., іл.

2.         С.В. Глушаков, Г.А. Крабе Компютерная графика, Харьков 2002

3.         OpenGl, технология ставшая символов, Учебник в примерах.

4.         Конспект лекцій.


Информация о работе «Перетворення координат, операції масштабування в бібліотеці Opengl»
Раздел: Информатика, программирование
Количество знаков с пробелами: 15941
Количество таблиц: 0
Количество изображений: 6

Похожие работы

Скачать
58181
1
2

... при цьому подвійну буферизацію, міг би виглядати таким чином: відкрити_вікно_в_режимі_подвійної_буфериэації(); for (i = 0; i < 1000000; i++){ очистити_вікно(); намалювати_кадр(i); поміняти_буфери_місцями() ; }   3.2 Моделювання вогню Крім того, частота оновлення відеоінформації, що відображається, є постійною величиною, яка може мати деякі несподівані наслідки з точки зору ...

Скачать
24034
0
7

... . Імовірно, обидві ці думки справедливі, як і багато інших. Одне безсумнівно - створення мережі Internet є видатним досягненням людства. Важливе місце в Internet посідає комп'ютерна графіка. Усе більше удосконалюються способи передачі візуальної інформації, розробляються досконаліші графічні формати, відчутно бажання використовувати тривимірну графіку, анімацію, весь спектр мультимедіа. 2. ...

0 комментариев


Наверх