السلام عليكم .. هذه سلسلة من التطبيقات التي سنعملها معا .. لمحاولة فهم آلية الاكساء .. في opengl . ماهو الاكساء .. وضع صورة على شكل ما .. بابسط تعبير . شاهد الصورة ( للاعضاء ) , أتمنى ان لاتنتقل من خطوة الا وانت فاهمها .. لاني وضعت عدة تطبيقات متتابعة ..لاتترك شيء الا وانت فاهمه .. لان الدروس متصلة .. في OpenGL يمر الاكساء في ثلاث مراحل رئيسية : 1- تقوم بتحميل الصورة التي تريد . قد يتطلب الامر سطر واحد اذا كنت تستخدم دوال جاهزة .. وقد يتطلب الامر منك 50 سطر اذا لم تستخدم دوال جاهزة . في opengl يوجد دالة مساعدة لتحميل ملفات bmp . وبالتالي تحمل الصورة في اقل من سطرين . لكن هناك بعض الانساق مثل tga و pcx و jpg .. التي تتميز اما بوجود قناة الفا .. او بصغر الحجم ...... الخ .. وبالتالي يتطلب الامر قراءة تلك الصور من الصفر او تستخدم مكتبة مساعدة. 2- بعد ان حملت الصورة ... تخبر opengl بانك تريد ان تضع هذه الصورة كاكساء .. وايضا تضع فلاتر الاكساء التي تريد .. هل تريد الاكساء واضح وخالي من التشويش .. او تريد اداء اسرع وبالتالي اكساء اقل دقة .. وايضا تخبر Opengl بعرض وطول الصورة التي تريدها كاكساء . . الخ . 3- تعين الاكساء على الشكل الذي تريده .. وذلك بان تضع الاحداثيات المناسبة . دعنا نطبق ... انسخ هذا الكود وألصقه :
/*1*/ GLuint ID_1;/*2*/ void LoadTexture(char *FileName , GLuint *ID)/*3*/ {/*4*/ FILE *File=NULL; /*5*/ File=fopen(FileName,"r"); /*6*/ if (File) /*7*/ {/*8*/ fclose(File); /*9*/ }/*10*/ AUX_RGBImageRec *TextureImage=new(AUX_RGBImageRec); /*11*/ memset(TextureImage,0,sizeof(void *)*1); /*12*/ TextureImage = auxDIBImageLoad(FileName);/*13*/ glGenTextures(1, ID); /*14*/ glBindTexture(GL_TEXTURE_2D,*ID);/*15*/ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);/*16*/ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);/*17*/ glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage->sizeX, TextureImage->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage->data);/*18*/ free(TextureImage->data); /*19*/ free(TextureImage); /*20*/ }
typedef struct _AUX_RGBImageRec { GLint sizeX, sizeY; unsigned char *data;} AUX_RGBImageRec;
/*21*/ glGenTextures(1, ID); /*22*/ glBindTexture(GL_TEXTURE_2D, *ID);/*23*/ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);/*24*/ glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);/*25*/ glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage->sizeX, TextureImage->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage->data);/*26*/ free(TextureImage->data); /*27*/ free(TextureImage); /*28*/ }
glGenTextures(1, ID);glGenTextures(1, ID2);
glBindTexture(GL_TEXTURE_2D, *ID);...
glBindTexture(GL_TEXTURE_2D, *ID2);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);
free(TextureImage->data); free(TextureImage);
glTexImage2D (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels);
glEnable(GL_TEXTURE_2D);LoadTexture("image.bmp" ,&D_1)
/*1*/ void Render()/*2*/ {/*3*/ glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );/*4*/ glLoadIdentity(); /*5*/ glTranslatef(-1.0f,0, -3.0f );/*6*/ glBindTexture(GL_TEXTURE_2D, ID_1);/*7*/ glBegin(GL_QUADS);/////*8*/ glTexCoord2f(0.0f, 0.0f);/*9*/ glVertex2f(-0.5f, -0.5f );/*10*/ glTexCoord2f(1.0f, 0.0f);/*11*/ glVertex2f( 0.5f, -0.5f );/*12*/ glTexCoord2f(1.0f, 1.0f);/*13*/ glVertex2f( 0.5f, 0.5f );/*14*/ glTexCoord2f(0.0f, 1.0f);/*15*/ glVertex2f(-0.5f, 0.5f );/*16*/ glEnd();/*17*/ }