0

在我们的 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 和数组 coord.xy (-1,1),您将看到完全相同的图形。

请不要问我为什么使用 Unity 2017 并使用我们自己的 PixelSnap。我是这个项目的新手,我需要发现这个问题。
谢谢大家!

这是 UnityCG.cginc 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;
}

››</p>

4

0 回答 0