Belajar OpenGL with Delphi


Pada binggung ya apa sih tu openGL? saya juga binggung kok pada awalnya tapi setelah saya tanya ma mbah saya akhirnya saya paham juga, tapi kebanyakan yang saya jumpai banyak tutor openGL yang mungkin masih sedikit susah dicerna (kaya makanan aja), untuk itu disini saya coba menjelaskan sedikit ilmu saya karena saya juga dalam tahap belajar heheheheh……. langsung aja kita bahas. Pertama  kita kenalan dulu ma si openGL.

OpenGL kepanjangan dari Open Graphic Library, openGL diproduksi oleh Silicon Graphic dan pada awalnya ditunjukan hanya untuk sistem komputer mereka , tetapi dalam perkembangannya, OpenGL dijadikan salah satu bakuan (standartd) dalam dunia grafika komputer.  OpenGL merupakan pustaka program (program library) yang menyediakan sejumlah perintah yang b erhubungan dengan grafika.

Udah kan kenalannya dengan OpenGL, setidaknya anda mungkin sudah punya gambaran gimana sih openGL tu. Kalo yang belum paham juga gini aja anggaplah openGL tu suatu perintah dalam program jika kita ingin menggunakan openGL tentunya kita harus melakukan command untuk memanggil si OpenGL tersebut, openGL bisa diakses jika suatu bahasa pemrograman sudah terdapat file openGL di folder  lib . Disini saya akan coba berbagi cara membuat program yang menggunakan openGL untuk membuat titik,objek, dan melakukan transformasi. Program yang saya gunakan adalah delphi, sebenarnya selain bahasa pemrograman yang bisa digunakan bukan hanya delphi, misalnya C,VB, juga bisa untuk keterangan lebih lanjut silahkan cek di websiteoepngl. Berhubung saya tidak mengerti bahasa pemrograman C untuk itu saya menggunakan delphi karena syntak hampir sama dengan pascal dan sudah OOP (bukan karena saya jago delphi tapi cuman ini satu-satunya bahasa pemrograman yang agak nyangkut di kepala😦 ).

Langkah pertama tentunya anda harus mendownload program Delphi dulu untuk membuat program, silahkan anda search sendiri di mbah. Saya menggunakan Delphi7, di dalam delphi7 sudah  disediakan file openGL.dcu silahkan di cek untuk memastikan di program delphi folder lib. jika belum tersedia silahkan anda mencari file openGL.dcu, jika tersedia anda cukup menambahkan klausa openGL di perintah uses dari program.

Contoh : Listing Menghubungkan OpenGL.

uses

Windows,  message,  sysUtils, Classes, Graphic, Controls, Forms,  Dialogs, OpenGL;


Menggunakan OpenGL

Mengingat openGl bukan bagian dari sistem operasi windows maka kita perlu mengetahui bahwa program yang kita buat memanfaatkan API dari openGL. Informasi yang perlu diketahui mengenai :

  1. Format Pixel yang di sampaikan melalui struktur data TPixelFormatDescriptor. Format pixel memberikan informasi mengenai jumlah warna dalam bit per pixel, kedalaman sumbu , serta tipe pixel.
  2. Device Context yang menyatakan perangkat (device) yang akan di gunakan oleh openGL untuk menggambar di layar. Antara perangkat yang disediakan oleh windows dan perangkat yang di sediakan open gl harus dihubungkan sehingga apa yang digambar openGL akan di tampilkan oleh windows.

Tahapan untuk menggunakan OpenGL dapat dirumuskan dalam 4 langkah berikut ini :

  1. Tentukan format pixel
  2. Buat device context untuk me-render/menggambar
  3. Aktifkan device context yang di buat pada langkah 2
  4. Gambar pixel

—————————————————————————————————————————————–

Buat lah Tampilan Form seperti di bawah ini :

form

setelah tu buat ketikan listing program di bawah ini :

unit Main;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls, ExtCtrls,OpenGL;

