В настоящее время я сталкиваюсь с проблемой, что мой свет пятна всегда кажется центром моего мира, хотя я дважды проверял вектор направления, который я передаю шейдер.Spot Light, кажется, всегда указывает на центр мира
Точечные огни с одним и тем же кодом (но без ограничения света в зависимости от его разрешенного угла и направления) работают нормально. Так что мой светлый вектор и все, кажется, работают.
Вот картина такого поведения:
На рисунке свет направлен вверх к центру мира, а не справа, где беспилотный сталкивается. Синий точечный свет показывает, что освещение в противном случае работает.
Я расчет моих огней в пространстве вида и передать следующее шейдера:
SpotLightPositionViewSpace[spotLightNum] = Vector3.Transform(l.getPosition(), viewMatrix);
…
SpotLightDirectionViewSpace[spotLightNum] = Vector3.Normalize(Vector3.Transform(l.getLightDirection(), viewMatrix));
SpotLightAngleCos[spotLightNum] = (float)Math.Cos((double)(l.getLightAngleRad()/2f));
В затенении я не зажигать пиксель, если скалярное произведение между направлением света и световым вектором больше, чем косинус максимально допустимого угла света (будет делать это более гладко, как только он работает):
lightDirection = normalize(SpotLightPositionViewSpace[j] - pin.PositionViewSpace.xyz);
if (intensityBasedOnDistance > 0.0
&& (intensity = max(dot(surfaceNormal, lightDirection), 0.0)) > 0.0
&& dot(-lightDirection, SpotLightDirectionViewSpace[j]) > SpotLightAngleCos[j])
{
diffuseColor += float4(SpotLightColor[j] * intensity * intensityBasedOnDistance * SpotLightIntensity[j], 0.0);
}