Tutorials/OpenGL dengan Delphi

From GameDevID

Jump to: navigation, search

Menggunakan OpenGL dengan Delphi (VCL Forms)

Tujuan dari tutorial ini adalah membuat aplikasi berbasis form VCL yang ada pada Delphi agar dapat menggunakan OpenGL untuk menggambar objek 2D dan 3D.

Fungsi-fungsi OpenGL termasuk dalam Win32 SDK yang disediakan oleh Delphi. Delphi juga menyediakan help-file yang bisa diakses melalui menu Help>Windows SDK.

Langkah-langkah menggunakan OpenGL

  • Membuat aplikasi baru

Pilih menu (File > New > Application). akan tampil form kosong, tambahkan Panel ke form lalu atur ukurannya menjadi Width:640 Height:640.

  • Tampilkan code editor (F12)

Tambahkan OpenGL pada klausa uses

uses
     ...
     ,OpenGL;
  • Tambahkan variabel berikut pada properti form.
FDC : HDC;
FRC : HGLRC;
procedure IdleLoop(Sender : TObject; Var Done : boolean);
  • Tekan Shift+Ctrl+C agar implementasi prosedur IdleLoop dibuat secara otomatis oleh IDE.
procedure TForm1.IdleLoop(Sender:TObject; Var Done: boolean);
begin

end; 
  • Tambahkan event Handler OnCreate pada form (klik dua kali pada form atau klik dua kali pada window event OnCreate)
procedure TForm1.FormCreate(Sender : TObject);
var
pfd : TPIXELFORMATDESCRIPTOR;
pixelformat : integer;
begin
{ TAHAP I : Buat Window OpenGL }
FDC := GetDC( Panel1.Handle ); //window openGL akan ditampilkan di panel
FillChar(pfd, sizeof(pfd), 0);

pfd.nSize := sizeof(pfd);
pfd.nVersion := 1;
pfd.dwFlags := PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER;
pfd.iPixelType := PFD_TYPE_RGBA;
pfd.cColorBits := 16;

{$WARNINGS OFF} //biar nggak muncul warning karena penggunaan operator '@'
pf := ChoosePixelFormat(FDC, @pfd);
SetPixelFormat(FDC, pf, @pfd);
{$WARNINGS ON} //kembalikan ke normal

FRC := wglCreateContext(FDC);
wglMakeCurrent(FDC, FRC);

{ TAHAP II : Inisialisasi variabel openGL }
glSetViewport( 0, 0, Panel1.Width, Panel1.Height ); //
glClearColor( 0, 0, 0, 1.0 ); // r:0 g:0 b:0 = hitam

glMatrixMode( GL_PROJECTION );
glLoadIdentity;
gluPerspective( 45, Panel1.Width/Panel1.Height, 1, 500);//FoV, Aspect Ratio, Near Clip, Far Clip
glMatrixMode( GL_MODELVIEW );
glLoadIdentity;
{ Set Kamera }
gluLookAt( 0, 0, -4, 0, 0, 0, 0, 1, 0 );// posisi.x, posisi.y, posisi.z, lookat.x, lookat.y, lookat.z, up.x, up.y, up.z

Application.OnIdle := IdleLoop;
end;
  • Sekarang waktunya mengisi body prosedur IdleLoop
procedure TForm1.IdleLoop(Sender : TObject; Var Done : Boolean);
begin
glClear( GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT );

//prosedur penggambaran
glPushMatrix;
glColor( 0, 0.5, 0, 1); //warna ijo
glBegin(GL_QUADS); //gambar kotak (warna ijo)
glVertex3f( -0.5, -0.5, -0,5 );
glVertex3f( 0.5, -0.5, -0,5 );
glVertex3f( 0.5, 0.5, -0,5 );
glVertex3f( -0.5, 0.5, -0,5 );
glEnd;
glPopMatrix;

glFlush;

SwapBuffers(DC); //update hasil penggambaran ke layar
end;
Personal tools