2011-12-26 65 views
1

我想要一個jpg圖像映射到我的對象文件,但我glmDraw功能在我的程序崩潰到紋理映射到OBJ:OpenGL的 - 如何使用MTL文件中使用GLM或任何其他裝載機

glmDraw(pmodel, GLM_SMOOTH | GLM_TEXTURE | GLM_MATERIAL); 

在這一行正是:

if (mode & GLM_TEXTURE) 
       glTexCoord2fv(&model->texcoords[2 * triangle->tindices[0]]); 

我不知道爲什麼,我所知道的是,它與我的質地做的。它在這條線的第一次執行時崩潰,我的意思是while(group)循環的第一次迭代。 這是我的MTL文件看起來像:

newmtl mymtl 
    Ns ----- 
    Ni ----- 
    d ----- 
    Tr ----- 
    Tf ----- ----- ----- 
    illum ----- 
    Ka ----- ----- ----- 
    Kd ----- ----- ----- 
    Ks ----- ----- ----- 
    Ke ----- ----- ----- 
    map_Ka image.jpg 
    map_Kd image.jpg 

//**Note: ----- represents a number 

這裏是glmDraw功能作爲一個整體,如果有人想看看吧:

GLvoid 
glmDraw(GLMmodel* model, GLuint mode) 
{ 
    static GLuint i; 
    static GLMgroup* group; 
    static GLMtriangle* triangle; 
    static GLMmaterial* material; 

    assert(model); 
    assert(model->vertices); 

    /* do a bit of warning */ 
    if (mode & GLM_FLAT && !model->facetnorms) { 
     printf("glmDraw() warning: flat render mode requested " 
      "with no facet normals defined.\n"); 
     mode &= ~GLM_FLAT; 
    } 
    if (mode & GLM_SMOOTH && !model->normals) { 
     printf("glmDraw() warning: smooth render mode requested " 
      "with no normals defined.\n"); 
     mode &= ~GLM_SMOOTH; 
    } 
    if (mode & GLM_TEXTURE && !model->texcoords) { 
     printf("glmDraw() warning: texture render mode requested " 
      "with no texture coordinates defined.\n"); 
     mode &= ~GLM_TEXTURE; 
    } 
    if (mode & GLM_FLAT && mode & GLM_SMOOTH) { 
     printf("glmDraw() warning: flat render mode requested " 
      "and smooth render mode requested (using smooth).\n"); 
     mode &= ~GLM_FLAT; 
    } 
    if (mode & GLM_COLOR && !model->materials) { 
     printf("glmDraw() warning: color render mode requested " 
      "with no materials defined.\n"); 
     mode &= ~GLM_COLOR; 
    } 
    if (mode & GLM_MATERIAL && !model->materials) { 
     printf("glmDraw() warning: material render mode requested " 
      "with no materials defined.\n"); 
     mode &= ~GLM_MATERIAL; 
    } 
    if (mode & GLM_COLOR && mode & GLM_MATERIAL) { 
     printf("glmDraw() warning: color and material render mode requested " 
      "using only material mode.\n"); 
     mode &= ~GLM_COLOR; 
    } 
    if (mode & GLM_COLOR) 
     glEnable(GL_COLOR_MATERIAL); 
    else if (mode & GLM_MATERIAL) 
     glDisable(GL_COLOR_MATERIAL); 

    /* perhaps this loop should be unrolled into material, color, flat, 
     smooth, etc. loops? since most cpu's have good branch prediction 
     schemes (and these branches will always go one way), probably 
     wouldn't gain too much? */ 

    group = model->groups; 
    while (group) { 
     if (mode & GLM_MATERIAL) { 
      material = &model->materials[group->material]; 
      glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT, material->ambient); 
      glMaterialfv(GL_FRONT_AND_BACK, GL_DIFFUSE, material->diffuse); 
      glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, material->specular); 
      glMaterialf(GL_FRONT_AND_BACK, GL_SHININESS, material->shininess); 
     } 

     if (mode & GLM_COLOR) { 
      glColor3fv(material->diffuse); 
     } 

     glBegin(GL_TRIANGLES); 
     for (i = 0; i < group->numtriangles; i++) { 
      triangle = &T(group->triangles[i]); 

      if (mode & GLM_FLAT) 
       glNormal3fv(&model->facetnorms[3 * triangle->findex]); 

      if (mode & GLM_SMOOTH) 
       glNormal3fv(&model->normals[3 * triangle->nindices[0]]); 
      if (mode & GLM_TEXTURE) 
       glTexCoord2fv(&model->texcoords[2 * triangle->tindices[0]]); 
      glVertex3fv(&model->vertices[3 * triangle->vindices[0]]); 

      if (mode & GLM_SMOOTH) 
       glNormal3fv(&model->normals[3 * triangle->nindices[1]]); 
      if (mode & GLM_TEXTURE) 
       glTexCoord2fv(&model->texcoords[2 * triangle->tindices[1]]); 
      glVertex3fv(&model->vertices[3 * triangle->vindices[1]]); 

      if (mode & GLM_SMOOTH) 
       glNormal3fv(&model->normals[3 * triangle->nindices[2]]); 
      if (mode & GLM_TEXTURE) 
       glTexCoord2fv(&model->texcoords[2 * triangle->tindices[2]]); 
      glVertex3fv(&model->vertices[3 * triangle->vindices[2]]); 

     } 
     glEnd(); 

     group = group->next; 
    } 
} 

當我調試我得到的錯誤是:

Unhandled exception at 0x695d1789 in programname.exe: 0xC0000005: Access violation reading location 0x75d46ea8. 

另外,如果我改變:

glmDraw(pmodel, GLM_SMOOTH | GLM_TEXTURE | GLM_MATERIAL); 

到:

glmDraw(pmodel, GLM_SMOOTH | GLM_MATERIAL); 

它的工作原理,但當然,沒有我的紋理。

GLM是否支持這種具有紋理貼圖的材質?如果我使用.jpg文件進行紋理映射,這樣可以嗎?

如果不是,那麼你能告訴我怎麼做嗎?或者GLM支持哪種類型的圖像?或者如果有任何其他的支持圖像的加載器?

非常感謝您的幫助。 -W

+0

您的模型是否包含紋理座標?看起來不像。 – 2011-12-26 13:14:10

+0

@MatiasValdenegro好吧,它的確如此。我沒有發佈我的目標文件,你怎麼知道? – Waleed 2011-12-26 17:11:02

+0

由於它在紋理座標上崩潰,因此認爲它們不屬於模型的一部分是明智的,因此指針爲NULL。 – 2011-12-26 17:18:11

回答

1

GLM不支持作爲圖像的紋理。 GLM有一個增強版本,但它不是很常見,即使它與平臺無關,但它需要很多工作才能在Windows上正常工作,因爲它最初是爲Linux設計的。

這裏是link

這是Nate Robin的原始GLM,並在鏈接中提到了一些tweeks。我認爲它不那麼容易理解,但它有更多的功能和警告等。

相關問題