Казалось бы, это просто вопрос использования правильной системы координат.Поскольку в вашем вопросе отсутствует важная информация, мне придется сделать несколько предположений.Прежде всего, исходя из того факта, что у вас есть матрица модели и, очевидно, есть несколько объектов в вашей сцене, я предполагаю, что ваше мировое пространство и пространство объектов в целом не одно и то же.Кроме того, я предполагаю, что ваша матрица model
преобразуется из пространства объектов в мировое пространство, ваша матрица view
преобразуется из мирового пространства в пространство просмотра, а ваша матрица proj
преобразуется из пространства просмотра в пространство отсечения.Я также предполагаю, что ваши атрибуты inPosition
и inNormal
находятся в координатах пространства объектов.
Исходя из всего этого, ваш viewPos
просто берет последний столбец матрицы вида, который будет , а не содержат положение камеры в мировом пространстве.Также не будет последний ряд.Матрица представления трансформируется из мирового пространства в пространство просмотра.Его последний столбец соответствует вектору, указывающему на происхождение мирового пространства, если смотреть с перспективы камеры.Ваши FragPos
и Normal
будут в объектном пространстве.И, исходя из того, что вы сказали в своем вопросе, ваши легкие позиции находятся в мировом пространстве.Итак, в конце концов, вы просто сводите воедино координаты, относящиеся к совершенно разным системам координат.Например:
vec3 lightDir = normalize(Light.lightPos - FragPos);
Здесь вы вычитаете позицию пространства объекта из позиции мирового пространства, что дает совершенно бессмысленный результат.Этот бессмысленный результат затем нормализуется и расставляется точками в направлении пространства объекта
float diff = max(dot(lightDir, normal), 0.0);
Кроме того, даже если viewPos
была позицией камеры мирового пространства, это
vec3 viewDir = normalize(viewPos - FragPos);
все равнобыть бессмысленным, поскольку FragPos
задано в координатах пространства объектов.
Операции над векторами координат имеют смысл, только если все задействованные векторы относятся к одной и той же системе координат.Не имеет большого значения, какую систему координат вы выберете.Но вы должны выбрать один.Убедитесь, что все ваши векторы на самом деле относительно этой системы координат, например, мировое пространство.Если некоторые векторы еще не находятся в этой системе координат, вам придется преобразовать их в эту систему координат.Только после того, как все ваши векторы окажутся в одной и той же системе координат, ваши вычисления затенения будут иметь смысл…
Чтобы получить viewPos
, вы можете взять последний столбец матрицы обратного просмотра (если вы уже имелиэто где-то по какой-то причине), или просто передайте положение камеры в качестве дополнительной униформы.Кроме того, вместо того, чтобы снова и снова умножать матрицу вида модели и проекции, один раз для каждой отдельной вершины, рассмотрите просто передачу комбинированной матрицы проекции модель-вид в шейдер ...
Кроме этого: обратите внимание, что вы будетеСкорее всего, желательно иметь зеркальный компонент, только если поверхность действительно ориентирована на свет.