В нашем проекте на 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;
}
››