Мне нужно переместить источник света вместе с самим объектом
Почему источник света движется вместе с объектом?
Если свет является точечным источником света в мире, и объект движется, то освещение объекта изменяется (в «реальном» мире).
В вашем случае, Освещение рассчитывается в пространстве зрения. Если источником света является точка в мире, то вам нужно преобразовать положение с помощью матрицы вида (матрица вида преобразуется из мирового пространства в пространство просмотра). Например:
uniform mat4 u_viewMatrix;
void main()
{
// [...]
vec3 lightPosView = vec3(u_viewMatrix * vec4(u_lightPosition.xyz, 1.0));
vec3 lightVector = normalize(u_lightPosition - modelViewVertex);
// [...]
}
В любом случае, если объект перемещается и источник света каким-либо образом привязан к объекту, необходимо применить преобразования, которые применяются к вершинам объекта, к источник света тоже.
В этом случае u_lightPosition
должна быть позицией в пространстве модели объекта, то есть она относительно объекта (u_lightModelPosition
). Тогда вы можете сделать:
uniform vec3 u_lightModelPosition;
void main()
{
mat3 normalMat = inverse(transpose(mat3(u_mvMatrix)));
vec3 modelViewNormal = normalMat * a_normal;
vec3 modelViewVertex = vec3(u_mvMatrix * a_position);
vec3 modelViewLight = vec3(u_mvMatrix * vec4(u_lightModelPosition, 1.0));
vec3 lightVector = normalize(modelViewLight - modelViewVertex);
// [...]
}
Если вы хотите источник света, который не зависит от позиции, вы должны использовать направленный источник света. В этом случае источник света - это не точка в мире, а только направление. Например:
vec3 lightVector = -u_lightRayDirection;
u_lightRayDirection
должно быть в пространстве легких расчетов. Поскольку освещение вычисляется в пространстве обзора, u_lightRayDirection
также должно быть направлением в пространстве обзора. Если u_lightRayDirection
является вектором в мировом пространстве, то его необходимо преобразовать в mat3(u_viewMatrix)
.
Направленный источник света не имеет расстояния (или постоянного расстояния).
Если источник света Источник привязан к камере, никакие преобразования не требуются вообще (потому что вы вычисляете свет в пространстве обзора).