1. 程式人生 > >孫其功陪你學之——OpenGL載入OBJ模型檔案並進行紋理修飾

孫其功陪你學之——OpenGL載入OBJ模型檔案並進行紋理修飾

本人在學習opengl做專案時,需要設計三維人臉模型。於是尋找多種方案。求得用opengl讀取OBJ模型檔案,並進行紋理修飾這一解決方案。在使用中用到了glm庫。以下是我對glm.c庫的兩篇分析。http://blog.csdn.net/a350203223/article/details/10093135

以下是進行解決讀取OBJ檔案並進行紋理修飾的主要程式。希望能給大家有所幫助,如果分析中有不恰當的地方,望批評指正。建議花點時間自己研究,全部程式不會給出。執行結果如下:

void RenderScene(void)
 {
 static GLfloat dark[4] = { 0.0, 0.0, 0.0, 1.0 };
    static GLfloat normal[4] = { 0.5, 0.5, 0.5, 1.0 };
    static GLfloat bright[4] = { 1.0, 1.0, 1.0, 1.0 };
    static GLfloat pos[4] = { -0.2588, 0.0, 0.9659, 0.0 };

    /* Clear the window */
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    /* Setup for drawing... */
    glDepthFunc(GL_LEQUAL);
    glEnable(GL_DEPTH_TEST);
    glEnable(GL_LIGHTING);
    glEnable(GL_LIGHT0);
   
 if (!pmodel) {
        pmodel = glmReadOBJ("obj/劉德華.obj");//讀取OBJ檔案  
        if (!pmodel) exit(0);
        glmUnitize(pmodel);//單位化模型model並返回縮放比例因子,單位化就是把模型通過平移和縮放變換限制到3維座標系中點為中心的一個單位正方體區域內
        glmFacetNormals(pmodel);//計算模型面的法向(假定多邊形頂點順序為逆時針)
        glmVertexNormals(pmodel, 90.0);//計算模型的平滑頂點法向,angle引數為平滑交叉的最大角度(角度制)
    }

 TexBits = LoadDIBitmap("obj/劉德華.bmp", &TexInfo);


 glPushMatrix();
 glTranslatef(0, 0, -3);
 glRotatef(xRot, 1.0f, 0.0f, 0.0f);
 glRotatef(yRot, 0.0f, 1.0f, 0.0f);

 glDisable(GL_BLEND);
    glDisable(GL_TEXTURE_2D);

    glLightModelfv(GL_LIGHT_MODEL_AMBIENT, dark);
    glLightfv(GL_LIGHT0, GL_DIFFUSE, dark);
    glLightfv(GL_LIGHT0, GL_SPECULAR, bright);
    glLightfv(GL_LIGHT0, GL_POSITION, pos);
    glMaterialfv(GL_FRONT, GL_AMBIENT, dark);
    glMaterialfv(GL_FRONT, GL_DIFFUSE, dark);
    glMaterialfv(GL_FRONT, GL_SPECULAR, bright);
    glMateriali(GL_FRONT, GL_SHININESS, 128);

 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    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, TexInfo->bmiHeader.biWidth,
                 TexInfo->bmiHeader.biHeight, 0, GL_BGR_EXT,
   GL_UNSIGNED_BYTE, TexBits);

    glmDraw(pmodel,GLM_SMOOTH |GLM_TEXTURE | GLM_MATERIAL);//先畫一個實體——無紋理
   
 glBlendFunc(GL_ONE, GL_ONE);
    glEnable(GL_BLEND);
    glEnable(GL_TEXTURE_2D);
 glLightModelfv(GL_LIGHT_MODEL_AMBIENT, normal);

    glLightfv(GL_LIGHT0, GL_AMBIENT, normal);
    glLightfv(GL_LIGHT0, GL_DIFFUSE, normal);
    glLightfv(GL_LIGHT0, GL_SPECULAR, dark);
    glMaterialfv(GL_FRONT, GL_AMBIENT, normal);
    glMaterialfv(GL_FRONT, GL_DIFFUSE, normal);
    glMaterialfv(GL_FRONT, GL_SPECULAR, dark);
    glMateriali(GL_FRONT, GL_SHININESS, 0);


 glmDraw(pmodel,GLM_SMOOTH |GLM_TEXTURE | GLM_MATERIAL);//再畫一個經紋理修飾和光照處理後的人物
 glPopMatrix();

    glutSwapBuffers();
 }