unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
dglOpenGL, ExtCtrls, StdCtrls, Log;
type
TForm1 = class(TForm)
Timer1: TTimer;
Panel1: TPanel;
Label1: TLabel;
vshaderScript: TMemo;
fshaderScript: TMemo;
procedure FormCreate(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure FormResize(Sender: TObject);
private
programObject:glHandleARB;
vertexShaderObject:glHandleARB;
fragmentShaderObject:glHandleARB;
function glSlang_GetInfoLog(glObject : GLHandleARB) : String;
public
hDC: HDC;
hRC: HGLRC;
end;
var
Form1: TForm1;
LogView: TLogView;
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
var fshaderlength:Integer;
var fshadertext:String;
var vshaderlength:Integer;
var vshadertext:String;
begin
LogView:=TLogView.Create(Form1);
LogView.Visible:=true;
InitOpenGL();
LogView.makelog('InitGl');
hDC:=GetDC(Panel1.Handle);
hRC:= CreateRenderingContext( hDC,
[opDoubleBuffered],
32,
24,
0,0,0,
0);
ActivateRenderingContext(hDC, hRC);
LogView.makelog('ActivateRenderingContext');
glViewport(0, 0, ClientWidth, ClientHeight);
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
gluPerspective(45, ClientWidth/ClientHeight, 1, 100);
glMatrixMode(GL_MODELVIEW);
programObject:=glCreateProgramObjectARB;
vertexShaderObject:= glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB);
fragmentShaderObject:= glCreateShaderObjectARB(GL_FRAGMENT_SHADER_ARB);
LogView.makelog('Create Shader');
vshadertext:=self.vshaderScript.Lines.text;
fshadertext:=self.fshaderScript.Lines.text;
vshaderlength:=length(vshadertext);
fshaderlength:=length(fshadertext);
LogView.makelog('Vertexshader: '+vshadertext);
LogView.makelog('Länge: '+inttostr(vshaderlength));
LogView.makelog('Fragmentshader: '+fshadertext);
LogView.makelog('Länge: '+inttostr(fshaderlength));
glShaderSourceARB(VertexShaderObject, 1, @vshadertext, @vshaderlength);
glShaderSourceARB(FragmentShaderObject, 1, @fshadertext, @fshaderlength);
glCompileShaderARB(VertexShaderObject);
LogView.makelog('Compile Vertexshader:' +glSlang_GetInfoLog(VertexShaderObject));
glCompileShaderARB(FragmentShaderObject);
LogView.makelog('Compile Fragmentshader:' +glSlang_GetInfoLog(FragmentShaderObject));
glAttachObjectARB(ProgramObject, VertexShaderObject);
glAttachObjectARB(ProgramObject, FragmentShaderObject);
glDeleteObjectARB(VertexShaderObject);
glDeleteObjectARB(FragmentShaderObject);
glLinkProgramARB(ProgramObject);
LogView.makelog('Linke Programmobjekt:' +glSlang_GetInfoLog(ProgramObject));
glUseProgramObjectARB(ProgramObject);
Timer1.Enabled:=true;
LogView.makelog('Starte Hauptschleife');
end;
function TForm1.glSlang_GetInfoLog(glObject : GLHandleARB) : String;
var
blen,slen : GLInt;
InfoLog : PGLCharARB;
begin
glGetObjectParameterivARB(glObject, GL_OBJECT_INFO_LOG_LENGTH_ARB , @blen);
if blen > 1 then
begin
GetMem(InfoLog, blen*SizeOf(GLCharARB));
glGetInfoLogARB(glObject, blen, slen, InfoLog);
Result := PChar(InfoLog);
Dispose(InfoLog);
end;
end;
procedure TForm1.FormPaint(Sender: TObject);
begin
glViewport(0, 0, ClientWidth, ClientHeight);
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
gluPerspective(45, ClientWidth/ClientHeight, 1, 100);
glMatrixMode(GL_MODELVIEW);
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
glMatrixMode(GL_MODELVIEW);
glClearColor(1,0,0,0);
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glBegin(GL_QUADS);
glVertex3f(1,1,-5); glColor3f(1,0,0);
glVertex3f(-1,1,-5); glColor3f(0,1,0);
glVertex3f(-1,-1,-5); glColor3f(0,0,1);
glVertex3f(1,-1,-5); glColor3f(1,0,1);
glEnd();
SwapBuffers(hDC);
end;
procedure TForm1.FormResize(Sender: TObject);
begin
glViewport(0, 0, ClientWidth, ClientHeight);
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
gluPerspective(45, ClientWidth/ClientHeight, 1, 100);
glMatrixMode(GL_MODELVIEW);
end;
end.