Одна шейдерная функция, написанная разными способами, дает разные результаты. (Unity 2017) - PullRequest
0 голосов
/ 02 апреля 2020

В нашем проекте на Unity 2017 мы используем нашу собственную функцию PixelSnap вместо UnityPixelSnap.

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

#include "UnityCG.cginc"

float4 _UnityPixelSnap(float4 coord)
{
    //[1]
    return float4(floor((coord.xy * 0.5f + 0.5f ) * _ScreenParams.xy) * (_ScreenParams.zw - 1.0f) * 2.0f - 1.0f, coord.z, coord.w);
    //[2]
    return float4(floor((coord.xy * 0.5f + 0.5f ) * _ScreenParams.xy) / (_ScreenParams.xy) * 2.0f - 1.0f, coord.z, coord.w);
    //[3]
    return float4(floor((coord.xy * 0.5f) * _ScreenParams.xy) / (_ScreenParams.xy) * 2.0f, coord.z, coord.w);
    //[4]
    return float4(round((coord.xy * 0.5f) * _ScreenParams.xy) / (_ScreenParams.xy) * 2.0f, coord.z, coord.w);
}

В следующем примере обычно правая граница экрана должна быть полностью черной.
Случай 1,2 и 3 дает нам вертикальную линию пикселей ( картинка )
Но случай 4 дает нормальные результаты. Если вы попытаетесь построить эти функции, например, в Matlab, для любого _ScreenParams и массива координировать.xy (-1,1) с любым шагом, вы увидите абсолютно одинаковую графику.

И, пожалуйста, обращайтесь не спрашивайте меня, почему мы используем Unity 2017 и используем наш собственный PixelSnap. Я новичок в этом проекте, и мне нужно обнаружить эту проблему.
Спасибо всем!

Вот UnityCG.cgin c Функция UnityPixelSnap для сравнения:

inline float4 UnityPixelSnap (float4 pos)
{
    float2 hpc = _ScreenParams.xy * 0.5f;
#if  SHADER_API_PSSL
// sdk 4.5 splits round into v_floor_f32(x+0.5) ... sdk 5.0 uses v_rndne_f32, for compatabilty we use the 4.5 version
    float2 temp = ((pos.xy / pos.w) * hpc) + float2(0.5f,0.5f);
    float2 pixelPos = float2(__v_floor_f32(temp.x), __v_floor_f32(temp.y));
#else
    float2 pixelPos = round ((pos.xy / pos.w) * hpc);
#endif
    pos.xy = pixelPos / hpc * pos.w;
    return pos;
}

››

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...