OpenGL-如何使用mtl文件使用GLM或任何其他加载程序将纹理映射到obj

OpenGL-如何使用mtl文件使用GLM或任何其他加载程序将纹理映射到obj,opengl,textures,Opengl,Textures,我试图将jpg图像映射到目标文件,但我的程序在glmDraw函数中崩溃: glmDraw(pmodel, GLM_SMOOTH | GLM_TEXTURE | GLM_MATERIAL ); 在这一行: if (mode & GLM_TEXTURE) glTexCoord2fv(&model->texcoords[2 * triangle->tindices[0]]); 我不知道为什么,我只知道这和我的质地有关。它在这一行的第一次执

我试图将jpg图像映射到目标文件,但我的程序在glmDraw函数中崩溃:

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;
    }
}
此外,如果我改变:

glmDraw(pmodel, GLM_SMOOTH | GLM_TEXTURE | GLM_MATERIAL );
致:

它可以工作,但当然,没有我的纹理

GLM支持这种具有纹理贴图的材质吗?如果我使用.jpg文件进行纹理贴图,可以吗

如果没有,你能告诉我怎么做吗?或者GLM支持什么类型的图像?或者是否有其他支持图像的加载程序

非常感谢你的帮助。
-GLM不支持图像纹理。GLM有一个增强版可以做到这一点,但它不是很常见,即使它是独立于平台的,但它需要大量的工作才能在windows上正常工作,因为它最初是为Linux设计的

这是你的电话号码


这是Nate Robin的原始GLM,链接中也提到了一些Tweek。我认为它更不容易理解,但它有更多的功能和警告等。

GLM不支持纹理是图像。GLM有一个增强版可以做到这一点,但它不是很常见,即使它是独立于平台的,但它需要大量的工作才能在windows上正常工作,因为它最初是为Linux设计的

这是你的电话号码


这是Nate Robin的原始GLM,链接中也提到了一些Tweek。我认为它更不容易理解,但是它有更多的功能和警告等。< /P>你的模型包含纹理坐标吗?看起来没有。@MatiasValdenegro嗯,是的。我没有发布我的对象文件,你怎么知道?因为它在纹理坐标上崩溃,所以认为它们不是模型的一部分是明智的,所以指针是空的。@MatiasValdenegro现在我正在检查我的对象文件,以确保我有它们,并且我看到很多“vt”。我还需要什么,是的,指针是空的。对不起,我对这方面还不太熟悉。你的模型包含纹理坐标吗?看起来没有。@MatiasValdenegro嗯,是的。我没有发布我的对象文件,你怎么知道?因为它在纹理坐标上崩溃,所以认为它们不是模型的一部分是明智的,所以指针是空的。@MatiasValdenegro现在我正在检查我的对象文件,以确保我有它们,并且我看到很多“vt”。我还需要什么,是的,指针是空的。对不起,这方面我还不太熟悉。
glmDraw(pmodel, GLM_SMOOTH | GLM_TEXTURE | GLM_MATERIAL );
glmDraw(pmodel, GLM_SMOOTH | GLM_MATERIAL );