OpenGL - Как использовать файл MTL для отображения текстур в объект, используя GLM или любой другой загрузчик - PullRequest
1 голос
/ 26 декабря 2011

Я пытаюсь отобразить изображение 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;
    }
}

Когда я отлаживаю ошибку, я получаю:

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

1 Ответ

1 голос
/ 29 декабря 2011

GLM не поддерживает текстуры, которые являются изображениями.Существует расширенная версия GLM, которая работает, но она не очень распространена, и хотя она не зависит от платформы, ей нужно много работы для правильной работы с окнами, поскольку она изначально была разработана для Linux.

ссылка .

Это оригинальный GLM Нейта Робина с несколькими твиками, упомянутыми в предоставленной ссылке.Я считаю, что его легче понять, но в нем больше функций, предупреждений и тому подобного.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...