Освещение не работает на OpenGL — сплошной цвет

Освещение не работает, объект отображается сплошным цветом. Сам цвет меняется в зависимости от параметров материала или освещения, но без тени или чего-либо, кроме сплошного серого.

Вот часть кода:

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();
}

Я не знаю, что мне не хватает, нормали выглядят хорошо, когда отображаются вместе с объектом.

1

Решение

Вы используете тусклый свет на сером объекте. Очевидно, результат серый.

Если вы имеете в виду, что лица с плоским оттенком, это из-за glShadeModel(GL_FLAT);, Измените это на GL_SMOOTH включить интерполяцию.

Если объект находится в 3D, я думаю, что тот факт, что вы проходите только 3 поплавка в качестве позиции, может иметь значение; значение по умолчанию [0,0,1,0]и функция ожидает четыре числа с плавающей запятой (4-й является координатой W, которая в большинстве случаев должна быть равна 1 или 0 для источников света на бесконечном расстоянии).

Также дважды проверьте, что данные, которые вы даете glVertex а также glNormal верно. При рендеринге сферы в 0,0,0 нормаль каждой вершины является нормализованной позицией такой вершины (очевидно, она сохраняется только для сфер).


В качестве примечания: этот код явно устарел, и в качестве отказа от ответственности я бы отказался от всего этого, если вы только учитесь, и переключился бы на что-то относительно современное и использующее программируемый конвейер.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]