Minggu, 01 November 2009

open GL

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:
o
+ 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 :-)

Tidak ada komentar:

Posting Komentar