Проблемы с координатами текстуры модели opengl

У меня есть программа, которую я использую для тестовой загрузки моделей в OpenGL на C. Код для этого довольно прост, если говорить о загрузке модели с помощью Assimp (насколько я понимаю):

const struct aiScene* scene = aiImportFile(objfile, aiProcessPreset_TargetRealtime_Fast);
unsigned int vbo, ibo, tex;

if(scene == NULL)
{
    fprintf(stderr, "Could not load file '%s'\n", objfile);
    return 1;
}
int count = 0, size = 0;
int i, j, k;

for(i = 0; i < scene->mNumMeshes; i ++)
    size += (3 * scene->mMeshes[i]->mNumFaces);

Vertex* vertices = (Vertex*)malloc(size * sizeof(Vertex));
int* indices = (int*)malloc(size * sizeof(int));

for(i = 0; i < scene->mNumMeshes; i ++)
{
    struct aiMesh* mesh = scene->mMeshes[i];
    int meshFaces = mesh->mNumFaces;

    for(j = 0; j < meshFaces; j ++)
    {
        struct aiFace* face = &(mesh->mFaces[j]);
        for(k = 0; k < face->mNumIndices; k ++)
        {
            int index = face->mIndices[k];

            struct aiVector3D pos = mesh->mVertices[index];
            struct aiVector3D uv = mesh->mTextureCoords[0][index];
            struct aiVector3D normal = {.x=1.0f,.y=1.0f,.z=1.0f};

            if(mesh->mNormals != NULL)
                normal = mesh->mNormals[index];

            Vertex _vertex = {.x=pos.x * scale,
                                .y=pos.y * scale,
                                .z=pos.z * scale,
                                .u=uv.x, .v=uv.y,
                                .nx=normal.x * scale,
                                .ny=normal.y * scale,
                                .nz=normal.z * scale};

            vertices[count] = _vertex;
            indices[count] = count;
            count ++;
        }
    }
}
aiReleaseImport(scene);

tex = loadTexture(texfile);
if(tex == 0)
{
    fprintf(stderr, "Could not load file '%s'\n", texfile);
    return 1;
}
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, size * sizeof(Vertex), vertices, GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);

glGenBuffers(1, &ibo);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, size * sizeof(int), indices, GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

Моя функция loadTexture хорошо работает со всеми другими текстурами, которые я использовал, так что я сомневаюсь, что это проблема. А с некоторыми из моих более простых моделей у меня вообще нет проблем. Но когда я пытаюсь загрузить более сложные модели, такие как эта: Quad Shotgun визуализируется в Blender

Координаты текстуры сбиваются, например: Quad Shotgun от первого лица

Кроме того, чтобы убедиться, что это не проблема с неправильной загрузкой файла .mtl, связанного с .obj, я избавился от всего в .mtl, за исключением того места, где он определял файл текстуры, чтобы я мог загрузить его в Blender. Те же результаты. Я изучил Assimp и уверен, что это не проблема с моим циклом рендеринга. Пожалуйста, помогите, я понятия не имею, что еще я пропустил или что может пойти не так с моей программой!


person YourNameHere    schedule 13.01.2017    source источник


Ответы (1)


Немного ошибся с моей стороны, хотя весь код был правильным при загрузке модели и ее данных, я забыл, что предустановка флагов, которую я использовал для загрузки модели в aiImportScene, не включала флаг для переворачивания UV. Другими словами, вместо этого:

const struct aiScene* scene = aiImportFile(objfile, aiProcessPreset_TargetRealtime_Fast);

чтобы импортировать модель, я должен был использовать это:

const struct aiScene* scene = aiImportFile(objfile, aiProcessPreset_TargetRealtime_Fast | aiProcess_FlipUVs);

ключевое отличие в том, что я добавил | aiProcess_FlipUVs в конец флагов. Это исправило некоторые проблемы с текстурированием, которые у меня были со многими моделями, которые я либо экспортировал из Blender, либо нашел в Интернете, и, похоже, это не повредило моделям, которые раньше работали нормально. Надеюсь, этот ответ поможет, если есть другие, у кого была похожая проблема!

person YourNameHere    schedule 14.01.2017