type
TForm1 = class(TForm)
Panel1: TPanel;
GlModeGrp: TRadioGroup;
GroupBox1: TGroupBox;
Label1: TLabel;
EVX: TEdit;
Label2: TLabel;
EVW: TEdit;
Label3: TLabel;
EVY: TEdit;
Label4: TLabel;
EVH: TEdit;
Button1: TButton;
GroupBox2: TGroupBox;
Label5: TLabel;
Label6: TLabel;
Label7: TLabel;
Label8: TLabel;
ELW: TEdit;
ERW: TEdit;
ETW: TEdit;
EBW: TEdit;
Button2: TButton;
Label9: TLabel;
EZN: TEdit;
EZF: TEdit;
Label10: TLabel;
procedure FormCreate(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure GlModeGrpClick(Sender: TObject);
private
{ Private declarations }
pfd:TPixelFormatDescriptor;
glDC:HDC;
glContext:HGLRC;
mode:GLEnum;
//world
left,right,bottom,top,znear,zfar:GLDouble;
procedure InitOpenGL(gldc:HDC);
procedure SetViewport;
procedure SetWindow;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}
procedure TForm1.SetViewport;
var
vx,vy,
vwidth,vheight:integer;
begin
vx:=StrToInt(EVX.Text);
vwidth:=StrToInt(EVW.Text);
vy:=StrToInt(EVY.Text);
vheight:=StrToInt(EVH.Text);
glViewport(vx,vy,vwidth,vheight);
end;

procedure TForm1.SetWindow;
begin
left:=StrToFloat(ELW.Text);
right:=StrToFloat(ERW.Text);
top:=StrToFloat(ETW.Text);
bottom:=StrToFloat(EBW.Text);
znear:=StrToFloat(EZN.Text);
zfar:=StrToFloat(EZF.Text);
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
glOrtho(left,right,bottom,top,znear,zfar);
end;

procedure TForm1.InitOpenGL(gldc:HDC);
var
FormatIndex: integer;
begin
fillchar(pfd,SizeOf(pfd),0);
with pfd do
begin
nSize := SizeOf(pfd);
nVersion := 1; {The current version of the desccriptor is 1}
dwFlags := PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL;
iPixelType := PFD_TYPE_RGBA;
cColorBits := 24; {support 24-bit color}
cDepthBits := 32; {depth of z-axis}
iLayerType := PFD_MAIN_PLANE;
end; {with}
FormatIndex := ChoosePixelFormat(gldc,@pfd);
SetPixelFormat(glDC,FormatIndex,@pfd);
GLContext := wglCreateContext(glDC);
wglMakeCurrent(glDC,GLContext);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
glDC := getDC(handle);
InitOpenGL(glDC);
//inisialisasi viewport dan window
EVX.Text:=’100′;
EVY.Text:=’300′;
EVW.Text:=’300′;
EVH.Text:=’200′;
SetViewport;

ELW.Text:=’-4,0′;
ERW.Text:=’+4,0′;
ETW.Text:=’+4,0′;
EBW.Text:=’-4,0′;
EZN.Text:=’-2,0′;
EZF.Text:=’16,0′;
SetWindow;
mode := GL_POINTS;
end;

