DGLOPENGL学习01
https://delphigl.com
请从这里下载dglopengl.pas在option里面添加引用。
由于是德语网站,请添加翻译软件,嗯,翻译后的语句读起来也是不是很明白。。。
点击顶部的tut0rial进入教程,同样需要翻译软件帮忙,德语完全看不懂。
以下是第一个教程的代码,稍作了一些改动。
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, dglOpenGL;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormResize(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure IdleHandler(Sender: TObject; var Done: Boolean);
private
{ Private declarations }
StartTime, TimeCount, FrameCount: Cardinal; //FrameCounter
Frames, DrawTime: Cardinal; //& Timebased Movement
procedure SetUpGL;
procedure Render;
procedure ErrorHandler;
public
{ Public declarations }
end;
const
NearClipping = 1;
FarClipping = 1000;
var
Form1: TForm1;
DC: HDC;
RC: HGLRC;
implementation
{$R *.dfm}
procedure TForm1.ErrorHandler;
begin
Form1.Caption := Form1.Caption + gluErrorString(glGetError);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
DC := GetDC(Handle);
if not InitOpenGL then
Application.Terminate;
RC := CreateRenderingContext(DC, [opDoubleBuffered], 32, 24, 0, 0, 0, 0);
ActivateRenderingContext(DC, RC);
//其他初始化任务
SetUpGL;
Application.OnIdle:=IdleHandler;
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
DeactivateRenderingContext;
DestroyRenderingContext(RC);
ReleaseDC(Handle, DC);
end;
procedure TForm1.FormResize(Sender: TObject);
var
tmpBool: Boolean;
begin
glViewport(0, 0, ClientWidth, ClientHeight);
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
gluPerspective(45.0, ClientWidth / ClientHeight, NearClipping, FarClipping);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity;
end;
procedure TForm1.IdleHandler(Sender: TObject; var Done: Boolean);
begin
StartTime := GetTickCount;
Render;
DrawTime := GetTickCount - StartTime;
Inc(TimeCount, DrawTime);
Inc(FrameCount);
if TimeCount >= 1000 then
begin
Frames := FrameCount;
TimeCount := TimeCount - 1000;
FrameCount := 0;
Caption := IntToStr(Frames) + 'FPS';
ErrorHandler;
end;
Done := False;
end;
procedure TForm1.Render;
begin
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); //清除图像
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
gluPerspective(45.0, ClientWidth / ClientHeight, NearClipping, FarClipping);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity;
glTranslatef(0, 0, -2); //移动坐标轴
glBegin(GL_QUADS);
glColor3f(1, 0, 0);
glVertex3f(0, 0, 0);
glColor3f(0, 1, 0);
glVertex3f(1, 0, 0);
glColor3f(0, 0, 1);
glVertex3f(1, 1, 0);
glColor3f(1, 1, 0);
glVertex3f(0, 1, 0);
glEnd;
SwapBuffers(DC);
end;
procedure TForm1.SetUpGL;
begin
glClearColor(0.3, 0.4, 0.7, 0.0); //Hintergrundfarbe: Hier ein leichtes Blau
glEnable(GL_DEPTH_TEST); //Tiefentest aktivieren
glEnable(GL_CULL_FACE); //Backface Culling aktivieren
end;
end.
点击运行就是在一个蓝色的form里面生成一个死角带渐变色的正方形。