seyedVB
سه شنبه 10 فروردین 1395, 18:26 عصر
معمولا ساده ترین راه لود تکسچر بر روی 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 پیاده سازی شده اند.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.