- unit Unit1;
- interface
- uses
- Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, dglopengl,
- ExtCtrls;
- type
- TForm1 = class(TForm)
- procedure FormCreate(Sender: TObject);
- procedure FormDestroy(Sender: TObject);
- procedure FormResize(Sender: TObject);
- private
- { Private-Deklarationen }
- myDC : HDC;
- myRC : HGLRC;
- public
- { Public-Deklarationen }
- procedure myIdle(Sender: TObject; var done: boolean);
- end;
- var
- Form1: TForm1;
- welle : single;
- ProgramObject : GLhandleARB;
- VertexShaderObject : GLhandleARB;
- implementation
- {$R *.DFM}
- procedure render;
- var
- x,z : integer;
- begin
- glcolor3f(1,1,1);
- glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT); //Farb und Tiefenpuffer löschen
- glLoadIdentity;
- for x := 0 to 64 do
- begin
- glBegin(GL_TRIANGLE_STRIP);
- for z := 0 to 64 do
- begin
- glUniform1fARB(glGetUniformLocationARB(ProgramObject, PGLCharARB('wave')), welle);
- glvertex3f(32-x, -1, 32-z);
- glvertex3f(32-(x+1), -1, 32-z);
- welle := welle + 0.0001;
- end;
- glend;
- end;
- glUseProgramObjectARB(0);
- SwapBuffers(form1.myDC); //scene ausgeben
- end;
- function 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.FormCreate(Sender: TObject);
- var
- shader : tstringlist;
- ShaderText : string;
- ShaderLength : integer;
- begin
- initopengl;
- form1.myDC:= GetDC(Handle);
- myRC:= CreateRenderingContext(mydc,[opDoubleBuffered],32,24,0,0,0,0);
- ActivateRenderingContext(MyDC, MyRC);
- glEnable(GL_DEPTH_TEST);
- glLoadIdentity;
- shader := tstringlist.Create;
- shader.LoadFromFile('shader.txt');
- ShaderText := shader.Text;
- ShaderLength := length(ShaderText);
- ProgramObject := glCreateProgramObjectARB;
- VertexShaderObject := glCreateShaderObjectARB(GL_VERTEX_SHADER_ARB);
- glShaderSourceARB(VertexShaderObject, 1, @ShaderText, @ShaderLength);
- glCompileShaderARB(VertexShaderObject);
- ShowMessage(glSlang_GetInfoLog(VertexShaderObject));
- glAttachObjectARB(ProgramObject, VertexShaderObject);
- glDeleteObjectARB(VertexShaderObject);
- glLinkProgramARB(ProgramObject);
- shader.Free;
- Application.OnIdle:= MyIdle;
- end;
- procedure TForm1.FormDestroy(Sender: TObject);
- begin
- DeactivateRenderingContext;
- wglDeleteContext(myRC);
- ReleaseDC(Handle, myDC);
- end;
- procedure TForm1.FormResize(Sender: TObject);
- begin
- glViewport(0, 0, Width, Height); // Setzt den Viewport für das OpenGL Fenster
- glMatrixMode(GL_PROJECTION); // Matrix Mode auf Projection setzen
- glLoadIdentity(); // Reset View
- gluPerspective(45.0, Width/Height, 1, 100.0); // Perspektive den neuen Maßen anpassen.
- glMatrixMode(GL_MODELVIEW); // Zurück zur Modelview Matrix
- glLoadIdentity();
- end;
- procedure tform1.MyIdle(Sender: TObject; var Done: Boolean);
- begin
- render;
- done := false;
- end;
- end.