Вам нужно будет предоставить нормали для каждой поверхности.То, что происходит (без нормалей), это то, что направленный свет по существу светит на все к востоку от нуля, позиционно, в то время как все, что там есть, имеет норму 0,0,1 (обращено на запад.)
Вам не нужнонасколько я могу судить, чтобы посылать нормали с каждой вершиной, но, поскольку GL является конечным автоматом, вы должны быть уверены, что при каждом изменении нормали вы меняете его.Поэтому, если вы визуализируете грань на кубе, у «западной» грани должен быть один вызов
glNormal3i(0,0,1);
glTexCoord..
glVertex3f...
glTexCoord..
etc.
В случае выровненных по xyz прямоугольных призм достаточно «целых чисел».Для лиц, которые не обращены к одному из шести основных направлений, вам необходимо их нормализовать.По моему опыту, вам нужно только нормализовать первые три точки, если квад не является плоским.Это делается путем нахождения нормали треугольника, образованного первыми тремя сторонами в квадре.
Есть несколько простых указаний на «Расчет нормалей», которые я нахожу просветляющими.
Вторая часть этого заключается в том, что, поскольку это направленный источник света (W = 0), его положение меняется напозиция игрока не имеет смысла.Если только свет не излучается из-за камеры, и вы не вращаете перед собой объект (например, модель), который вы хотите всегда освещать спереди, его положение должно быть примерно таким:
float[] PositionLight = new float[4] { 0.0f, 0.0f, 1.0f, 0.0f };
Или, если направление GLx интерпретируется как направление восток-запад (т. Е. Вы изначально ориентированы на север / юг)
float[] PositionLight = new float[4] { 1.0f, 0.0f, 0.0f, 0.0f };
Концепция заключается в том, что вы рассчитываете свет на поверхности, иесли свет не движется, а сама сцена не движется (только камера движется вокруг сцены), вычисление направления всегда будет правильным.При условии, что нормали точны, GL может определить интенсивность света, показываемого на конкретном лице.
Последнее, что нужно сделать, это то, что GL не будет автоматически обрабатывать тени для вас.Базового GL_Light достаточно для управляемого освещения серии выпуклых форм, поэтому вам придется выяснить, следует ли применять свет (например, солнце) к лицу.В некоторых случаях это просто получение твердого тела, которому принадлежит лицо, и определение, пересекается ли вектор солнечного света с другим телом, прежде чем достигнуть «неба».
Ищите материал на картах света, а также карты теней для этого,