2016-05-01 8 views
1

В настоящее время я сталкиваюсь с проблемой, что мой свет пятна всегда кажется центром моего мира, хотя я дважды проверял вектор направления, который я передаю шейдер.Spot Light, кажется, всегда указывает на центр мира

Точечные огни с одним и тем же кодом (но без ограничения света в зависимости от его разрешенного угла и направления) работают нормально. Так что мой светлый вектор и все, кажется, работают.

Вот картина такого поведения:

enter image description here

На рисунке свет направлен вверх к центру мира, а не справа, где беспилотный сталкивается. Синий точечный свет показывает, что освещение в противном случае работает.

Я расчет моих огней в пространстве вида и передать следующее шейдера:

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); 
} 

ответ

0

После попытки в течение нескольких часов изменения

SpotLightDirectionViewSpace[spotLightNum] = Vector3.Normalize(Vector3.Transform(l.getLightDirection(), viewMatrix)); 

в

SpotLightDirectionViewSpace[spotLightNum] = Vector3.Normalize(Vector3.Transform(l.getForward(), viewMatrix.Rotation)); 

не решил его ... не знаю, почему, но он работает в настоящее время.

Если бы кто-нибудь мог это объяснить, я был бы очень благодарен.