Unity shader (hlsl) эквивалент Vector3.ProjectOnPlane - PullRequest
0 голосов
/ 15 сентября 2018

В шейдере для Unity (hlsl) я ищу способ проецирования вектора (float3 или float4) на плоскость с учетом нормального направления плоскости. Что мне нужно, это что-то эквивалентное функции Unity Vector3.ProjectOnPlane: https://docs.unity3d.com/ScriptReference/Vector3.ProjectOnPlane.html

1 Ответ

0 голосов
/ 24 сентября 2018

Если нормализован вектор вашей плоскости:

inline float3 projectOnPlane( float3 vec, float3 normal )
{
    return vec - normal * dot( vec, normal );
}

Если это не так:

inline float3 projectOnPlane( float3 vec, float3 normal )
{
    return vec - normal * ( dot( vec, normal ) / dot( normal, normal ) );
}

Та же формула, в зависимости от модели графического процессора и версии драйвера, может быть быстрее или медленнее:

inline float3 projectOnPlane( float3 v, float3 n )
{
    float3 r;
    r.x = n.y * n.y * v.x + n.z * n.z * v.x - n.x * n.y * v.y - n.x * n.z * v.z;
    r.y = n.x * n.x * v.y - n.x * n.y * v.x - n.y * n.z * v.z + n.z * n.z * v.y;
    r.z = n.x * n.x * v.z - n.x * n.z * v.x + n.y * n.y * v.z - n.y * n.z * v.y;
    return r / dot(n, n);
}
...