Зеркальное освещение прерывается в начале координат (0, 0, 0)
У меня возникли проблемы, чтобы заставить зеркальное освещение работать. Похоже, в моем приложении есть какая-то ошибка, которую я не могу отследить.
Свет идет спереди (на снимках экрана видно, что камера смотрит в направлении -z, слева - -x).
Простой зеркальный вывод показывает следующую ошибку:
Используемый код:
float3 n = normalize(input.normal); // world space normal, mul(float4(normal, 0.0), modelMatrix)
float3 l = normalize(-sDirection); // constant direction (like 0.7, -0.8, -0.7)
float3 v = normalize(viewPos.xyz - input.vertexWorldSpace.xyz); // viewpos = world space camera position
float3 LightReflect = normalize(reflect(n,l));
float SpecularFactor = dot(v, LightReflect);
color = float4(SpecularFactor, SpecularFactor, SpecularFactor, 1.0);
Чтобы проверить возможные ошибки переменных, я проверил input.VertexWorldSpace:
чтобы также проверить направление света и нормальное, я проверил диффузный термин:
и вектор просмотра камеры с вершины (v):
Для меня все части выглядят хорошо, но зеркально по-прежнему становится черным в начале координат (0,0,0) и перпендикулярно направлению света.
Я также сделал gif, показывающий, что происходит с вектором направления обзора в начале координат (0, 0, 0)
И еще один рисунок, показывающий положение камеры и то, где зеркальное отражение становится черным: https://i.imgur.com/ajUaekA.gifv
Я использую неправильный расчет для V?
1 ответ
Хорошо, проблема была с моим выравниванием буфера: https://msdn.microsoft.com/en-us/library/windows/desktop/bb509632(v=vs.85).aspx
Вместо прохождения
Matrix
Matrix
Vec3
Vec3
HLSL хочет 16 байтов векторов выравнивания, поэтому я должен был использовать
Matrix
Vec3
float1 // 16 byte alignment
Vec3
float1 // 16 byte alignment