» آموزش نگاشت بافت های تصویر دوبعدی در دلفی

مهرگان
 
 
 

آموزش نگاشت بافت های تصویر دوبعدی در دلفی

3 مرداد 1391

آموزش نگاشت بافت های تصویر دوبعدی در دلفی

به نام خدا

1- نوع داده های زیر را در یونیت فرم مورد نظرتان تعریف کنید.

var

texture: array [0..2] of GLuint; // Storage for 3 textures

const

z: GLfloat = -5.0; // Depth Into The Screen

LightAmbient: array [0..3] of GLfloat = ( 0.5, 0.5, 0.5, 1.0 );

LightDiffuse: array [0..3] of GLfloat = ( 1.0, 1.0, 1.0, 1.0 );

LightPosition: array [0..3] of GLfloat = ( 0.0, 0.0, 2.0, 1.0 );


2- دو پروسیجر زیر را به یونیت برنامه اضافه کنید.

procedure glGenTextures(n: GLsizei; var textures: GLuint); stdcall; external opengl32;

procedure glBindTexture(target: GLenum; texture: GLuint); stdcall; external opengl32;


3- پروسیجری به نام DrawScene ایجاد کرده، و کدهای زیر را در آن کپی کنید. سپس پروسیجر را در رویداد FormPaint فراخوانی کنید.

LoadGLTextures(form1.Image1); // Load The Texture(s)

glEnable(GL_TEXTURE_2D); // Enable Texture Mapping

glBindTexture(GL_TEXTURE_1D, texture[1]);

رسم چند ضلعی

LoadGLTextures(form1.Image2); // Load The Texture(s)

glEnable(GL_TEXTURE_2D); // Enable Texture Mapping

glBindTexture(GL_TEXTURE_1D, texture[1]);

رسم چند ضلعی

//------------------------------------

4- نکات بسیار مهم:

قبل از معرفی هر راس از چند ضلعی، ابتدا باید دستور تطبیق آن نقطه با نقطه ای از تصویر نگاشت را صادر کنید

مثال:

glBegin (GL_QUADS);

glTexCoord2f(1, 0); glVertex3f (x0,y0,z0);

glTexCoord2f(1, 1); glVertex3f (x1,y1,z1);

glTexCoord2f(0, 1); glVertex3f (x2,y2,z2);

glTexCoord2f(0, 0); glVertex3f (x3,y3,z3);

glEnd();


اگر اعداد ورودی دستورات تطبیق بالا را باینری بخوانیم، برابر با 2,3,1,0 خواهد شد.

اگر بخواهید عکس را بصورت وارون یا انعکاسی نگاشت کنید به توضیحات زیر توجه کنید.

دوران 90:

برای دوران 90 درجه در جهت گردش عقربه های ساعت، باید اولین عدد سمت راست را به ابتدای سمت چپ انتقال دهید

دوران منفی 90:

برای دوران 90 درجه در جهت عکس گردش عقربه های ساعت، باید اولین عدد سمت چپ را به انتهای سمت راست انتقال دهید

انعکاس:

برای انجام عمل انعکاس، باید عدد را برعکس کنید

مثلا 1,2,3,4 را به 4,3,2,1 تبدیل کنید

برای درک بهتر، چند نمونه از ورودی های دستورات تطبیق برای انجام تطبیقات انعکاسی یا دورانی مربوط به مثال بالا آمده است؛

2 ,3 ,1 ,0 عکس عادی

0 ,1 ,3 ,2 انعکاس

3 ,1 ,0 ,2 دوران منفی 90

0 ,2 ,3 ,1 دوران 90

2 ,0 ,1 ,3 انعکاس +دوران 90

1 ,3 ,2 ,0 انعکاس +دوران منفی 90


5- برای غیر فعال کردن حالت نگاشت از تابع زیر استفاده کنید؛

gldisable(GL_TEXTURE_2D);

6- اگر میخواهید یک نگاشت رنگی داشته باشید، یعنی تصویر نگاشت شده لایه ای از رنگ دلخواه شما را به خود بگیرد، باید از دستور زیر استفاده کنید

glColor3f(R,G,B);

وگرنه تمام ورودی های دستور بالا را برابر 1 قرار دهید

7- پروسیجرهای زیر را در یونیت برنامه کپی کنید؛

procedure getRGB(num : LongInt; var r , g , b : Integer);

begin

// extract R,G,B from a long format RBG

b := Trunc((num And 16711680)/ 65536) ;

g := Trunc((num And 65280)/ 256 );

r := num And 255 ;

End;

//--------------------------------------------------------------------

procedure LoadGLTextures (image1 : TImage ); // Load Bitmaps And Convert To Textures

var

x , y : LongInt;

c , bitmapWidth, bitmapHeight : LongInt ;

Red , Green , Blue : Integer ;

texture1: array[0..63,0..63,0..2] of GLubyte;

begin

// Load Texture

image1.AutoSize := True ;

bitmapHeight := image1.Height ; // Set the array

bitmapWidth := image1.Width ; // size.

For x := 0 To bitmapWidth-1 do

For y := 0 To bitmapHeight-1 do

begin

c := ColorToRGB(image1.Canvas.Pixels[x,y]);

getRGB(c,Red,Green,Blue);

texture1[ x, bitmapHeight - y - 1,0] := Red ; //GetRed

texture1[ x, bitmapHeight - y - 1,1] := Green ; //GetGreen

texture1[ x, bitmapHeight - y - 1,2] := Blue ; //GetBlue

end;

image1.Visible:=false;

if not Assigned( @texture1 ) then Halt(1);

// Create Nearest Filtered Texture

glGenTextures(3, texture[0]);

glBindTexture(GL_TEXTURE_2D, texture[0]);

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);

glTexImage2D(GL_TEXTURE_2D, 0, 3, bitmapWidth, bitmapHeight,

0, GL_RGB, GL_UNSIGNED_BYTE, @texture1);

// Create Linear Filtered Texture

glBindTexture(GL_TEXTURE_2D, texture[1]);

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);

glTexImage2D(GL_TEXTURE_2D, 0, 3, bitmapWidth, bitmapHeight ,

0, GL_RGB, GL_UNSIGNED_BYTE, @texture1);

// Create MipMapped Texture

glBindTexture(GL_TEXTURE_2D, texture[2]);

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);

glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,

GL_LINEAR_MIPMAP_NEAREST);

gluBuild2DMipmaps(GL_TEXTURE_2D, 3, bitmapWidth, bitmapHeight,

GL_RGB, GL_UNSIGNED_BYTE, @texture1);

end;

موفق باشید

---

 
برای مشاهده بهتر سایت از مرورگر فایرفاکس ، اُپرا و یا گوگل کروم استفاده نمایید