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.