معمولا ساده ترین راه لود تکسچر بر روی plane یا یک صفحه مربعی می باشد.
برای مثال تابع زیر را در نظر بگیرید :
GLuint LoadTexture()
{
GLuint texID;
AUX_RGBImageRec * image;
image = auxDIBImageLoad(L"crate.bmp");
glGenTextures(1, &texID);
glBindTexture(GL_TEXTURE_2D, texID);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_LINEAR);
gluBuild2DMipmaps(GL_TEXTURE_2D, 3, image->sizeX, image->sizeY, GL_RGB, GL_UNSIGNED_BYTE, image->data);
return texID;
}
تابع فوق یک عکس رو لود می کنه و بر میگردونه ، حالا توی تابع آپدیت باید یک مربع یا مکعب رسم کنید و تکسچر رو روش بندازین ، در خط ابتدایی تابع زیر ، تکسچر را توسط تابع قبلی لود می کنیم و بعد از آن روی مدل می اندازیم : (مدل در کد زیر مکعب است )
void update()
{
tex = LoadTexture();
float theta = GetTickCount() / 10.0f;
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
glRotatef(theta, 1, 1, 0);
glBindTexture(GL_TEXTURE_2D, tex);
glColor3f(1.0f, 0.0f, 0.0f);
glBegin(GL_POLYGON);
glNormal3f(0, 0, 1);
glTexCoord2f(0, 0);
glVertex3f(-1, -1, 1.0f);
glNormal3f(0, 0, 1);
glTexCoord2f(1, 0);
glVertex3f(1, -1, 1.0f);
glNormal3f(0, 0, 1);
glTexCoord2f(1, 1);
glVertex3f(1, 1, 1.0f);
glNormal3f(0, 0, 1);
glTexCoord2f(0, 1);
glVertex3f(-1, 1, 1.0f);
glEnd();
glBegin(GL_POLYGON);
glNormal3f(0, 0, -1);
glTexCoord2f(0, 0);
glVertex3f(-1, -1, -1.0f);
glNormal3f(0, 0, -1);
glTexCoord2f(1, 0);
glVertex3f(1, -1, -1.0f);
glNormal3f(0, 0, -1);
glTexCoord2f(1, 1);
glVertex3f(1, 1, -1.0f);
glNormal3f(0, 0, -1);
glTexCoord2f(0, 1);
glVertex3f(-1, 1, -1.0f);
glEnd();
glBegin(GL_POLYGON);
glNormal3f(-1, 0, 0);
glTexCoord2f(0, 0);
glVertex3f(-1, -1, -1.0f);
glNormal3f(-1, 0, 0);
glTexCoord2f(1, 0);
glVertex3f(-1, -1, 1.0f);
glNormal3f(-1, 0, 0);
glTexCoord2f(1, 1);
glVertex3f(-1, 1, 1.0f);
glNormal3f(-1, 0, 0);
glTexCoord2f(0, 1);
glVertex3f(-1, 1, -1.0f);
glEnd();
glBegin(GL_POLYGON);
glNormal3f(1, 0, 0);
glTexCoord2f(0, 0);
glVertex3f(1, -1, -1.0f);
glNormal3f(1, 0, 0);
glTexCoord2f(1, 0);
glVertex3f(1, -1, 1.0f);
glNormal3f(1, 0, 0);
glTexCoord2f(1, 1);
glVertex3f(1, 1, 1.0f);
glNormal3f(1, 0, 0);
glTexCoord2f(0, 1);
glVertex3f(1, 1, -1.0f);
glEnd();
glBegin(GL_POLYGON);
glNormal3f(0, 1, 0);
glTexCoord2f(0, 0);
glVertex3f(-1, 1, 1.0f);
glNormal3f(0, 1, 0);
glTexCoord2f(1, 0);
glVertex3f(-1, 1, -1.0f);
glNormal3f(0, 1, 0);
glTexCoord2f(1, 1);
glVertex3f(1, 1, -1.0f);
glNormal3f(0, 1, 0);
glTexCoord2f(0, 1);
glVertex3f(1, 1, 1.0f);
glEnd();
glBegin(GL_POLYGON);
glNormal3f(0, -1, 0);
glTexCoord2f(0, 0);
glVertex3f(-1, -1, 1.0f);
glNormal3f(0, -1, 0);
glTexCoord2f(1, 0);
glVertex3f(-1, -1, -1.0f);
glNormal3f(0, -1, 0);
glTexCoord2f(1, 1);
glVertex3f(1, -1, -1.0f);
glNormal3f(0, -1, 0);
glTexCoord2f(0, 1);
glVertex3f(1, -1, 1.0f);
glEnd();
glutSwapBuffers();
}
تابع init هم برای تنظیم کردن نور و ماتریال به صورت زیر است :
void init(void)
{
glClearColor(1.0, 1.0, 1.0, 1.0);
GLfloat light_position[] = { 0.0f, 0.0f, 4.0f, 0.0f };
GLfloat light_diffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };
GLfloat material_diffuse[] = { 1.0f, 1.0f, 1.0f, 1.0f };
GLfloat material_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
GLfloat material_shininess[] = { 15.0f };
glEnable(GL_DEPTH_TEST);
glShadeModel(GL_SMOOTH);
glLightfv(GL_LIGHT0, GL_POSITION, light_position);
glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, material_diffuse);
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, material_specular);
glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, material_shininess);
glEnable(GL_LIGHTING);
glEnable(GL_LIGHT0);
glEnable(GL_DEPTH_TEST);
glEnable(GL_TEXTURE_2D);
glEnable(GL_DEPTH_TEST);
glShadeModel(GL_SMOOTH);
}
و در آخر هم به صورت زیر تابع اصلی را می نویسیم :
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
glutInitWindowSize(500, 500);
glutInitWindowPosition(100, 100);
glutCreateWindow(argv[0]);
init();
//glutMouseFunc(picking);
glutReshapeFunc(reshape);
glutDisplayFunc(update);
glutIdleFunc(update);
//glutKeyboardFunc(keyInput);
glutKeyboardFunc(keyInput);
//glutSpecialFunc(specialKeyInput);
glutMainLoop();
return 0;
}
توابع فوق با کتابخانه glut پیاده سازی شده اند.