آموزش نگاشت بافت های تصویر دوبعدی در دلفی
به نام خدا
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;
موفق باشید