Dies ist ein Beispiel, wie man in OpenGL einen sehr realistischen Blitz in hochauflösender Grafik zeichnen und animieren kann.
Der Timer sollte auf 49 (fps) gestellt werden.
uses OpenGL
var
Form1: TForm1;
DC:HDC;
hrc:HGLRC;
ELECT:array[1..100,1..2]of GLFloat;
px1,px2,py1,py2:GLFLoat;
st:GLDOUBLE;
//
procedure SetDCPixelFormat (hdc : HDC);
var
pfd : TPixelFormatDescriptor;
nPixelFormat : Integer;
begin
FillChar (pfd, SizeOf (pfd), 0);
pfd.dwFlags :=PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER;
nPixelFormat :=ChoosePixelFormat (hdc, @pfd);
SetPixelFormat(hdc, nPixelFormat, @pfd);
end;
procedure TForm1.FormCreate(Sender: TObject);
var
m, n:integer;
DST:GLFloat;
begin
randomize;
dc:=getdc(handle);
setdcpixelformat(dc);
hrc:=wglcreatecontext(dc);
wglmakecurrent(dc,hrc);
px1:=-9.999; py1:=0;
px2:=0.9; py1:=0;
DST:=0.2;
for n:=1 to 100 do
begin
Elect[n,1]:=px1+(n*dst);
elect[n,2]:=0;
end;
st:=0.1;
GLEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE) ;
end;
function znak(VAR X):ShortInt;
begin
if GLDouble(X)<0 then result:=-1
else
if GLDouble(X)>0 then result:=1
else
result:=0;
end;
procedure Glow;
const
coef=pi/180*(360/6);
size=2.5;
begin
glscalef(size,size,size);
glbegin(GL_TRIANGLE_FAN);
//glcolor4f(1,1,1,0.8415);
glcolor4f(0.7,0.7,0.7,0.18);
glvertex2f(0,0);
glcolor4f(0,0,1,0.0);
glvertex2f(0,1);
glvertex2f(-0.866025403,0.5);
glvertex2f(-0.866025403,-0.5);
glvertex2f(0,-1);
glvertex2f(0.866025403,-0.5);
glvertex2f(0.866025403,0.5);
glvertex2f(0,1);
glend;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
var
m, n:integer;
c:GLFloat;
priority:single;
begin
glclear(GL_COLOR_BUFFER_BIT);
glloadidentity;
glscalef(0.1,0.1,0.1);
for n:=2 to 99 do
begin
if N<50 then
priority:=0.01
else
priority:=-0.01;
ELECT[n,2]:=elect[n-1,2]+(random-0.5)*0.5+priority;
end;
gllinewidth(clientwidth*clientheight*0.000015);
glcolor3f(0.1,0.1,0.1);
glbegin(GL_LINE_STRIP);
for n:=1 to 100 do
glvertex2f(ELECT[n,1],ELECT[n,2]);
glend;
glpushmatrix;
for n:=1 to 100 do
begin
glpopmatrix;
glpushmatrix;
gltranslatef(elect[n,1],elect[n,2],0);
glow;
end;
swapbuffers(dc);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
wglmakecurrent(0,0);
wgldeletecontext(hrc);
releasedc(handle,dc);
deletedc(dc);
end;
procedure TForm1.FormResize(Sender: TObject);
begin
glviewport(0,0,clientwidth,clientheight);
end;
Keine Kommentare:
Kommentar veröffentlichen