Освещение не работает, объект отображается сплошным цветом. Сам цвет меняется в зависимости от параметров материала или освещения, но без тени или чего-либо, кроме сплошного серого.
Вот часть кода:
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
glFrontFace(GL_CCW);
glShadeModel(GL_FLAT);
glEnable(GL_LIGHTING);
GLfloat amb[] = {0.6, 0.6, 0.6, 1.0};
GLfloat dif[] = {0.8, 0.8, 0.8, 1.0};
GLfloat spec[] = {0.5, 0.5, 0.5, 1.0};
GLfloat pos[] = {0.0, 0.0, 30.0};
glEnable(GL_LIGHT0);
glLightfv(GL_LIGHT0, GL_AMBIENT, amb);
glLightfv(GL_LIGHT0, GL_DIFFUSE, dif);
glLightfv(GL_LIGHT0, GL_SPECULAR, spec);
glLightfv(GL_LIGHT0, GL_POSITION, pos);GLfloat co[4]={0.5, 0.5, 0.5, 0.5};
GLfloat mat_specular[] = { 1.0, 1.0, 1.0, 1.0 };
GLfloat mat_shininess[] = { 1.0 };
glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, co);
glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, mat_specular);
glMaterialfv(GL_FRONT_AND_BACK, GL_SHININESS, mat_shininess);
for(int i=0; i < numofTr; i++)
{
glBegin(GL_TRIANGLES);
glNormal3f(tr[i].v1->n.x, tr[i].v1->n.y, tr[i].v1->n.z);
glVertex3f(tr[i].v1->x, tr[i].v1->y, tr[i].v1->z);
glNormal3f(tr[i].v2->n.x, tr[i].v2->n.y, tr[i].v2->n.z);
glVertex3f(tr[i].v2->x, tr[i].v2->y, tr[i].v2->z);
glNormal3f(tr[i].v3->n.x, tr[i].v3->n.y, tr[i].v3->n.z);
glVertex3f(tr[i].v3->x, tr[i].v3->y, tr[i].v3->z);
glEnd();
}
Я не знаю, что мне не хватает, нормали выглядят хорошо, когда отображаются вместе с объектом.
Вы используете тусклый свет на сером объекте. Очевидно, результат серый.
Если вы имеете в виду, что лица с плоским оттенком, это из-за glShadeModel(GL_FLAT);
, Измените это на GL_SMOOTH
включить интерполяцию.
Если объект находится в 3D, я думаю, что тот факт, что вы проходите только 3 поплавка в качестве позиции, может иметь значение; значение по умолчанию [0,0,1,0]
и функция ожидает четыре числа с плавающей запятой (4-й является координатой W, которая в большинстве случаев должна быть равна 1 или 0 для источников света на бесконечном расстоянии).
Также дважды проверьте, что данные, которые вы даете glVertex
а также glNormal
верно. При рендеринге сферы в 0,0,0 нормаль каждой вершины является нормализованной позицией такой вершины (очевидно, она сохраняется только для сфер).
В качестве примечания: этот код явно устарел, и в качестве отказа от ответственности я бы отказался от всего этого, если вы только учитесь, и переключился бы на что-то относительно современное и использующее программируемый конвейер.
Других решений пока нет …