procedure TForm1.FormPaint(Sender: TObject);
var
error:GLenum;
begin
{background}
glClearColor(0.2,0.2,0.0,0.0);
glClear(GL_COLOR_BUFFER_BIT);
{error checking}
error := glGetError;
if error<>GL_NO_ERROR then
raise Exception.Create(‘Error in Paint’#13+gluErrorString(error));
//area viewport
glColor3f(1.0,1.0,0.0);
glBegin(GL_LINE_LOOP);
glVertex2f(left+0.1,top-0.1);
glVertex2f(right-0.1,top-0.1);
glVertex2f(right-0.1,bottom+0.1);
glVertex2f(left+0.1,bottom+0.1);
glEnd;

glColor3f(1.0,1.0,1.0);
glBegin(mode);
glVertex2f(+0.0, +0.0);
glVertex2f(+1.0, +0.0);
glVertex2f(+1.0, +1.0);
glVertex2f(+0.0, +1.0);
glVertex2f(-1.0, +1.0);
glVertex2f(-1.0, +0.0);
glVertex2f(-1.0, -1.0);
glVertex2f(+0.0, -1.0);
glVertex2f(+1.0, -1.0);
glEnd;
glFlush;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
SetViewport;
Repaint;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
SetWindow;
Repaint;
end;

procedure TForm1.GlModeGrpClick(Sender: TObject);
begin
case GlModeGrp.ItemIndex of
0 : mode:=GL_POINTS;
1 : mode:=GL_LINES;
2 : mode:=GL_LINE_STRIP;
3 : mode:=GL_LINE_LOOP;
4 : mode:=GL_TRIANGLES;
5 : mode:=GL_TRIANGLE_STRIP;
6 : mode:=GL_TRIANGLE_FAN;
7 : mode:=GL_QUADS;
8 : mode:=GL_QUAD_STRIP;
9 : mode:=GL_POLYGON;
end;
Repaint;
end;

end.

lalu compile dan run program.

Gambar1. Run Aplikasi

prog

Keterangan Coding:

  • Atribut pfd merupakan atribut yang digunakan untuk menyimpan informasi pixel, sedangkan glDC merupakan atribut untuk menyimpan  device context yang dibuat window dan atribut glContext di gunakan untuk menyimpan Device Context yang di buat openGL. Antara device context yang di buat window dan openGL di hubungkan melalui perintah wglMakeCurrent.
  • Perintah fiilchar(pfd,SizeOf(pfd).0) mengisi atribut pfd dengan nilai o dan kemudian perintah berikutnya mengisi struktur pfd dengan nilai yang di inginkan , dalam hal ini iPixelType menyatakan bahwa pixel di gambar menggunakan RGB, mendukung warna 24-bit per pixel serta kedalaman sumbu z sebesar 32 bit. Setelah pfd selesai di isi maka isian pfd di gunakan untuk memformat gldc dan index dari formart dikembalikan melalui variabel FormatIndex. Selanjutnya mengatur agar device context glDC menggunakan format tersebut
  • Perintah GlClearColor mendefinisikan warna (RGBA) yang akan digunakan
  • Perintah yang berhubungan dengan menggambar pixel di OpenGL antara lain:
      • glBegin = Perintah menggambar
      • GL_POINTS= Setiap verteks di perlakikan sebagai titik terpisah
      • GL_LINES= Dua pasang verteks di perlakukan sebagai garis
      • GL_LINE_STRIP= Sama seperti GL_LINES tetapi setiap garis saling di hubungkan
      • GL_LINE_LOOP= Sama seperti GL_LINE_STRIP tetapi vertek pertama dan terakhir membentuk garis pula
      • GL_TRIANGLES= Tiga pasang verteks dianggap sebagai bidang segitiga
      • GL_TRIANGLES_STRIP= Bidang segitiga yang saling berhubungan
      • GL_TRIANGLE_FAN= Mirip GL_TRIANGLE_STRIP tetapi semua bidang menggunakan stu verteks yang sama
      • GL_QUADS= Empat verteks di anggap sebagai polygon empat sisi (quadrilaterals)
      • GL_QUAD_STRIP= Pasangan quadrilaterals
      • GL_POLYGON= Verteks dianggap sebagai titik sudut polygon
      • glColor3f(red,green,blue:GLFloat)= Perintah untuk menyatakan warna depan/warna objek yang akan digambar. nilai red,green,blue berkisar dari 0 sampai dengan 1.
      • glVertex2f(x,y:GLFloat)= Perintah untuk menggambar sebuah vertex di layar dengan menggunakan koordinat 2 dimensi. Pada perintah ini koordinat z dianggap sama dengan 0
      • glVertek3f(x,y,z:GLFloat)= Perintah untuk mengambar vertex dengan menggunakan koordinat 3 dimensi
      • glFlush= Pada saat openGL menerima perintah menggambar, openGL akan menggambar di buffer internalnya dan memindahkan isi buffer ke layar saat menerima perintah glFlush.

Kita bisa merubah tampilan warna background sesuai dengan keinginan dengan mengganti point RGB. dan lebar dan tinggi bisa di sesuaikan dengan gambar yang akan kita buat. Selamat Mencoba🙂

NOTE : untuk semua yang sudah meminta request program – program yang lain menggunakan openGL dan delpi saya mohon maaf karena terlambat balas berhubung saya tidak hobi ngeblog🙂 ,  akhirnya saya menemukan file kumpulan program di hdd saya ni saya kasih langsung tinggal di download🙂

 

Download : http://www.ziddu.com/download/19559479/delphi.rar.html

22 Tanggapan

  1. good2x..tp puanjang bner…

  2. ada yg lain gk……

    • maksudnya ada yang lain? program lain menggunakan delphi atau open gl make bahasa pemrograman lain?

  3. KK boleh minta source nya gak

    • @yunky

      alamat emailnya apa ya?

  4. ini kk alamat emailnya yunky.keyenz@yahoo.co.id
    Thanks ya kk

  5. nuhun kang…

    • ya sama – sama semoga bisa membantu

      • kang yuda,aku boleh minta file project’Y gk?

        ni email saya : sambel.terasi@rocketmail.com

        Terima kasih sebelumya….

        Salam hangat Sambel Terasi (Sama-Sama Belajar, Terampil dan Berkreasi)..

      • boleh saja silahkan di cek yaa emailnya

  6. bagus banget mas, sama persis seperti yang di buku grafika komputerku terbitan graha ilmu. kalau bisa bentuk file ya mas dengan contoh-contoh programnya. biar enak langsung di download. ok.

    • @angga
      iya bro emng dari ilmu grafika source codenya… untuk file bisa cantumkan email nanti saya kirim

  7. sipp… deh.. pembahasannya.
    walaupun sy ngliatna br skrg,hehehe…
    hmmm… boleh minta juga file project na gak???
    tengkyu2….

    ini imel saya: marsaroha_2@yahoo.com

  8. pengen sourcenya dong

    denisin22@gmail.com

  9. Bang, boleh mnta project nya ngga ??

    nie email Qw –> antz_nez@yahoo.com

    thx ya bang sebelumnya

  10. bang boleh mnta file projectnya ngga??

    Thx Sebelumnya…

    alamat email gw : fuijiin@yahoo.com

  11. aku suka delphi…hahahahah

  12. artikelnya bagus sekali.

    boleh minta contoh2 program opengl pake delphi ga?
    saya bru blajar opengl.
    kirim ke nimankun[at]gmail[dot]com
    terimakasih

  13. Tolong dnk bos minta projectnya ke email ane: foktarista@yahoo.co.id.. Soalnya dah nyoba gk bisa2..

  14. gan boleh minta programnya gx bwat referensi, ane ada tugas grafika gan di suruh bikin opengl…please minta ya gan, ni alamat email ane: rullyduill@yahoo.co.id

  15. thank you mas, informasinya jelas gk berbelit belit and mudah dimengerti

  16. mas,,, programnya bagus banget..
    boleh mnta projectnya gak?
    email : fairy_astrid@ymail.com

Tinggalkan Balasan

Isikan data di bawah atau klik salah satu ikon untuk log in:

Logo WordPress.com

You are commenting using your WordPress.com account. Logout / Ubah )

Gambar Twitter

You are commenting using your Twitter account. Logout / Ubah )

Foto Facebook

You are commenting using your Facebook account. Logout / Ubah )

Foto Google+

You are commenting using your Google+ account. Logout / Ubah )

Connecting to %s

%d blogger menyukai ini: