Зеркальное освещение прерывается в начале координат (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://imgur.com/2YlqcGP

И еще один рисунок, показывающий положение камеры и то, где зеркальное отражение становится черным: 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
Другие вопросы по тегам