- 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.