الدرس السابق OpenGL .. الدرس رقم 4 تعريف بالدرس .. نتعلم في هذا الدرس الإكساء .. بماذا يفيدنا الإكساء ؟ .. تخيل بانك تريد عمل قذيفة لتتحرك أمامك على الشاشة .. لو أردنا عمل القذيفة بالتقنيات التي درسناها سابقا أي بالمضلعات فسوف نحصل على قذيفة .. ولكن لن عليها بشكل احترافي .. فسوف تكون القذيفة عبارة عن مجموعة من المربعات والمثلثات تغطيها بعض الألوان وتطير في عرض الشاشة .. هل هذا مانريده حقا ؟ بالطبع لا وهنا نحتاج الى الإكساء .. تخيل بأنه لدينا صورة حقيقة لقذيفة او صورة مصممة بالفوتوشوب أو الماكس لقذيفة .. نستطيع اضافتها إلى قذيفتنا التي قمنا بتصميمها حتى تعطينا شكل خارجي حقيقي للقذيفة هذا من جهة .. من جهة أخرى الإكساء يساعد على جعل التطبيق يعمل بسرعة .. فالقذيفة اذا كانت بدون اكساء تكون عبارة عن المئات من المضلعات بينما بالاكساء تكون عبارة عن قطعة واحدة وهي الصورة التي قمنا باستخدامها لإكساء القذيفة .. في درسنا هذا سوف نقوم باستخدام الاكساء على مربع .. بسم الله نبدأ الدرس ..
#include <windows.h>#include <stdio.h>#include <gl\gl.h>#include <gl\glu.h> #include <gl\glaux.h>HDC hDC=NULL;HGLRC hRC=NULL;HWND hWnd=NULL; HINSTANCE hInstance;bool keys[256];bool active=TRUE;bool fullscreen=TRUE;GLfloat xrot; GLfloat yrot;GLfloat zrot;GLuint texture[1];LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
AUX_RGBImageRec *LoadBMP(char *Filename){ FILE *File=NULL;
if (!Filename){ return NULL; }
File=fopen(Filename,"r");
if (File){ fclose(File);return auxDIBImageLoad(Filename); }
return NULL;}
int LoadGLTextures(){
int Status=FALSE;
AUX_RGBImageRec *TextureImage[1];
memset(TextureImage,0,sizeof(void *)*1);
if (TextureImage[0]=LoadBMP("Data/NeHe.bmp")) { Status=TRUE;
glGenTextures(1, &texture[0]);glBindTexture(GL_TEXTURE_2D, texture[0]);
glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); }
if (TextureImage[0]){ if (TextureImage[0]->data){ free(TextureImage[0]->data);} free(TextureImage[0]);}
return Status;}
int DrawGLScene(GLvoid) // Here's Where We Do All The Drawing{ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // Clear Screen And Depth Buffer glLoadIdentity(); // Reset The Current Matrix glTranslatef(0.0f,0.0f,-5.0f); glRotatef(xrot,1.0f,0.0f,0.0f); // Rotate On The X Axis glRotatef(yrot,0.0f,1.0f,0.0f); // Rotate On The Y Axis glRotatef(zrot,0.0f,0.0f,1.0f); // Rotate On The Z AxisglBindTexture(GL_TEXTURE_2D, texture[0]); // Select Our TextureglBegin(GL_QUADS); // Front Face glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); // Bottom Left Of The Texture and Quad glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); // Bottom Right Of The Texture and Quad glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); // Top Right Of The Texture and Quad glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); // Top Left Of The Texture and Quad // Back Face glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); // Bottom Right Of The Texture and Quad glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); // Top Right Of The Texture and Quad glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); // Top Left Of The Texture and Quad glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); // Bottom Left Of The Texture and Quad // Top Face glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); // Top Left Of The Texture and Quad glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, 1.0f, 1.0f); // Bottom Left Of The Texture and Quad glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, 1.0f, 1.0f); // Bottom Right Of The Texture and Quad glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); // Top Right Of The Texture and Quad // Bottom Face glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, -1.0f, -1.0f); // Top Right Of The Texture and Quad glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, -1.0f, -1.0f); // Top Left Of The Texture and Quad glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); // Bottom Left Of The Texture and Quad glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); // Bottom Right Of The Texture and Quad // Right face glTexCoord2f(1.0f, 0.0f); glVertex3f( 1.0f, -1.0f, -1.0f); // Bottom Right Of The Texture and Quad glTexCoord2f(1.0f, 1.0f); glVertex3f( 1.0f, 1.0f, -1.0f); // Top Right Of The Texture and Quad glTexCoord2f(0.0f, 1.0f); glVertex3f( 1.0f, 1.0f, 1.0f); // Top Left Of The Texture and Quad glTexCoord2f(0.0f, 0.0f); glVertex3f( 1.0f, -1.0f, 1.0f); // Bottom Left Of The Texture and Quad // Left Face glTexCoord2f(0.0f, 0.0f); glVertex3f(-1.0f, -1.0f, -1.0f); // Bottom Left Of The Texture and Quad glTexCoord2f(1.0f, 0.0f); glVertex3f(-1.0f, -1.0f, 1.0f); // Bottom Right Of The Texture and Quad glTexCoord2f(1.0f, 1.0f); glVertex3f(-1.0f, 1.0f, 1.0f); // Top Right Of The Texture and Quad glTexCoord2f(0.0f, 1.0f); glVertex3f(-1.0f, 1.0f, -1.0f); // Top Left Of The Texture and Quad glEnd();