Только один материал применяется к нескольким объектам - PullRequest
2 голосов
/ 05 августа 2011

Оказывается, я просто идиот; этот код работает нормально, это просто данные, которые были неверны

N.B. Если какие-либо комментарии или ответы @ datenwolf не имеют смысла, это потому, что я снова начал этот вопрос; это сложно сформулировать.

Я пишу загрузчик объектов OpenGL Wavefont. Я могу загрузить и отобразить модель, а также сделать то же самое для материалов. Проблема, с которой я столкнулся сейчас, заключается в том, что когда я применяю первый материал из массива, это материал, используемый для всех последующих объектов.

Во-первых, у меня есть код рисования моего объекта. Это перебирает вектор векторов (группы граней для формирования групп материалов).

typedef struct
{
    GLfloat Ka[3];
    GLfloat Kd[3];
    GLfloat Ks[3];
    float Ns;               // Specular (coeff)
}
Material;

typedef struct
{
    int v1, v2, v3;
    int vn1, vn2, vn3;
    int vt1, vt2, vt3;
}
Face;

vector<Material> materials;
vector< vector<Face> > faces;

for(int g = 0; g < faces.size(); g++)
{
    // Apply material for this material group
    glMaterialfv(GL_FRONT, GL_AMBIENT, materials[g].Ka);
    glMaterialfv(GL_FRONT, GL_DIFFUSE, materials[g].Kd);
    glMaterialfv(GL_FRONT, GL_SPECULAR, materials[g].Ks);
    glMaterialf(GL_FRONT, GL_SHININESS, materials[g].Ns);

    glBegin(GL_TRIANGLES);

    // Loop through faces
    for(int f = 0; f < faces[g].size(); f++)
    {
        glNormal3f(normals[faces[g][f].vn1 - 1].x, normals[faces[g][f].vn1 - 1].y, normals[faces[g][f].vn1 - 1].z);
        glVertex3f(vertices[faces[g][f].v1 - 1].x, vertices[faces[g][f].v1 - 1].y, vertices[faces[g][f].v1 - 1].z);

        glNormal3f(normals[faces[g][f].vn2 - 1].x, normals[faces[g][f].vn2 - 1].y, normals[faces[g][f].vn2 - 1].z);
        glVertex3f(vertices[faces[g][f].v2 - 1].x, vertices[faces[g][f].v2 - 1].y, vertices[faces[g][f].v2 - 1].z);

        glNormal3f(normals[faces[g][f].vn3 - 1].x, normals[faces[g][f].vn3 - 1].y, normals[faces[g][f].vn3 - 1].z);
        glVertex3f(vertices[faces[g][f].v3 - 1].x, vertices[faces[g][f].v3 - 1].y, vertices[faces[g][f].v3 - 1].z);
    }

    glEnd();
}

Как подсказал @datenwolf, я пробовал все виды вещей с GL_COLOR_MATERIAL вместе с множеством других директив. Я взял некоторый код, который использовал в другом проекте, который работает с точки зрения материалов, поэтому единственная проблема, которую я сейчас вижу, это то, что я использую vector<> для материалов, хотя это не должно иметь значения, не так ли?

Чтобы уточнить, у меня такой вопрос: как мне заставить OpenGL применять несколько материалов на кадр? Должен ли я попробовать VBOs? Я перейду к ним в конце концов, но сейчас все, что мне нужно, - это рабочая реализация.

1 Ответ

1 голос
/ 05 августа 2011

Я предполагаю, что цикл первого фрагмента находится внутри или вызывается model_draw.Но было бы полезно, если бы я знал контекст этого цикла рендеринга (функция, в которой находится цикл рендеринга).

Итак, есть две основные ошибки, не связанные напрямую с рендерингом конкретной модели, а с настройкой преобразования.

Вы вызываете gluLookAt в начале drawScene, но разрешите его применить к любой активной матрице.gluLookAt может использоваться для матрицы modelview .Проекция является чем-то вроде «линзы»;манипулирование проекционной матрицей перемещает объектив, оставляя пленку / датчик на месте.Также вам следует установить проекцию и в функции drawScene.Технически все, что вы делаете в функции «инициализации», на самом деле должно выполняться в начале каждой итерации рендеринга;во время рендеринга вы будете переключать многие из этих состояний несколько раз.

Обычный порядок:

glClearColor
glClearDepth
glClear(...)

glViewport(...)

glMatrixMode(GL_PROJECTION)
glLoadIdentity()
gluProjection OR glFrustum OR glOrtho OR custom_projection

glMatrixMode(GL_MODELVIEW)
glLoadIdentity()
gluLookAt OR custom_camera

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