Sabtu, 07 November 2009

TUGAS PENGANTAR GRAFIK & OLAH CITRA

Dibawah ini adlah program pembuatan garis pada open gl menggunakan program Delphi untuk menjalankanya tinggal masukan program dibawah ini maka akan keluar out put yang kita ingin kan:

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 anda compile setelah tidak terdapat error baru bisa anda run

Keterangan Coding:

1. 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.

2. 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

3. Perintah GlClearColor mendefinisikan warna (RGBA) yang akan digunakan

4. 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.

Mungkin masih ada beberapa kesalahan tolong bisa dimengertikarna saya sendiri masih dalam taham pembelajarna terima kasih….

Tidak ada komentar:

Posting Komentar