Я думаю, что здесь может быть некоторая путаница между различными пространствами. Как написано, похоже, ваш код будет работать, только если gl_ModelViewMatrix
для земли содержит только преобразования камеры. Это потому, что ftransform
в основном идет
gl_Position = gl_ProjectionMatrix * (gl_ModelViewMatrix * gl_Vertex)
это означает, что gl_Vertex
указано в координатах объекта. Однако, как правило, матрица вида карты освещения от мировых координат к пространству обзора источника света, так что этот код будет работать, только если объектное пространство = мировое пространство. Итак, в основном, скажем, вы масштабируете местность, ну тогда пространство объектов больше не равно мировому пространству. Из-за этого вам нужно разделить gl_ModelViewMatrix
на две части: матрицу вида камеры и преобразование моделирования (например, объект -> мировое пространство)
Я не проверял этот код, но я бы попробовал что-то вроде этого:
uniform mat4 lightView, lightProjection;
uniform mat4 camView, camProj, modelTrans;
const mat4 biasMatrix = mat4( 0.5, 0.0, 0.0, 0.0,
0.0, 0.5, 0.0, 0.0,
0.0, 0.0, 0.5, 0.0,
0.5, 0.5, 0.5, 1.0); //bias from [-1, 1] to [0, 1]
void main()
{
mat4 modelViewProjMatrix = camProj * camView * modelTrans;
gl_Position = modelViewProjMatrix * gl_Vertex;
mat4 shadowMatrix = biasMatrix * lightProjection * lightView * modelTrans;
shadowTexCoord = shadowMatrix * gl_Vertex;
}
Технически это быстрее умножать матрицы на процессоре и передавать только те, которые вам нужны, но для того, чтобы что-то работало, иногда так проще сделать.